<?php
// app/Controllers/TeamController.php
// Controller pro správu týmů – výpis, detail, přidání/editace/smazání a správa členů.

namespace App\Controllers;

use App\Core\Controller;
use App\Core\Auth;
use App\Core\Database;
use App\Models\TeamRepository;

/**
 * Spravuje týmy a jejich členy.
 * Admin má přístup ke všem týmům; trenér jen ke svým; sportovec vidí jen týmy, kde je členem.
 */
class TeamController extends Controller
{
    private TeamRepository $teams;

    public function __construct(Database $db)
    {
        parent::__construct($db);
        Auth::requireLogin();
        $this->teams = new TeamRepository($db);
    }

    /** Vypíše týmy dle oprávnění přihlášeného uživatele spolu s počtem členů. */
    public function index()
    {
        $user = Auth::user();

        if ($user['role'] === 'admin') {
            // admin vidí všechny týmy
            $teams = $this->teams->findAll();
        } else {
            // trenér a sportovec vidí jen své týmy
            $teams = $this->teams->getTeamsForUser($user['id']);
        }

        // Spočítej členy pro každý tým
        $memberCounts = [];
        foreach ($teams as $team) {
            $teamId = is_array($team) ? $team['id'] : $team->id;
            $memberCounts[$teamId] = $this->teams->getMemberCount($teamId);
        }

        $this->view->render('teams/index', [
            'user' => $user,
            'teams' => $teams,
            'memberCounts' => $memberCounts
        ]);
    }

    /** GET: formulář pro vytvoření týmu. POST: uloží tým a přidá tvůrce jako trenéra. */
    public function pridat()
    {
        // Admin a trenér mohou vytvářet týmy
        $user = Auth::user();
        if ($user['role'] !== 'admin' && $user['role'] !== 'trener') {
            $this->abort(403, 'Nemáte oprávnění');
        }

        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            $data = $this->validate($_POST);
            $this->teams->create($data, $user['id']);
            Auth::setFlash('success', 'Tým byl úspěšně vytvořen!');
            $this->redirect(BASE_URL . '/team/index');
        }

