"""
Double Chance market discovery + verification tool.

For each scraper:
  - Runs get_events('football') and counts DC events
  - For scrapers returning 0 DC, shows a raw API sample to identify the correct ID

Scrapers that use live Playwright (Betpawa, Stake) are skipped in the API probe
since they're slow — their DC count from get_events() is sufficient signal.
"""
import json
import sys
import os
import time

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

# ── Phase 1: count DC events per scraper ──────────────────────────────────────

def count_dc(name, scraper):
    try:
        events = scraper.get_events('football')
        dc = [e for e in events if e.market == 'Double Chance']
        total = len(events)
        print(f'  {name:12s}: {len(dc):4d} DC / {total:4d} total events')
        return dc
    except Exception as ex:
        print(f'  {name:12s}: ERROR — {ex}')
        return []

print('=' * 55)
print('PHASE 1: DC event counts per scraper')
print('=' * 55)

from scrapers.sportybet  import SportyBetScraper
from scrapers.msport     import MSportScraper
from scrapers.bcgame     import BCGameScraper
from scrapers.oneXbet    import OneXBetScraper
from scrapers.betwinner  import BetWinnerScraper
from scrapers.betking    import BetKingScraper
from scrapers.nairabet   import NairaBetScraper
from scrapers.betway     import BetwayScraper
from scrapers.onewin     import OneWinScraper
from scrapers.bet9ja     import Bet9jaScraper

scrapers = [
    ('SportyBet',  SportyBetScraper()),
    ('MSport',     MSportScraper()),
    ('BCGame',     BCGameScraper()),
    ('1xBet',      OneXBetScraper()),
    ('BetWinner',  BetWinnerScraper()),
    ('BetKing',    BetKingScraper()),
    ('NairaBet',   NairaBetScraper()),
    ('Betway',     BetwayScraper()),
    ('1win',       OneWinScraper()),
    ('Bet9ja',     Bet9jaScraper()),
]

results = {}
for name, sc in scrapers:
    results[name] = count_dc(name, sc)

# Show a sample DC event from any scraper that found some
print()
for name, dc_events in results.items():
    if dc_events:
        ev = dc_events[0]
        print(f'  Sample DC from {name}: {ev.home_team} vs {ev.away_team}')
        for o in ev.outcomes:
            print(f'    {o.name}: {o.odds}')
        break

# ── Phase 2: API probe for scrapers with 0 DC ─────────────────────────────────

zero_dc = [name for name, evs in results.items() if not evs]
if not zero_dc:
    print('\nAll scrapers returned DC events — no probing needed.')
    sys.exit(0)

print(f'\n{"=" * 55}')
print(f'PHASE 2: API probe for zero-DC scrapers: {zero_dc}')
print(f'{"=" * 55}')


# ── BetKing probe ─────────────────────────────────────────────────────────────
if 'BetKing' in zero_dc:
    print('\n--- BetKing: scanning OddsCollection for DC-like markets ---')
    import requests
    try:
        r = requests.get(
            'https://sportsapicdn-desktop.betking.com/api/feeds/prematch/mostpopularsports/en/1/7/50/',
            headers={'User-Agent': 'Mozilla/5.0', 'Accept': 'application/json'},
            timeout=20,
        )
        data = r.json()
        items = data[0]['AreaMatches'][0]['Items']
        seen = {}
        for item in items[:10]:
            for oc in item.get('OddsCollection', []):
                ot = oc.get('OddsType', {})
                tid = ot.get('OddsTypeID')
                tname = ot.get('OddsTypeName', '') or ot.get('Name', '')
                if tid not in seen:
                    sample = oc.get('MatchOdds', [])[:3]
                    odd_names = [mo.get('OddAttribute', {}).get('OddName') for mo in sample]
                    seen[tid] = {'name': tname, 'odd_names': odd_names}
        print('  All OddsTypeIDs seen (first 10 events):')
        for tid, info in sorted(seen.items(), key=lambda x: x[0] or 0):
            print(f'    TypeID={tid:5}  name={info["name"]!r:35s}  odds={info["odd_names"]}')
        # Highlight DC candidates
        dc_candidates = {tid: info for tid, info in seen.items()
                         if any(w in (info['name'] or '').lower()
                                for w in ('double', 'chance', 'dc', '1x', 'x2'))}
        if dc_candidates:
            print(f'\n  DC candidates: {json.dumps(dc_candidates, indent=4)}')
        else:
            print('\n  No DC-like market names found — check odd_names column above.')
    except Exception as ex:
        print(f'  Error: {ex}')


