"""Daily Global Scan (spec §40) — diffs today's screen_results/metrics against yesterday's and
flags what changed. Discovery status transitions (spec §6) use engines.discovery."""
from __future__ import annotations

from datetime import date, timedelta

from sqlalchemy import select

from app.core.db import SessionLocal
from app.core.logging import get_logger
from app.engines.discovery import evaluate_discovery_signal
from app.models import MetricHistory, Security
from app.workers.celery_app import celery_app

logger = get_logger(__name__)


def _metric_values_as_of(db, security_id: str, as_of: date) -> dict:
    rows = db.execute(
        select(MetricHistory).where(MetricHistory.security_id == security_id, MetricHistory.as_of == as_of)
    ).scalars().all()
    return {r.metric_key: r.value for r in rows}


@celery_app.task(name="app.workers.discovery.daily_global_scan_task")
def daily_global_scan_task() -> dict:
    db = SessionLocal()
    try:
        today, yesterday = date.today(), date.today() - timedelta(days=1)
        securities = db.execute(select(Security.id)).scalars().all()
        newly_qualified = []
        for security_id in securities:
            current = _metric_values_as_of(db, security_id, today)
            prior = _metric_values_as_of(db, security_id, yesterday)
            if not current or not prior:
                continue
            signal = evaluate_discovery_signal(current, prior)
            if signal.recommended_status == "QUALIFIED":
                newly_qualified.append(security_id)
        logger.info("discovery.daily_scan.complete", newly_qualified=len(newly_qualified))
        return {"newly_qualified": newly_qualified}
    finally:
        db.close()