        $this->view->render('teams/form');
    }

    /** GET: formulář pro editaci týmu. POST: uloží změny. Trenér může editovat jen svůj tým. */
    public function edit()
    {
        $id = (int)($_GET['id'] ?? 0);
        $team = $this->teams->find($id);
        $user = Auth::user();

        if (!$team) {
            $this->abort(404, 'Tým nenalezen');
        }

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

        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            $data = $this->validate($_POST);
            $this->teams->update($id, $data);
            Auth::setFlash('success', 'Tým byl úspěšně aktualizován!');
            $this->redirect(BASE_URL . '/team/index');
        }

        $teamArray = is_array($team) ? $team : $team->toArray();

        $this->view->render('teams/edit', ['team' => $teamArray]);
    }

    /** Smaže tým. Admin může smazat jakýkoli; trenér pouze tým, kde je trenérem. */
    public function delete()
    {
        $id = (int)($_GET['id'] ?? 0);
        $team = $this->teams->find($id);
        $user = Auth::user();

        if (!$team) {
            $this->abort(404, 'Tým nenalezen');
        }

        // admin může smazat kdykoli, trenér jen svůj tým
        $canDelete = false;
        if ($user['role'] === 'admin') {
            $canDelete = true;
        } elseif ($user['role'] === 'trener') {
            $members = $this->teams->getMembers($id);
            foreach ($members as $member) {
                if ($member['id'] == $user['id'] && $member['role_v_tymu'] === 'trener') {
                    $canDelete = true;
                    break;
                }
            }
        }

        if (!$canDelete) {
            $this->abort(403, 'Nemáte oprávnění');
        }

        Auth::setFlash('success', 'Tým byl úspěšně smazán!');
        $this->teams->delete($id);
        $this->redirect(BASE_URL . '/team/index');
    }

    /**
     * Zobrazí detail týmu: členové, události, docházka, ankety, statistiky.
     * Přístup mají pouze členové týmu a admin.
     */
    public function show()
    {
        $id = (int)($_GET['id'] ?? 0);
        $team = $this->teams->find($id);

        if (!$team) {
            $this->abort(404, 'Tým nenalezen');
        }

        $teamArray = is_array($team) ? $team : $team->toArray();

        $user = Auth::user();
        if ($user['role'] !== 'admin') {
            $isMember = $this->teams->isUserMember($id, (int)$user['id']);
            if (!$isMember) {
                $this->abort(403, 'Nemáte oprávnění zobrazit tento tým');
            }
        }

        // načte členy týmu
        $members = $this->teams->getMembers($id);

        // Načtení schůzek (událostí) a souhrnu docházky
        $eventRepo = new \App\Models\UdalostRepository($this->db);
        $meetings = $eventRepo->getEventsForTeam($id);
        
        $attendanceSummary = [];
        if (!empty($meetings)) {
            $meetingIds = array_column($meetings, 'id');
            $dochazkaRepo = new \App\Models\DochazkaRepository($this->db);
            $attendanceSummary = $dochazkaRepo->getAttendanceSummaryForMeetings($meetingIds);
        }

        // Načtení anket pro tým
        $anketaRepo = new \App\Models\AnketaRepository($this->db);
        $ankety = $anketaRepo->getByTeamId($id);

        // Načtení statistik pro tým
        $typeRepo = new \App\Models\StatisticTypeRepository($this->db);
        $statistics = $typeRepo->getByTeamId($id);
        
        // Načtení matice statistik (hráči x typy se hodnotami)
        $statsRepo = new \App\Models\StatisticsRepository($this->db);
        $statsMatrix = $statsRepo->getTeamStats($id);

        $this->view->render('teams/show', [
            'team' => $teamArray,
            'members' => $members,
            'meetings' => $meetings,
            'attendanceSummary' => $attendanceSummary,
            'ankety' => $ankety,
            'statistics' => $statistics,
            'statsMatrix' => $statsMatrix
        ]);
    }

    /**
     * GET: formulář pro přidání člena. POST: přidá uživatele do týmu.
     * Sportovec nemůže dostat roli trenéra; trenér vidí jen uživatele, které vytvořil.
     */
    public function addMember()
    {
        $teamId = (int)($_GET['id'] ?? 0);
        $team = $this->teams->find($teamId);
        $user = Auth::user();

        if (!$team) {
            $this->abort(404, 'Tým nenalezen');
        }

        // jen admin nebo trenér týmu může přidávat členy
        if ($user['role'] !== 'admin') {
            $isCoachInTeam = $this->isUserCoachInTeam($teamId, $user['id']);
            if (!$isCoachInTeam) {
                $this->abort(403, 'Nemáte oprávnění');
            }
        }

        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            $userId = (int)($_POST['uzivatel_id'] ?? 0);
            $roleInTeam = $_POST['role_v_tymu'] ?? 'hrac';

            if ($userId > 0) {
                // Sportovec nemůže dostat týmovou roli trenéra
                $userRepo = new \App\Models\UserRepository($this->db);
                $addedUser = $userRepo->find($userId);
                $addedUserArray = is_array($addedUser) ? $addedUser : ($addedUser ? $addedUser->toArray() : []);
                if (($addedUserArray['role'] ?? '') === 'sportovec' && $roleInTeam === 'trener') {
                    $roleInTeam = 'hrac';
                }

                $this->teams->addMember($teamId, $userId, $roleInTeam);
                Auth::setFlash('success', 'Člen byl úspěšně přidán do týmu!');
            }

            $this->redirect(BASE_URL . '/team/show?id=' . $teamId);
            return;
        }

        $teamArray = is_array($team) ? $team : $team->toArray();
        
        // Filtruj dostupné uživatele podle role
        if ($user['role'] === 'admin') {
            $availableUsers = $this->teams->getAvailableUsers($teamId);
        } else {
            // Trenér vidí jen uživatele, které sám vytvořil
            $userRepo = new \App\Models\UserRepository($this->db);
            $availableUsers = $userRepo->getCreatedByUser($user['id'], $teamId);
        }

        // Předej role uživatelů jako JSON pro JS (pro dynamické skrývání role trenér u sportovců)
        $userRoles = [];
        foreach ($availableUsers as $u) {
            $userRoles[(int)$u['id']] = $u['role'];
        }

        $this->view->render('teams/addMember', [
            'team' => $teamArray,
            'availableUsers' => $availableUsers,
            'userRoles' => $userRoles
        ]);
    }

    /** Odebere člena z týmu. Povoleno jen adminovi nebo trenérovi daného týmu. */
    public function removeMember()
    {
        $teamId = (int)($_GET['id'] ?? 0);
        $memberId = (int)($_GET['member'] ?? 0);
        $user = Auth::user();

        // jen admin nebo trenér týmu může odebírat členy
        if ($user['role'] !== 'admin') {
            $isCoachInTeam = $this->isUserCoachInTeam($teamId, $user['id']);
            if (!$isCoachInTeam) {
                $this->abort(403, 'Nemáte oprávnění');
            }
        }
        if ($teamId > 0 && $memberId > 0) {
            $this->teams->removeMember($memberId);
            Auth::setFlash('success', 'Člen byl úspěšně odstraněn z týmu!');
        }

        $this->redirect(BASE_URL . '/team/show?id=' . $teamId);
    }

    /** Sanitizuje a validuje vstup formuláře týmu; název je povinný. */
    private function validate(array $input): array
    {
        $data = [
            'nazev' => trim($input['nazev'] ?? ''),
            'popis' => trim($input['popis'] ?? '')
        ];

        if (empty($data['nazev'])) {
            $this->abort(400, 'Název týmu je povinný');
        }

        return $data;
    }

    /** Vrátí true, pokud má uživatel v týmu roli trenéra. */
    private function isUserCoachInTeam(int $teamId, int $userId): bool
    {
        return $this->teams->getUserTeamRole($teamId, $userId) === 'trener';
    }
}
