export interface State {
  board: ('X' | 'O' | null)[][]
}

export const initial: State = {
  board: [
    [null, null, null],    
    [null, null, null],    
    [null, null, null],    
  ]
}

export interface BaseAction {
  type: string
}
export interface PlayAction extends BaseAction {
  type: 'play'
  row: number
  column: number
  mark: 'X' | 'O'
}
export interface ResetAction extends BaseAction {
  type: 'reset'
}
export type Action = PlayAction | ResetAction

export function reducer(state: State, action: Action): State {
  switch (action.type) {
  case 'play':
    const playAction = action as PlayAction
    return {
      board: state.board.map((row, rIdx) => 
        rIdx !== playAction.row ? row : row.map((cell, cIdx) =>
          cIdx !== playAction.column ? cell : playAction.mark
        )
      )
    }
  case 'reset':
    return initial
  }
  //throw new Error('Unknown action type')
}
