#!/usr/bin/env python3
import os, sqlite3
from dbutil import log_event
from matching import model_identity_conflict
from condition import assess_condition

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')
    return c

def _condition_state(product,text,url=''):
    return assess_condition(product,text or '',url or '','',require_known=True)

def run():
    c=connect()
    disabled=0; rejected=0; indirect=0; verified=0; pending=0; condition_bad=0
    rows=c.execute('''SELECT ps.id source_id,ps.product_id,ps.url,ps.last_title,
                             p.name,p.brand,p.model,p.variant,p.condition_type,p.capacity_gb,p.color
                      FROM product_sources ps JOIN products p ON p.id=ps.product_id
                      WHERE ps.active=1''').fetchall()
    for r in rows:
        product=dict(r);evidence=' '.join(x for x in (r['last_title'] or '',r['url'] or '') if x)
        reason=model_identity_conflict(product,evidence)
        if reason:
            c.execute("UPDATE product_sources SET active=0,last_price=NULL,last_total_price=NULL,last_status='invalid_model',last_error=? WHERE id=?",(reason,r['source_id']))
            c.execute("UPDATE source_offers SET active=0 WHERE source_id=?",(r['source_id'],));c.execute("DELETE FROM price_observations WHERE source_id=?",(r['source_id'],))
            c.execute("UPDATE discovery_candidates SET status='rejected',reviewed_at=CURRENT_TIMESTAMP WHERE product_id=? AND url=?",(r['product_id'],r['url']))
            log_event(c,'source.revalidate','warning','Kardeş modele ait hatalı kaynak otomatik devre dışı bırakıldı',run_type='maintenance',product_id=r['product_id'],source_id=r['source_id'],details={'url':r['url'],'reason':reason});disabled+=1;continue
        ca=_condition_state(product,evidence,r['url'])
        if ca.status=='verified':
            c.execute("UPDATE product_sources SET expected_condition=?,detected_condition=?,condition_confidence=?,condition_evidence=?,condition_status='verified' WHERE id=?",(ca.expected,ca.detected,ca.confidence,ca.evidence,r['source_id']));verified+=1
        elif ca.status in ('mismatch','conflict'):
            c.execute("UPDATE product_sources SET active=0,last_price=NULL,last_total_price=NULL,last_status='invalid_condition',last_error=?,expected_condition=?,detected_condition=?,condition_confidence=?,condition_evidence=?,condition_status=? WHERE id=?",(f'Ürün durumu {ca.status}: {ca.evidence}',ca.expected,ca.detected,ca.confidence,ca.evidence,ca.status,r['source_id']))
            c.execute('UPDATE source_offers SET active=0 WHERE source_id=?',(r['source_id'],));c.execute('DELETE FROM price_observations WHERE source_id=?',(r['source_id'],))
            c.execute("UPDATE discovery_candidates SET status='rejected',condition_status=?,reviewed_at=CURRENT_TIMESTAMP WHERE product_id=? AND url=?",(ca.status,r['product_id'],r['url']))
            log_event(c,'source.condition-revalidate','warning','Ürün durumuyla uyuşmayan kaynak kapatıldı',run_type='maintenance',product_id=r['product_id'],source_id=r['source_id'],details={'expected':ca.expected,'detected':ca.detected,'evidence':ca.evidence,'url':r['url']});condition_bad+=1
        else:
            c.execute("UPDATE product_sources SET expected_condition=?,detected_condition=NULL,condition_confidence=NULL,condition_evidence=NULL,condition_status='pending',last_price=NULL,last_total_price=NULL,last_status='condition_pending',last_error='Ürün durumu taze sayfa kontrolü bekliyor',next_check_at=CURRENT_TIMESTAMP WHERE id=?",(ca.expected,r['source_id']))
            c.execute('UPDATE source_offers SET active=0 WHERE source_id=?',(r['source_id'],));pending+=1

    rows=c.execute('''SELECT dc.id,dc.product_id,dc.url,dc.title,p.name,p.brand,p.model,p.variant,p.condition_type,p.capacity_gb,p.color
                      FROM discovery_candidates dc JOIN products p ON p.id=dc.product_id
                      WHERE dc.status IN ('pending','auto_approved','approved')''').fetchall()
    for r in rows:
        product=dict(r);text=' '.join(x for x in (r['title'] or '',r['url'] or '') if x)
        reason=model_identity_conflict(product,text)
        if reason:
            c.execute("UPDATE discovery_candidates SET status='rejected',condition_status='pending',reviewed_at=CURRENT_TIMESTAMP WHERE id=?",(r['id'],));rejected+=1;continue
        ca=_condition_state(product,text,r['url'])
        if ca.status=='verified':
            c.execute("UPDATE discovery_candidates SET detected_condition=?,condition_confidence=?,condition_evidence=?,condition_status='verified' WHERE id=?",(ca.detected,ca.confidence,ca.evidence,r['id']))
        elif ca.status in ('mismatch','conflict'):
            c.execute("UPDATE discovery_candidates SET status='rejected',detected_condition=?,condition_confidence=?,condition_evidence=?,condition_status=?,reviewed_at=CURRENT_TIMESTAMP WHERE id=?",(ca.detected,ca.confidence,ca.evidence,ca.status,r['id']));rejected+=1
        else:
            c.execute("UPDATE discovery_candidates SET condition_status='pending' WHERE id=?",(r['id'],))

    rows=c.execute('''SELECT io.id,io.product_id,io.url,io.title,io.snippet,p.name,p.brand,p.model,p.variant,p.condition_type,p.capacity_gb,p.color
                      FROM indirect_offers io JOIN products p ON p.id=io.product_id WHERE io.active=1''').fetchall()
    for r in rows:
        product=dict(r);text=' '.join(x for x in (r['title'] or '',r['snippet'] or '',r['url'] or '') if x)
        reason=model_identity_conflict(product,text)
        if reason:
            c.execute("UPDATE indirect_offers SET active=0,condition_status='pending' WHERE id=?",(r['id'],));indirect+=1;continue
        ca=_condition_state(product,text,r['url'])
        if ca.status=='verified':
            c.execute("UPDATE indirect_offers SET detected_condition=?,condition_confidence=?,condition_evidence=?,condition_status='verified' WHERE id=?",(ca.detected,ca.confidence,ca.evidence,r['id']))
        else:
            c.execute("UPDATE indirect_offers SET active=0,detected_condition=?,condition_confidence=?,condition_evidence=?,condition_status=? WHERE id=?",(ca.detected,ca.confidence or None,ca.evidence or None,ca.status if ca.status!='unknown' else 'pending',r['id']));indirect+=1
    c.commit()
    print(f'Model+durum temizliği: model={disabled}, durum-hatalı={condition_bad}, doğrulandı={verified}, taze-kontrol={pending}, aday-red={rejected}, indeks-kapalı={indirect}')
    c.close()

if __name__=='__main__': run()
