<?php
// api/hand.php — Resolve a completed hand, save result, update stats & bankroll

require_once __DIR__ . '/../db.php';

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') exit;
if ($_SERVER['REQUEST_METHOD'] !== 'POST') json_error('Method not allowed', 405);

$input = get_input();

$sid        = $input['session_id']  ?? '';
$playerCards= $input['player_cards'] ?? [];   // array of {rank,suit} per hand (array of arrays)
$dealerCards= $input['dealer_cards'] ?? [];   // array of {rank,suit}
$bets       = $input['bets']         ?? [];   // bet per hand (matches playerCards)
$sideBets   = $input['side_bets']    ?? [];   // {lucky7:{active,amount}, perfect_pairs:{...}, "21plus3":{...}}
$insurance  = $input['insurance']    ?? ['taken'=>false,'amount'=>0];

if (!$sid)                 json_error('session_id required');
if (!$playerCards)         json_error('player_cards required');
if (!$dealerCards)         json_error('dealer_cards required');
if (!$bets || !count($bets)) json_error('bets required');

$db = get_db();

// Load player
$stmt = $db->prepare('SELECT * FROM players WHERE session_id = ?');
$stmt->execute([$sid]);
$player = $stmt->fetch();
if (!$player) json_error('Player not found', 404);

// ── Card helpers ────────────────────────────────────────────────────────────
function card_value(string $rank): int {
    if ($rank === 'A') return 11;
    if (in_array($rank, ['J','Q','K'])) return 10;
    return (int)$rank;
}

function hand_total(array $hand): int {
    $total = 0; $aces = 0;
    foreach ($hand as $c) { $total += card_value($c['rank']); if ($c['rank']==='A') $aces++; }
    while ($total > 21 && $aces > 0) { $total -= 10; $aces--; }
    return $total;
}

function is_blackjack(array $hand): bool { return count($hand)===2 && hand_total($hand)===21; }
function is_bust(array $hand): bool      { return hand_total($hand) > 21; }

// ── Resolve each player hand ────────────────────────────────────────────────
$dTotal = hand_total($dealerCards);
$dBJ    = is_blackjack($dealerCards);
$totalPayout = 0;
$totalProfit = 0;
$handResults = [];
$totalWins   = 0; $totalLosses = 0; $totalPushes = 0; $totalBJ = 0;

foreach ($playerCards as $i => $hand) {
    $bet    = (int)($bets[$i] ?? 0);
    $pTotal = hand_total($hand);
    $pBJ    = is_blackjack($hand) && count($playerCards) === 1; // BJ only valid on non-split
    $payout = 0;
    $outcome= '';

    if (is_bust($hand)) {
        $outcome = 'bust'; $payout = 0; $totalLosses++;
    } elseif ($pBJ && $dBJ) {
        $outcome = 'push'; $payout = $bet; $totalPushes++; $totalBJ++;
    } elseif ($pBJ) {
        $outcome = 'blackjack'; $payout = $bet + (int)floor($bet * 1.5); $totalBJ++; $totalWins++;
    } elseif ($dBJ) {
        $outcome = 'loss'; $payout = 0; $totalLosses++;
    } elseif (is_bust($dealerCards)) {
        $outcome = 'win'; $payout = $bet * 2; $totalWins++;
    } elseif ($pTotal > $dTotal) {
        $outcome = 'win'; $payout = $bet * 2; $totalWins++;
    } elseif ($pTotal === $dTotal) {
        $outcome = 'push'; $payout = $bet; $totalPushes++;
    } else {
        $outcome = 'loss'; $payout = 0; $totalLosses++;
    }

    $profit = $payout - $bet;
    $totalPayout += $payout;
    $totalProfit += $profit;
    $handResults[] = ['outcome'=>$outcome,'payout'=>$payout,'profit'=>$profit,'bet'=>$bet];
}

// ── Insurance ───────────────────────────────────────────────────────────────
$insPayout = 0;
if ($insurance['taken'] && $insurance['amount'] > 0) {
    $amt = (int)$insurance['amount'];
    if ($dBJ) { $insPayout = $amt * 2; $totalProfit += $amt; $totalPayout += $amt * 2; }
    else       { $totalProfit -= $amt; } // already deducted from bankroll client-side
}

// ── Side bets ───────────────────────────────────────────────────────────────
$sideBetResults = [];
$redSuits = ['♥','♦'];

if (!empty($sideBets['lucky7']['active']) && !empty($playerCards[0])) {
    $amt   = (int)$sideBets['lucky7']['amount'];
    $first2= array_slice($playerCards[0], 0, 2);
    $sevens= array_filter($first2, fn($c)=>$c['rank']==='7');
    $win   = 0;
    if (count($sevens)===2) {
        $sv = array_values($sevens);
        $win = ($sv[0]['suit']===$sv[1]['suit']) ? $amt*50 : $amt*3;
    } elseif (count($sevens)===1) {
        $win = $amt*3;
    }
    $sbProfit = $win > 0 ? ($win - $amt) : -$amt;
    $totalProfit += $sbProfit; $totalPayout += $win;
    $sideBetResults['lucky7'] = ['win'=>$win>0,'payout'=>$win,'profit'=>$sbProfit];
}

