/**
 * Outcome Constants
 *
 * Centralized definitions for play outcomes used across the UI.
 * These match the backend PlayOutcome enum values.
 */

import type { PlayOutcome } from '~/types/game'

/**
 * Outcome categories for UI display and selection
 * Grouped by common baseball categories for user-friendly selection
 */
export const OUTCOME_CATEGORIES = [
  {
    name: 'Outs',
    outcomes: [
      'strikeout',
      'groundball_a',
      'groundball_b',
      'groundball_c',
      'flyout_a',
      'flyout_b',
      'flyout_c',
      'lineout',
      'popout',
    ] as const satisfies readonly PlayOutcome[],
  },
  {
    name: 'Hits',
    outcomes: [
      'single_1',
      'single_2',
      'single_uncapped',
      'double_2',
      'double_3',
      'double_uncapped',
      'triple',
      'homerun',
    ] as const satisfies readonly PlayOutcome[],
  },
  {
    name: 'Walks / HBP',
    outcomes: [
      'walk',
      'intentional_walk',
      'hbp',
    ] as const satisfies readonly PlayOutcome[],
  },
  {
    name: 'Special',
    outcomes: [
      'error',
      'x_check',
    ] as const satisfies readonly PlayOutcome[],
  },
  {
    name: 'Interrupts',
    outcomes: [
      'stolen_base',
      'caught_stealing',
      'wild_pitch',
      'passed_ball',
      'balk',
      'pick_off',
    ] as const satisfies readonly PlayOutcome[],
  },
] as const

/**
 * Outcomes that require a hit location to be specified
 * These outcomes involve defensive plays where location matters for game logic:
 * - Groundballs: determines double play eligibility
 * - Flyouts: determines sac fly advancement opportunities
 * - Uncapped hits/errors: determines runner advancement
 *
 * Note: lineout and popout are NOT included because they are simple outs
 * with no runner advancement logic - the backend doesn't use hit_location for them
 */
export const OUTCOMES_REQUIRING_HIT_LOCATION = [
  'groundball_a',
  'groundball_b',
  'groundball_c',
  'flyout_a',
  'flyout_b',
  'flyout_c',
  'single_uncapped',
  'double_uncapped',
  'error',
] as const satisfies readonly PlayOutcome[]

/**
 * Outcomes that only allow infield hit locations (no outfield)
 * Groundballs by definition stay in the infield
 */
export const INFIELD_ONLY_OUTCOMES = [
  'groundball_a',
  'groundball_b',
  'groundball_c',
] as const satisfies readonly PlayOutcome[]

/**
 * Outcomes that only allow outfield hit locations (no infield)
 * Flyballs by definition go to the outfield
 */
export const OUTFIELD_ONLY_OUTCOMES = [
  'flyout_a',
  'flyout_b',
  'flyout_c',
] as const satisfies readonly PlayOutcome[]

/**
 * Hit location options
 */
export const HIT_LOCATIONS = {
  infield: ['P', 'C', '1B', '2B', '3B', 'SS'] as const,
  outfield: ['LF', 'CF', 'RF'] as const,
} as const