import { computed } from 'nanostores' import { getAttackResult, isValidAttack } from '#lobo/attack.ts' import type { WolfOrPlayer } from '#lobo/player.ts' import { $library, $playerHand, $playerRoundScores, $selectedPlayerCardIds, $selectedWolfCardIds, $winningScore, $wolfHand, $wolfRoundScores, } from './state' export const $wolfScore = computed([$wolfRoundScores], (rounds) => rounds.reduce((total, round) => total + round, 0), ) export const $playerScore = computed([$playerRoundScores], (rounds) => rounds.reduce((total, round) => total + round, 0), ) export const $selectedWolfCards = computed([$wolfHand, $selectedWolfCardIds], (hand, ids) => hand.filter((c) => ids.includes(c.id)), ) export const $selectedPlayerCards = computed([$playerHand, $selectedPlayerCardIds], (hand, ids) => hand.filter((c) => ids.includes(c.id)), ) export const $isValidAttack = computed( [$selectedWolfCards, $selectedPlayerCards, $library], (wolfCards, playerCards, library) => { if (!library || !isValidAttack(wolfCards, playerCards)) { return false } // Only allow attacks if there are enough cards left to draw const result = getAttackResult(wolfCards, playerCards) return result.drawCount <= library.size }, ) export const $winner = computed( [$wolfScore, $playerScore, $winningScore], (wolfScore, playerScore, WINNING_SCORE): WolfOrPlayer | null => { if (wolfScore >= WINNING_SCORE) { return 'wolf' } else if (playerScore >= WINNING_SCORE) { return 'player' } else { return null } }, ) export const $hasGameEnded = computed($winner, (winner) => winner !== null)