from __future__ import annotations

import logging
import sqlite3
from typing import Any

from .http import HttpClient
from .tmdb import TmdbResolver


class TmdbSync:
    def __init__(self, app_config: dict[str, Any], http: HttpClient):
        self.db_path = app_config["database"]["path"]
        self.tmdb = TmdbResolver(app_config.get("tmdb", {}), http)
        self.log = logging.getLogger(self.__class__.__name__)

    def run(self, only_tmdb_id: str | None = None) -> None:
        with sqlite3.connect(self.db_path) as conn:
            conn.row_factory = sqlite3.Row
            query = """
                SELECT id, tmdb_id, media_type, imdb_id
                FROM movies
                WHERE tmdb_id IS NOT NULL AND tmdb_id != ''
            """
            params: list[str] = []
            if only_tmdb_id:
                query += " AND tmdb_id = ?"
                params.append(only_tmdb_id)
            rows = conn.execute(query, params).fetchall()
            for row in rows:
                external = self.tmdb.external_ids(row["media_type"], row["tmdb_id"])
                imdb_id = external.get("imdb_id")
                if not imdb_id or imdb_id == row["imdb_id"]:
                    continue
                conn.execute(
                    "UPDATE movies SET imdb_id = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?",
                    (str(imdb_id), row["id"]),
                )
                self.log.info("Updated IMDb id movie_id=%s tmdb_id=%s imdb_id=%s", row["id"], row["tmdb_id"], imdb_id)
            conn.commit()
