import type { ScraperAdapter, AdapterConfig, AdapterRunResult, ScraperEnv } from '../types';
import { enrichMovies } from '../enricher/tmdb';
import { deduplicateByTmdbId } from '../utils/movie-matcher';

function toPositiveInt(value: unknown, fallback: number): number {
  const num = typeof value === 'number' ? value : Number(value);
  if (!Number.isFinite(num) || num <= 0) return fallback;
  return Math.trunc(num);
}

function toBoolean(value: unknown, fallback: boolean): boolean {
  if (typeof value === 'boolean') return value;
  if (typeof value === 'string') {
    if (value === 'true' || value === '1') return true;
    if (value === 'false' || value === '0') return false;
  }
  return fallback;
}

function toStringArray(value: unknown): string[] {
  if (!Array.isArray(value)) return [];
  return value
    .map((entry) => (typeof entry === 'string' ? entry.trim() : ''))
    .filter((entry) => entry.length > 0);
}

const adapter: ScraperAdapter = {
  id: 'tmdb-enricher',
  async run(config: AdapterConfig, env: ScraperEnv): Promise<AdapterRunResult> {
    const result = await enrichMovies(env.DB, env.TMDB_API_KEY ?? '', {
      limit: toPositiveInt(config.limit, 15),
      refreshHours: toPositiveInt(config.refresh_hours ?? config.refreshHours, 36),
      castLimit: toPositiveInt(config.cast_limit ?? config.castLimit, 10),
      includeExisting: toBoolean(config.include_existing ?? config.includeExisting, false),
      titleIds: toStringArray(config.title_ids ?? config.titleIds),
    });
    const deduped = await deduplicateByTmdbId(env.DB);
    if (deduped > 0) console.log(`tmdb-enricher: removed ${deduped} duplicate rows`);
    return { titles: result.enriched, showtimes: 0, skipped: result.skipped, errors: result.errors, deduped };
  },
};

export default adapter;
