from __future__ import annotations

from typing import Any


class PopularityRepositoryMixin:
    def upsert_popularity_factors(self, rows: list[dict[str, Any]]) -> int:
        values = [
            (
                str(row.get("trade_date") or ""),
                str(row.get("ts_code") or ""),
                int(row["ths_rank"]) if row.get("ths_rank") not in (None, "") else None,
                int(row["dc_rank"]) if row.get("dc_rank") not in (None, "") else None,
                float(row.get("combined_score") or 0),
                int(row["rank_change"]) if row.get("rank_change") not in (None, "") else None,
                int(bool(row.get("dual_source"))),
            )
            for row in rows
            if row.get("trade_date") and row.get("ts_code")
        ]
        with self.connect() as connection:
            connection.executemany(
                """
                INSERT INTO popularity_factors
                    (trade_date, ts_code, ths_rank, dc_rank, combined_score,
                     rank_change, dual_source)
                VALUES (?, ?, ?, ?, ?, ?, ?)
                ON CONFLICT(trade_date, ts_code) DO UPDATE SET
                    ths_rank=excluded.ths_rank,
                    dc_rank=excluded.dc_rank,
                    combined_score=excluded.combined_score,
                    rank_change=excluded.rank_change,
                    dual_source=excluded.dual_source
                """,
                values,
            )
        return len(values)
