import {
  GRAPES_REQUIRED_FOR_WINE,
  PURCHASEABLE_CELLARS,
} from '../../constants.js'
import { itemsMap } from '../../data/maps.js'
import { cellarService } from '../../services/cellar.js'
import { wineService } from '../../services/wine.js'
import { getYeastRequiredForWine } from '../../utils/getYeastRequiredForWine.js'

import { addKegToCellarInventory } from './addKegToCellarInventory.js'
import { decrementItemFromInventory } from './decrementItemFromInventory.js'

export const makeWine = (
  state: farmhand.state,
  grape: farmhand.grape,
  howMany: number = 1
): farmhand.state => {
  const { inventory, cellarInventory, purchasedCellar } = state

  const { space: cellarSize } = PURCHASEABLE_CELLARS.get(purchasedCellar) ?? {
    space: 0,
  }

  const maxYield = wineService.getMaxWineYield({
    grape,
    inventory,
    cellarInventory,
    cellarSize,
  })

  const wine = itemsMap[grape.wineId]
  const wineYield = Math.min(howMany, maxYield)

  for (let i = 0; i < wineYield; i++) {
    const keg = cellarService.generateKeg(wine)

    state = addKegToCellarInventory(state, keg)
  }

  state = decrementItemFromInventory(
    state,
    grape.id,
    wineYield * GRAPES_REQUIRED_FOR_WINE
  )

  const yeastRequirements = getYeastRequiredForWine(grape.variety)

  state = decrementItemFromInventory(
    state,
    (itemsMap as Record<string, farmhand.item>).yeast.id,
    wineYield * yeastRequirements
  )

  return state
}
