<?php
// app/Controllers/StatisticsController.php
// Controller pro správu statistik hráčů – zobrazení a uložení hodnot v rámci týmu.

namespace App\Controllers;

use App\Core\Controller;
use App\Core\Auth;
use App\Core\Database;
use App\Models\StatisticsRepository;
use App\Models\StatisticTypeRepository;
use App\Models\UdalostRepository;
use App\Models\TeamRepository;
use App\Models\UserRepository;

/**
 * Zobrazí a uloží statistické hodnoty hráčů pro daný tým.
 * Editovat smí pouze admin, trenér a asistent daného týmu.
 */
class StatisticsController extends Controller
{
    private StatisticsRepository $statsRepo;
    private StatisticTypeRepository $typeRepo;
    private TeamRepository $teamRepo;

    public function __construct(Database $db)
    {
        parent::__construct($db);
        Auth::requireLogin();
        $this->statsRepo = new StatisticsRepository($db);
        $this->typeRepo = new StatisticTypeRepository($db);
        $this->teamRepo = new TeamRepository($db);
    }

    /**
     * Zobrazí formulář pro hromadnou úpravu statistik hráčů týmu.
     * Načte matici [hráč × typ statistiky → hodnota].
     */
    public function editStats()
    {   
        $user = Auth::user();
        $teamId = (int)($_GET['team_id'] ?? 0);
        
        if (!$teamId) {
            $this->abort(400, 'Není zadán tým');
        }

        // Ověření oprávnění
        if ($user['role'] !== 'admin') {
            $teamRole = $this->teamRepo->getUserTeamRole($teamId, $user['id']);
            if ($teamRole !== 'trener' && $teamRole !== 'asistent') {
                $this->abort(403, 'Nemáte oprávnění');
            }
        }

        // Načtení dat
        $statsMatrix = $this->statsRepo->getTeamStats($teamId);
        $team = $this->teamRepo->find($teamId);
        
        $this->view->render('teams/statistiky/edit', [
            'team' => $team->toArray(),
            'statsMatrix' => $statsMatrix
        ]);
    }

    /**
     * Uloží statistické hodnoty z POST formuláře.
     * Nejdříve přejmenuje typy statistik (pokud bylo změněno jméno),
     * pak smaže stávající hodnoty pro tým a vloží nové.
     */
    public function saveStats()
    {   
        $user = Auth::user();
        $teamId = (int)($_POST['team_id'] ?? 0);
        $stats = $_POST['stats'] ?? [];
        
        if (!$teamId) {
            $this->abort(400, 'Není zadán tým');
        }

        // Ověření oprávnění
        if ($user['role'] !== 'admin') {
            $teamRole = $this->teamRepo->getUserTeamRole($teamId, $user['id']);
            if ($teamRole !== 'trener' && $teamRole !== 'asistent') {
                $this->abort(403, 'Nemáte oprávnění');
            }
        }

        // Přejmenování typů statistik
        $typeNames = $_POST['type_names'] ?? [];
        foreach ($typeNames as $typeId => $name) {
            $name = trim($name);
            if ($name !== '') {
                $this->typeRepo->rename((int)$typeId, $teamId, $name);
            }
        }

        $pdo = $this->db->pdo();

        // Smaže všechny zespolečné statistiky (bez konkrétní akce)
        $stmt = $pdo->prepare(
            "DELETE FROM `statistiky_hodnoty`
             WHERE `stat_typ_id` IN (
                 SELECT id FROM `statistiky_typy` WHERE `tym_id` = ?
             )"
        );
        $stmt->execute([$teamId]);
        
        // Vloží nové hodnoty bez vazby na konkrétní akci (event_id = NULL)
        foreach ($stats as $userId => $userStats) {
            foreach ($userStats as $typeId => $value) {
                $value = (int)$value;
                $this->statsRepo->record((int)$userId, (int)$typeId, $value);
            }
        }
        
        // Redirect zpět na tým
        Auth::setFlash('success', 'Statistiky byly úspěšně uloženy!');
        $this->redirect(BASE_URL . '/team/show?id=' . $teamId . '#stats-tab');
    }
}
