/**
 * OddsAdapter — common interface every odds source must implement.
 *
 * The UnifiedOddsProvider calls these methods on every adapter via
 * Promise.allSettled, so adapters should never throw at the module boundary
 * — surface failures as a fulfilled result with `error` set, or a rejected
 * promise that the orchestrator can attribute to a specific source.
 *
 * Return shapes:
 *   getGames(sport):    Game[]
 *   getPlayerProps(sport): PlayerProp[]
 *
 * Game = {
 *   game_id, sport, away, home, start_time, status, score?,
 *   moneyline?: { away, home }, spread?: { line, juice }, total?: { line, juice }
 * }
 *
 * PlayerProp = {
 *   game_id, player_name, player_id?, stat_type, line,
 *   odds_over, odds_under, book, fetched_at
 * }
 */

class NotImplementedAdapter {
  constructor(name) {
    this.name = name;
  }
  async getGames(/* sport */) {
    return this._notImplemented('getGames');
  }
  async getPlayerProps(/* sport */) {
    return this._notImplemented('getPlayerProps');
  }
  _notImplemented(method) {
    const err = new Error(`${this.name}.${method} not implemented`);
    err.code = 'NOT_IMPLEMENTED';
    err.skipBreaker = true; // don't penalize the breaker for missing impls
    throw err;
  }
}

module.exports = { NotImplementedAdapter };
