import { env, listFromEnv } from "@/server/env";
import { assertProviderAllowed, requireProviderEndpoint } from "@/server/providers/policy";
import { HttpOddsProvider } from "@/server/providers/odds/http-provider";
import { LocalOddsProvider } from "@/server/providers/odds/local-provider";
import { TheOddsApiProvider } from "@/server/providers/odds/the-odds-api-provider";
import type { SportsDataProvider } from "@/server/providers/odds/types";

export function createOddsProvider(): SportsDataProvider {
  const config = env();
  assertProviderAllowed(config.ODDS_PROVIDER, "odds");

  if (config.ODDS_PROVIDER === "local") {
    return new LocalOddsProvider();
  }

  requireProviderEndpoint("odds", config.ODDS_PROVIDER_BASE_URL, config.ODDS_PROVIDER_API_KEY);

  if (config.ODDS_PROVIDER === "the-odds-api") {
    return new TheOddsApiProvider({
      baseUrl: config.ODDS_PROVIDER_BASE_URL!,
      apiKey: config.ODDS_PROVIDER_API_KEY!,
      bookmakers: listFromEnv(config.ODDS_PROVIDER_BOOKMAKERS),
      regions: listFromEnv(config.ODDS_PROVIDER_REGIONS),
      markets: listFromEnv(config.ODDS_PROVIDER_MARKETS),
      sportKeys: listFromEnv(config.ODDS_PROVIDER_SPORTS),
      preMatchWindowDays: config.ODDS_PREMATCH_WINDOW_DAYS,
      fetchAdvancedMarketsOnList: config.ODDS_SYNC_ADVANCED_MARKETS,
      pricing: {
        sourceBookmaker: config.ODDS_PRICING_SOURCE_BOOKMAKER,
        upliftPercent: config.ODDS_PRICING_UPLIFT_PERCENT,
        minMarginPercent: config.ODDS_PRICING_MIN_MARGIN_PERCENT,
        maxOdds: config.ODDS_PRICING_MAX_ODDS
      }
    });
  }

  return new HttpOddsProvider(config.ODDS_PROVIDER_BASE_URL!, config.ODDS_PROVIDER_API_KEY!);
}