# ── NairaBet probe ────────────────────────────────────────────────────────────
if 'NairaBet' in zero_dc:
    print('\n--- NairaBet: scanning market typeIds for DC ---')
    import requests
    try:
        url = ('https://sb2frontend-altenar2.biahosted.com/api/Widget/GetEvents'
               '?culture=en-GB&timezoneOffset=300&integration=nairabet'
               '&deviceType=1&numFormat=en-GB&countryCode=NG&sportId=66&count=20')
        r = requests.get(url, headers={'User-Agent': 'Mozilla/5.0', 'Origin': 'https://www.nairabet.com'}, timeout=20)
        data = r.json()
        markets_by_type = {}
        for m in data.get('markets', []):
            tid = m.get('typeId')
            if tid not in markets_by_type:
                # Grab sample odd names
                ev = next((e for e in data.get('events', []) if tid in e.get('marketIds', [])), {})
                sample_odds = []
                for oid in m.get('oddIds', [])[:5]:
                    odd = next((o for o in data.get('odds', []) if o.get('id') == oid), {})
                    sample_odds.append({'typeId': odd.get('typeId'), 'name': odd.get('name')})
                markets_by_type[tid] = {'typeId': tid, 'sample_odds': sample_odds}
        print('  All market typeIds seen:')
        for tid, info in sorted(markets_by_type.items(), key=lambda x: x[0] or 0):
            names = [o.get('name') for o in info['sample_odds']]
            print(f'    typeId={tid:5}  sample odd names={names}')
        dc_candidates = {tid: info for tid, info in markets_by_type.items()
                         if any(n and any(w in n.lower() for w in ('1x', 'x2', '12', 'double', 'chance'))
                                for n in [o.get('name', '') for o in info['sample_odds']])}
        if dc_candidates:
            print(f'\n  DC candidates: {json.dumps(dc_candidates, indent=4)}')
        else:
            print('\n  No DC-like market names found — check names above.')
    except Exception as ex:
        print(f'  Error: {ex}')


# ── 1xBet probe ───────────────────────────────────────────────────────────────
if '1xBet' in zero_dc:
    print('\n--- 1xBet: scanning G-groups in E[] for DC (3 outcomes, no P specifier) ---')
    import requests
    try:
        r = requests.get(
            'https://1xbet.ng/service-api/LineFeed/Get1x2_VZip',
            params={'sports': '1', 'count': '10', 'lng': 'en', 'mode': '4',
                    'country': '132', 'partner': '159', 'getEmpty': 'true'},
            headers={'User-Agent': 'Mozilla/5.0', 'Accept': 'application/json',
                     'Referer': 'https://1xbet.ng/en/line/football'},
            timeout=15,
        )
        events = r.json().get('Value', [])
        g_info = {}
        for ev in events[:5]:
            for entry in ev.get('E', []):
                g = entry.get('G')
                t = entry.get('T')
                p = entry.get('P')
                if g not in g_info:
                    g_info[g] = {'t_vals': set(), 'has_p': False}
                g_info[g]['t_vals'].add(t)
                if p is not None:
                    g_info[g]['has_p'] = True
        print('  G-groups (first 5 events):')
        for g, info in sorted(g_info.items(), key=lambda x: x[0] or 0):
            t_sorted = sorted(info['t_vals'])
            flag = ' ← DC candidate (3 outcomes, no P)' if len(t_sorted) == 3 and not info['has_p'] else ''
            flag2 = ' ← DC candidate (no P)' if len(t_sorted) not in (2, 3) and not info['has_p'] else ''
            print(f'    G={g:5}  T-vals={t_sorted}  has_P={info["has_p"]}{flag}{flag2}')
    except Exception as ex:
        print(f'  Error: {ex}')


