"""Bakım işleri — sistemin 7/24 sağlıklı kalması için.

- health_check : hesapların oturumu hâlâ geçerli mi? (askı/çıkış tespiti)
- cleanup      : eski log/olay/post kayıtlarını buda (SQLite şişmesin)
"""
import logging
from datetime import datetime, timedelta

from sqlalchemy.orm import Session

from app.db import models, crud

log = logging.getLogger("scheduler.maintenance")

LOG_RETENTION_DAYS = 14
POST_RETENTION_DAYS = 30
MATCH_RETENTION_DAYS = 21


def health_check(db: Session) -> int:
    """Aktif hesapları periyodik doğrular. Askıya alınan hesap rotasyondan düşer."""
    from app.x_engine import client as xclient
    checked = 0
    cutoff = datetime.utcnow() - timedelta(hours=6)
    accounts = (
        db.query(models.Account)
        .filter(models.Account.is_active == True)  # noqa: E712
        .all()
    )
    for acc in accounts:
        if acc.last_checked and acc.last_checked > cutoff:
            continue  # yakın zamanda bakıldı
        xclient.verify_account(db, acc)
        checked += 1
    return checked


def resume_after_daily_limit(db: Session):
    """Günlük tweet limiti (kod 344) yeni günde açılabilir DURUMU İŞARETLER —
    ama otomatik AÇMAZ.

    NEDEN ARTIK OTOMATİK AÇMIYOR (19.08 dersi): Bu mantık ilk sürümde
    paylaşımı kendiliğinden açıyordu. 18.08 gecesi hesap 344 (günlük limit)
    yedi; 19.08 sabahı bu iş paylaşımı otomatik açtı, hesap İLK denemede
    kod 226 (otomatik davranış bayrağı) yedi — İKİNCİ 226. Bu hesap ciddi
    kısıtlama altında; otomatik yeniden yayın onu kalıcı ban'a itebilir.
    Artık yalnızca 'yayına hazır' bayrağı konur, açma kararı KULLANICIDA.
    """
    from app.core import timeutil
    from app.db import crud
    vuruldu = crud.get_setting(db, "daily_limit_hit", "")
    if not vuruldu:
        return
    bugun = timeutil.tr_now().strftime("%Y-%m-%d")
    if vuruldu != bugun:
        crud.set_setting(db, "daily_limit_hit", "")
        crud.set_setting(db, "limit_reset_ready", "true")  # panelde göster
        db.commit()
        crud.add_log(db, "Günlük limit sıfırlandı — paylaşım ELLE açılabilir "
                         "(otomatik açılmadı: hesap kısıtlama altında)",
                     level="warn", source="scheduler")


def cleanup(db: Session) -> dict:
    """Eski kayıtları siler. Panel yavaşlamasın, disk şişmesin."""
    now = datetime.utcnow()
    removed = {}

    removed["logs"] = (
        db.query(models.LogEntry)
        .filter(models.LogEntry.created_at < now - timedelta(days=LOG_RETENTION_DAYS))
        .delete(synchronize_session=False)
    )
    removed["posts"] = (
        db.query(models.Post)
        .filter(models.Post.created_at < now - timedelta(days=POST_RETENTION_DAYS))
        .delete(synchronize_session=False)
    )

    # bitmiş eski maçlar ve olayları
    old_matches = (
        db.query(models.Match.id)
        .filter(
            models.Match.status.in_(["finished", "cancelled"]),
            models.Match.kickoff < now - timedelta(days=MATCH_RETENTION_DAYS),
        )
        .all()
    )
    ids = [m.id for m in old_matches]
    if ids:
        # ilişkili post'u olan maçları koru (geçmiş bozulmasın)
        linked = {
            p.match_id for p in db.query(models.Post.match_id)
            .filter(models.Post.match_id.in_(ids)).all()
        }
        ids = [i for i in ids if i not in linked]
    if ids:
        removed["events"] = (
            db.query(models.MatchEvent)
            .filter(models.MatchEvent.match_id.in_(ids))
            .delete(synchronize_session=False)
        )
        removed["matches"] = (
            db.query(models.Match)
            .filter(models.Match.id.in_(ids))
            .delete(synchronize_session=False)
        )
    db.commit()

    total = sum(v for v in removed.values() if v)
    if total:
        crud.add_log(db, f"Bakım: {total} eski kayıt temizlendi", source="scheduler")
    return removed