if (!empty($sideBets['perfect_pairs']['active']) && !empty($playerCards[0]) && count($playerCards[0])>=2) {
    $amt = (int)$sideBets['perfect_pairs']['amount'];
    [$c1,$c2] = $playerCards[0];
    $win = 0;
    if ($c1['rank']===$c2['rank']) {
        if ($c1['suit']===$c2['suit'])                                                              $win = $amt*30;
        elseif ((in_array($c1['suit'],$redSuits)===in_array($c2['suit'],$redSuits)))                $win = $amt*15;
        else                                                                                         $win = $amt*5;
    }
    $sbProfit = $win>0 ? ($win-$amt) : -$amt;
    $totalProfit += $sbProfit; $totalPayout += $win;
    $sideBetResults['perfect_pairs'] = ['win'=>$win>0,'payout'=>$win,'profit'=>$sbProfit];
}

if (!empty($sideBets['21plus3']['active']) && !empty($playerCards[0]) && count($playerCards[0])>=2) {
    $amt   = (int)$sideBets['21plus3']['amount'];
    $three = [$playerCards[0][0], $playerCards[0][1], $dealerCards[0]];
    $ranks = array_column($three,'rank');
    $suits = array_column($three,'suit');
    $nums  = array_map(fn($r)=>card_value($r), $ranks); sort($nums);
    $flush  = count(array_unique($suits))===1;
    $straight = ($nums[2]-$nums[0]===2 && count(array_unique($nums))===3);
    $threeOfAKind = count(array_unique($ranks))===1;
    $win = 0;
    if ($flush && $straight)  $win = $amt*100;
    elseif ($threeOfAKind)    $win = $amt*30;
    elseif ($straight)        $win = $amt*10;
    elseif ($flush)           $win = $amt*5;
    $sbProfit = $win>0 ? ($win-$amt) : -$amt;
    $totalProfit += $sbProfit; $totalPayout += $win;
    $sideBetResults['21plus3'] = ['win'=>$win>0,'payout'=>$win,'profit'=>$sbProfit];
}

// ── Update bankroll ─────────────────────────────────────────────────────────
$newBankroll = $player['bankroll'] + $totalPayout + $insPayout;

$db->prepare('UPDATE players SET bankroll=?, updated_at=CURRENT_TIMESTAMP WHERE id=?')
   ->execute([$newBankroll, $player['id']]);

// ── Update stats ────────────────────────────────────────────────────────────
$stats = $db->prepare('SELECT * FROM stats WHERE player_id=?');
$stats->execute([$player['id']]);
$s = $stats->fetch();

$newStreak     = 0; $newStreakType = '';
if ($totalWins > 0 && $totalLosses === 0) {
    $newStreakType = 'win';
    $newStreak    = ($s['streak_type']==='win') ? $s['current_streak']+1 : 1;
} elseif ($totalLosses > 0 && $totalWins === 0) {
    $newStreakType = 'loss';
    $newStreak    = ($s['streak_type']==='loss') ? $s['current_streak']+1 : 1;
}
$longestWin  = ($newStreakType==='win')  ? max($s['longest_win'],  $newStreak) : $s['longest_win'];
$longestLoss = ($newStreakType==='loss') ? max($s['longest_loss'], $newStreak) : $s['longest_loss'];

$db->prepare('
    UPDATE stats SET
        wins=wins+?, losses=losses+?, pushes=pushes+?, blackjacks=blackjacks+?,
        profit=profit+?, current_streak=?, streak_type=?,
        longest_win=?, longest_loss=?
    WHERE player_id=?
')->execute([
    $totalWins, $totalLosses, $totalPushes, $totalBJ,
    $totalProfit, $newStreak, $newStreakType,
    $longestWin, $longestLoss,
    $player['id']
]);

// ── Save hand record ─────────────────────────────────────────────────────────
$summaryOutcome = implode('/', array_column($handResults,'outcome'));
$db->prepare('
    INSERT INTO hands (player_id, player_cards, dealer_cards, bet, side_bets, outcome, payout, profit)
    VALUES (?,?,?,?,?,?,?,?)
')->execute([
    $player['id'],
    json_encode($playerCards),
    json_encode($dealerCards),
    array_sum($bets),
    json_encode($sideBets),
    $summaryOutcome,
    $totalPayout,
    $totalProfit,
]);

// ── Reload updated stats ─────────────────────────────────────────────────────
$statsRow = $db->prepare('SELECT * FROM stats WHERE player_id=?');
$statsRow->execute([$player['id']]);

json_response([
    'hand_results'    => $handResults,
    'side_bet_results'=> $sideBetResults,
    'total_payout'    => $totalPayout,
    'total_profit'    => $totalProfit,
    'new_bankroll'    => $newBankroll,
    'stats'           => $statsRow->fetch(),
]);
