#!/usr/bin/env python3
from __future__ import annotations
import argparse, fcntl, os, sqlite3, subprocess
from pathlib import Path

DB=os.environ.get('FIYAT_RADAR_DB','/var/lib/fiyat-radar/fiyat-radar.sqlite')
APP=Path(os.environ.get('FIYAT_RADAR_APP','/opt/fiyat-radar-app'))
VENV=Path(os.environ.get('FIYAT_RADAR_VENV','/opt/fiyat-radar-venv'))
LOCK=Path('/var/lib/fiyat-radar/condition-audit.lock')

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_cmd(args,timeout=90):
    env=os.environ.copy();env['FIYAT_RADAR_DB']=DB;env['PYTHONDONTWRITEBYTECODE']='1'
    return subprocess.run(args,cwd=str(APP/'worker'),env=env,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,text=True,timeout=timeout)

def verified_count(c,pid):
    return int(c.execute("SELECT COUNT(*) FROM product_sources ps JOIN products p ON p.id=ps.product_id WHERE ps.product_id=? AND ps.active=1 AND ps.condition_status='verified' AND ps.detected_condition=p.condition_type",(pid,)).fetchone()[0])

def candidates(limit):
    c=connect()
    rows=c.execute("""SELECT DISTINCT p.id,p.name,p.condition_type,
                    COALESCE(MIN(CASE WHEN ps.condition_status='pending' THEN ps.next_check_at END),'1970-01-01') due
                 FROM products p LEFT JOIN product_sources ps ON ps.product_id=p.id AND ps.active=1
                 WHERE p.active=1 AND (
                    EXISTS(SELECT 1 FROM product_sources x WHERE x.product_id=p.id AND x.active=1 AND COALESCE(x.condition_status,'pending')<>'verified')
                    OR NOT EXISTS(SELECT 1 FROM product_sources x JOIN products px ON px.id=x.product_id WHERE x.product_id=p.id AND x.active=1 AND x.condition_status='verified' AND x.detected_condition=px.condition_type)
                 )
                 GROUP BY p.id ORDER BY due ASC,p.id ASC LIMIT ?""",(limit,)).fetchall();c.close();return rows

def run(limit=5):
    LOCK.parent.mkdir(parents=True,exist_ok=True)
    with LOCK.open('a+') as fh:
        try:fcntl.flock(fh.fileno(),fcntl.LOCK_EX|fcntl.LOCK_NB)
        except BlockingIOError:return 0
        # Ana scanner çalışıyorsa bekleyip iki worker'ı da yavaşlatma; bir sonraki kısa timer turuna bırak.
        scan_lock=Path('/var/lib/fiyat-radar/scan.lock')
        with scan_lock.open('a+') as sf:
            try:
                fcntl.flock(sf.fileno(),fcntl.LOCK_EX|fcntl.LOCK_NB);fcntl.flock(sf.fileno(),fcntl.LOCK_UN)
            except BlockingIOError:
                print('Ana scanner aktif; condition audit bu turu beklemeden atladı')
                return 0
        done=0
        for row in candidates(max(1,limit)):
            pid=int(row['id']);print(f"DURUM-KONTROL #{pid} {row['name']} [{row['condition_type']}]")
            # Hızlı hat: önce kayıtlı kaynakları kısa timeout ile tara. Ağır keşif/browser aynı proses içinde bekletilmez.
            env=os.environ.copy();env['FIYAT_RADAR_TIMEOUT']=env.get('FIYAT_RADAR_TIMEOUT','10')
            try:
                subprocess.run([str(VENV/'bin/python'),str(APP/'worker/scanner.py'),'--product-id',str(pid),'--force','--limit','30'],cwd=str(APP/'worker'),env={**env,'FIYAT_RADAR_DB':DB,'PYTHONDONTWRITEBYTECODE':'1'},stdout=subprocess.PIPE,stderr=subprocess.STDOUT,text=True,timeout=45)
            except subprocess.TimeoutExpired:pass
            c=connect();verified=verified_count(c,pid)
            if verified==0:
                # Ürünü bloklamadan discovery/bootstrap hızlı hattına bırak. Böylece tek problemli site bütün audit turunu yavaşlatmaz.
                c.execute("INSERT INTO product_bootstrap_requests(product_id,status,priority,requested_by,requested_at,note) SELECT ?,'pending',220,'condition-audit',CURRENT_TIMESTAMP,'Ürün durumu için hızlı kaynak yenileme' WHERE NOT EXISTS(SELECT 1 FROM product_bootstrap_requests WHERE product_id=? AND status IN ('pending','running'))",(pid,pid))
                c.commit()
                for trig in ('bootstrap.trigger','discovery.trigger'):
                    try:Path('/var/lib/fiyat-radar/'+trig).touch()
                    except OSError:pass
            c.close();done+=1
        if done:
            try:Path('/var/lib/fiyat-radar/family-sync.trigger').touch()
            except OSError:pass
        print(f'Ürün durumu derin kontrolü: {done} ürün işlendi')
        return done

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