<?php
// app/Models/StatisticsRepository.php
// Repozitář pro hodnoty statistik hráčů – ukládání, načítání pro tým a pro konkrétního hráče.

namespace App\Models;

use App\Core\Database;
use App\Models\Entities\StatisticValueEntity;

/**
 * Poskytuje metody pro čtení a zápis statistických hodnot (tabulka statistiky_hodnoty).
 * Hodnoty jsou vždy vázané na typ statistiky definovaný v StatisticTypeRepository.
 */
class StatisticsRepository extends BaseRepository
{
    public function __construct(Database $db)
    {
        parent::__construct($db, 'statistiky_hodnoty', StatisticValueEntity::class);
    }

    /**
     * Vloží statistiku pro hráče
     */
    public function record(int $userId, int $statTypeId, int $value): bool
    {
        $stmt = $this->pdo->prepare(
            "INSERT INTO `statistiky_hodnoty` (`uzivatel_id`, `stat_typ_id`, `hodnota`) 
             VALUES (?, ?, ?)
             ON DUPLICATE KEY UPDATE `hodnota` = VALUES(`hodnota`)"
        );
        return $stmt->execute([$userId, $statTypeId, $value]);
    }


    /**
     * Získá statistiky hráčů v týmu
     */
    public function getTeamStats(int $teamId): array
    {
        // získání všech členů týmu
        $membersSql = "SELECT u.id, u.jmeno, u.prijmeni
                       FROM `uzivatele` u
                       JOIN `clenove_tymu` ct ON ct.uzivatel_id = u.id
                       WHERE ct.tym_id = ?
                       ORDER BY u.prijmeni, u.jmeno";
        $stmt = $this->pdo->prepare($membersSql);
        $stmt->execute([$teamId]);
        $members = $stmt->fetchAll(\PDO::FETCH_ASSOC);

        // získání všech typů statistik pro tým
        $typesSql = "SELECT id, nazev FROM `statistiky_typy` WHERE `tym_id` = ? ORDER BY `nazev`";
        $stmt = $this->pdo->prepare($typesSql);
        $stmt->execute([$teamId]);
        $types = $stmt->fetchAll(\PDO::FETCH_ASSOC);

        // získání všech hodnot
        $valuesSql = "SELECT sv.uzivatel_id, sv.stat_typ_id, SUM(sv.hodnota) as total
                      FROM `statistiky_hodnoty` sv
                      JOIN `statistiky_typy` st ON st.id = sv.stat_typ_id
                      WHERE st.tym_id = ?
                      GROUP BY sv.uzivatel_id, sv.stat_typ_id";
        $stmt = $this->pdo->prepare($valuesSql);
        $stmt->execute([$teamId]);
        
        $valuesRaw = $stmt->fetchAll(\PDO::FETCH_ASSOC);
        
        // Přestrukturuje na pole [userId][typeId] = value
        $values = [];
        foreach ($valuesRaw as $row) {
            $userId = $row['uzivatel_id'];
            $typeId = $row['stat_typ_id'];
            if (!isset($values[$userId])) {
                $values[$userId] = [];
            }
            $values[$userId][$typeId] = (int)$row['total'];
        }

        return [
            'members' => $members,
            'types' => $types,
            'values' => $values
        ];
    }

    /**
     * Získá statistiky uživatele seskupené podle týmů
     * Vrací [teamId => ['nazev' => ..., 'stats' => [['nazev' => ..., 'hodnota' => ...], ...]]]
     */
    public function getStatsForUser(int $userId): array
    {
        $sql = "SELECT
                    t.id as tym_id,
                    t.nazev as tym_nazev,
                    st.nazev as stat_nazev,
                    SUM(sv.hodnota) as total
                FROM statistiky_hodnoty sv
                JOIN statistiky_typy st ON st.id = sv.stat_typ_id
                JOIN tymy t ON t.id = st.tym_id
                WHERE sv.uzivatel_id = ?
                GROUP BY t.id, t.nazev, st.id, st.nazev
                ORDER BY t.nazev, st.nazev";

        $stmt = $this->pdo->prepare($sql);
        $stmt->execute([$userId]);
        $rows = $stmt->fetchAll(\PDO::FETCH_ASSOC);

        $result = [];
        foreach ($rows as $row) {
            $teamId = $row['tym_id'];
            if (!isset($result[$teamId])) {
                $result[$teamId] = ['nazev' => $row['tym_nazev'], 'stats' => []];
            }
            $result[$teamId]['stats'][] = [
                'nazev'   => $row['stat_nazev'],
                'hodnota' => (int)$row['total'],
            ];
        }
        return $result;
    }
}
