#!/usr/bin/env python3
from __future__ import annotations
import argparse, os, sqlite3
import requests
from discover import web_search_ddg, host_domain, upsert_indirect_offer, provider_available, UA
from search_evidence import evaluate_search_result
from matching import product_query
from dbutil import log_event, setting_bool

DB=os.environ.get('FIYAT_RADAR_DB','/var/lib/fiyat-radar/fiyat-radar.sqlite')

def connect():
    c=sqlite3.connect(DB,timeout=30);c.row_factory=sqlite3.Row;c.execute('PRAGMA foreign_keys=ON');c.execute('PRAGMA busy_timeout=30000');c.execute('PRAGMA synchronous=NORMAL');return c

def run(limit=30):
    c=connect();c.execute("UPDATE indirect_offers SET active=0 WHERE expires_at IS NOT NULL AND expires_at<CURRENT_TIMESTAMP");c.commit()
    env_disabled=os.environ.get('FIYAT_RADAR_EXTERNAL_SEARCH_DISABLED','1').strip().lower() not in ('0','false','no','off')
    if env_disabled or setting_bool(c,'external_search_disabled',True):
        log_event(c,'indirect.refresh','info','Harici arama motorları devre dışı; dolaylı indeks servisi ağ isteği yapmadan tamamlandı',run_type='indirect-refresh',details={'external_search_disabled':True},commit=True)
        c.close();print('İndeks yenileme: harici arama devre dışı, ağ isteği yapılmadı');return
    # Sadece önceden product_source olmuş hatalı URL'leri değil, henüz kaynak eklenememiş
    # ürün x bilinen-mağaza çiftlerini de kontrol et. Böylece discovery 403'te kaynak oluşturamadıysa
    # indirect-refresh'in '0 kontrol' demesi engellenir.
    rows=c.execute('''WITH targets AS (
        SELECT p.id product_id,p.name product_name,p.name,p.brand,p.model,p.variant,p.condition_type,p.capacity_gb,p.color,p.ean,m.domain,
               0 AS tier, MAX(COALESCE(s.consecutive_failures,0)) AS fail_score
          FROM product_sources s JOIN products p ON p.id=s.product_id JOIN merchants m ON m.id=s.merchant_id
         WHERE p.active=1 AND s.active=1 AND (s.last_status='error' OR s.consecutive_failures>0)
         GROUP BY p.id,m.domain
        UNION ALL
        SELECT p.id,p.name,p.name,p.brand,p.model,p.variant,p.condition_type,p.capacity_gb,p.color,p.ean,m.domain,
               1 AS tier, 0 AS fail_score
          FROM products p CROSS JOIN merchants m
         WHERE p.active=1 AND m.active=1 AND m.discovery_active=1
           AND NOT EXISTS (SELECT 1 FROM product_sources s WHERE s.product_id=p.id AND s.merchant_id=m.id AND s.active=1)
    )
    SELECT DISTINCT product_id,product_name,name,brand,model,variant,condition_type,capacity_gb,color,ean,domain
      FROM targets
     ORDER BY tier ASC,fail_score DESC,product_id DESC
     LIMIT ?''',(limit,)).fetchall()
    session=requests.Session();session.headers.update({'User-Agent':UA,'Accept-Language':'tr-TR,tr;q=0.9,en;q=0.6'})
    ok=miss=err=0
    for row in rows:
        if not provider_available(c,'duckduckgo'):
            # v0.3.16: Dolaylı indeks yenileme yardımcı bir kanaldır. DDG yoksa fiyat/
            # kaynak motorunu bloke etmeden bu turu atlarız. Brave hiçbir koşulda çağrılmaz.
            log_event(c,'indirect.refresh','info','Yardımcı HTML araması kullanılamıyor; dolaylı indeks turu kritik akışı bloklamadan sonlandırıldı',run_type='indirect-refresh',details={'remaining':len(rows)-(ok+miss+err),'brave_disabled':True},commit=True)
            break
        product=dict(row);domain=row['domain'];query=f"site:{domain} {product_query(product,include_price_word=True)}"
        try:
            engine='duckduckgo'
            results=web_search_ddg(session,query,8,c=c,product_id=row['product_id'])
            if not results:
                miss+=1
                log_event(c,'indirect.refresh','info','Yardımcı HTML araması sonuç vermedi; ana discovery/sitemap kaynakları bağımsız çalışmaya devam eder',run_type='indirect-refresh',product_id=row['product_id'],details={'domain':domain,'brave_disabled':True})
                continue
            found=False
            for result in results:
                if host_domain(result.get('url') or '')!=host_domain('https://'+domain):continue
                ev=evaluate_search_result(product,result)
                if not ev:continue
                upsert_indirect_offer(c,product,result,ev,engine,None);ok+=1;found=True;break
            if not found:miss+=1
        except Exception as e:
            err+=1;log_event(c,'indirect.refresh','error',str(e),run_type='indirect-refresh',product_id=row['product_id'],details={'domain':domain,'query':query},commit=True)
    log_event(c,'indirect.refresh','info','Engelli kaynak indeks yenilemesi tamamlandı',run_type='indirect-refresh',details={'checked':len(rows),'saved':ok,'miss':miss,'error':err},commit=True);c.close()
    print(f'İndeks yenileme: {len(rows)} kontrol, {ok} fiyat sinyali, {miss} boş, {err} hata')

if __name__=='__main__':
    ap=argparse.ArgumentParser();ap.add_argument('--limit',type=int,default=30);a=ap.parse_args();run(a.limit)