# ── BetWinner probe (same API as 1xBet) ───────────────────────────────────────
if 'BetWinner' in zero_dc:
    print('\n--- BetWinner: scanning G-groups ---')
    import requests
    try:
        r = requests.get(
            'https://betwinner.ng/service-api/LineFeed/Get1x2_VZip',
            params={'sports': '1', 'count': '10', 'lng': 'en', 'mode': '4',
                    'country': '132', 'partner': '3', 'getEmpty': 'true'},
            headers={'User-Agent': 'Mozilla/5.0', 'Accept': 'application/json',
                     'Referer': 'https://betwinner.ng/en/line/football'},
            timeout=15,
        )
        events = r.json().get('Value', [])
        g_info = {}
        for ev in events[:5]:
            for entry in ev.get('E', []):
                g = entry.get('G')
                t = entry.get('T')
                p = entry.get('P')
                if g not in g_info:
                    g_info[g] = {'t_vals': set(), 'has_p': False}
                g_info[g]['t_vals'].add(t)
                if p is not None:
                    g_info[g]['has_p'] = True
        print('  G-groups (first 5 events):')
        for g, info in sorted(g_info.items(), key=lambda x: x[0] or 0):
            t_sorted = sorted(info['t_vals'])
            flag = ' ← DC candidate (3 outcomes, no P)' if len(t_sorted) == 3 and not info['has_p'] else ''
            print(f'    G={g:5}  T-vals={t_sorted}  has_P={info["has_p"]}{flag}')
    except Exception as ex:
        print(f'  Error: {ex}')


# ── Bet9ja probe ──────────────────────────────────────────────────────────────
if 'Bet9ja' in zero_dc:
    print('\n--- Bet9ja: scanning odds dict keys for DC pattern ---')
    import requests
    session = requests.Session()
    session.headers.update({'Referer': 'https://sports.bet9ja.com/', 'X-Requested-With': 'XMLHttpRequest'})
    try:
        # Seed cookie
        session.get('https://sports.bet9ja.com/', timeout=15)
        # Get one football event ID
        r = session.get('https://sports.bet9ja.com/desktop/feapi/PalimpsestAjax/GetSports?DISP=1000', timeout=15)
        pal = r.json().get('D', {}).get('PAL', {})
        sport = pal.get('1', {})
        eid = None
        for sg in sport.get('SG', {}).values():
            for grp in sg.get('G', {}).values():
                for e_id in list(grp.get('E', {}).keys())[:1]:
                    eid = e_id
                    break
                if eid:
                    break
            if eid:
                break
        if eid:
            r2 = session.get(f'https://sports.bet9ja.com/desktop/feapi/PalimpsestAjax/GetEvent',
                             params={'EVENTID': eid}, timeout=10)
            odds = r2.json().get('D', {}).get('O', {})
            if isinstance(odds, dict):
                keys = sorted(odds.keys())
                print(f'  Event {eid} odds keys ({len(keys)} total):')
                # Group by prefix
                prefixes = {}
                for k in keys:
                    pfx = k.rsplit('_', 1)[0] if '_' in k else k
                    prefixes.setdefault(pfx, []).append(k)
                for pfx, ks in sorted(prefixes.items()):
                    dc_flag = ' ← DC?' if any(w in pfx.lower() for w in ('dc', 'double', 'chance')) else ''
                    print(f'    {pfx}: {ks}{dc_flag}')
            else:
                print(f'  Odds dict not a dict: {type(odds)}')
        else:
            print('  Could not find any football event ID')
    except Exception as ex:
        print(f'  Error: {ex}')


# ── NairaBet: also show odd.name for typeId=2 specifically ───────────────────
if 'NairaBet' in zero_dc:
    pass  # covered above


print('\nDone.')
