import type { SportsDataProvider, ProviderEvent, ProviderSport } from "@/server/providers/odds/types";

const sports: ProviderSport[] = [
  { externalId: "local-football", slug: "football", name: "Football" },
  { externalId: "local-tennis", slug: "tennis", name: "Tennis" },
  { externalId: "local-basketball", slug: "basketball", name: "Basketball" },
  { externalId: "local-mma", slug: "mma", name: "MMA" },
  { externalId: "local-esports", slug: "esports", name: "Esports" }
];

export class LocalOddsProvider implements SportsDataProvider {
  async listSports() {
    return sports;
  }

  async listEvents(input?: { liveOnly?: boolean; sportSlug?: string }) {
    if (input?.liveOnly) return [];

    const now = Date.now();
    const events: ProviderEvent[] = [
      {
        externalId: "local-ars-zur",
        sportSlug: "football",
        competition: "Premier Division",
        country: "International",
        homeName: "Arsenal Coast",
        awayName: "Zurich Alpine",
        startsAt: new Date(now + 2 * 60 * 60 * 1000).toISOString(),
        isLive: false,
        markets: footballMarkets("2.08", "3.35", "3.20")
      },
      {
        externalId: "local-lions-meteors",
        sportSlug: "basketball",
        competition: "Elite Hoops",
        country: "USA",
        homeName: "Harbor Lions",
        awayName: "Metro Meteors",
        startsAt: new Date(now + 4 * 60 * 60 * 1000).toISOString(),
        isLive: false,
        markets: [
          {
            key: "match_winner",
            name: "Vainqueur",
            type: "MONEYLINE",
            selections: [
              { key: "home", name: "Harbor Lions", odds: "1.72", status: "ACTIVE" },
              { key: "away", name: "Metro Meteors", odds: "2.16", status: "ACTIVE" }
            ]
          }
        ]
      }
    ];

    return events.filter((event) => {
      if (input?.sportSlug && event.sportSlug !== input.sportSlug) return false;
      return true;
    });
  }

  async healthCheck() {
    return { ok: true, latencyMs: 1, message: "local odds provider ready for dev/staging" };
  }
}

function footballMarkets(home: string, draw: string, away: string): ProviderEvent["markets"] {
  return [
    {
      key: "1x2",
      name: "1X2",
      type: "THREE_WAY",
      selections: [
        { key: "home", name: "1", odds: home, status: "ACTIVE" },
        { key: "draw", name: "X", odds: draw, status: "ACTIVE" },
        { key: "away", name: "2", odds: away, status: "ACTIVE" }
      ]
    },
    {
      key: "total_2_5",
      name: "Total 2.5",
      type: "TOTAL",
      selections: [
        { key: "over", name: "Plus 2.5", odds: "1.88", status: "ACTIVE" },
        { key: "under", name: "Moins 2.5", odds: "1.92", status: "ACTIVE" }
      ]
    },
    {
      key: "btts",
      name: "Les deux équipes marquent",
      type: "BOOLEAN",
      selections: [
        { key: "yes", name: "Oui", odds: "1.82", status: "ACTIVE" },
        { key: "no", name: "Non", odds: "1.96", status: "ACTIVE" }
      ]
    }
  ];
}
