<?php
// app/Controllers/AnketaController.php
// Controller pro ankety – výpis, detail, hlasování, vytváření a uzavírání.

namespace App\Controllers;

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

class AnketaController extends Controller
{
    private AnketaRepository $anketaRepo;

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

    /**
     * Zobrazí seznam anket pro tým
     */
    public function index()
    {
        $teamId = $_GET['team_id'] ?? null;
        
        if (!$teamId) {
            $this->view->render('ankety/error', [
                'message' => 'Nebyl zadán tým.'
            ]);
            return;
        }

        $ankety = $this->anketaRepo->getByTeamId((int)$teamId, false);
        
        $this->view->render('teams/ankety/index', [
            'ankety' => $ankety,
            'teamId' => $teamId
        ]);
    }

    /**
     * Zobrazí detail ankety a umožní hlasování
     */
    public function show()
    {
        $pollId = $_GET['id'] ?? null;
        $userId = $_SESSION['user']['id'] ?? null;
        
        if (!$pollId || !$userId) {
            $this->view->render('teams/ankety/error', [
                'message' => 'Anketa se nenašla.'
            ]);
            return;
        }

        $pollId = (int)$pollId;
        $userId = (int)$userId;

        $poll = $this->anketaRepo->getResults($pollId);
        
        if (empty($poll)) {
            $this->view->render('teams/ankety/error', [
                'message' => 'Anketa se nenašla.'
            ]);
            return;
        }

        $hasVoted = $this->anketaRepo->hasUserVoted($pollId, $userId);
        $userVote = $this->anketaRepo->getUserVote($pollId, $userId);

        // Načte data o týmu pro kontrolu oprávnění
        $teamRepo = new \App\Models\TeamRepository($this->db);
        $team = $teamRepo->find($poll['tym_id']);
        $teamArray = is_array($team) ? $team : $team->toArray();
        $members = $teamRepo->getMembers($poll['tym_id']);

        $this->view->render('teams/ankety/show', [
            'poll' => $poll,
            'hasVoted' => $hasVoted,
            'userVote' => $userVote,
            'userId' => $userId,
            'team' => $teamArray,
            'members' => $members
        ]);
    }


    /**
     * Zpracuje hlas uživatele
     */
    public function vote()
    {
        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            $this->view->render('teams/ankety/error', [
                'message' => 'Neplatná metoda.'
            ]);
            return;
        }

        $pollId = $_POST['poll_id'] ?? null;
        $optionId = $_POST['option_id'] ?? null;
        $userId = $_SESSION['user']['id'] ?? null;

        if (!$pollId || !$optionId || !$userId) {
            http_response_code(400);
            echo json_encode(['success' => false, 'message' => 'Chybí povinná pole']);
            exit;
        }

        $success = $this->anketaRepo->vote((int)$pollId, (int)$optionId, (int)$userId);

        if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest') {
            header('Content-Type: application/json');
            echo json_encode([
                'success' => $success,
                'message' => $success ? 'Hlas zaznamenán' : 'Chyba při hlasování'
            ]);
        } else {
            $poll = $this->anketaRepo->getResults((int)$pollId);
            $teamId = $poll['tym_id'] ?? 0;
            // přesměrování na detail týmu na kartu Ankety
            header('Location: ' . BASE_URL . '/team/show?id=' . $teamId . '#polls-tab');
        }
        exit;
    }

    /**
     * Vytvoří novou anketu
     */
    public function create()
    {
        // Trenér, asistent v týmu nebo admin může vytvářet ankety
        $user = Auth::user();
        $teamId = $_GET['team_id'] ?? null;

        if ($user['role'] !== 'admin') {
            $canCreate = false;
            if ($teamId) {
                $teamRepo = new \App\Models\TeamRepository($this->db);
                $teamRole = $teamRepo->getUserTeamRole((int)$teamId, $user['id']);
                $canCreate = ($teamRole === 'trener' || $teamRole === 'asistent');
            }
            if (!$canCreate) {
                http_response_code(403);
                $this->view->render('teams/ankety/error', [
                    'message' => 'Nemáte oprávnění vytvářet ankety'
                ]);
                return;
            }
        }
        
        if (!$teamId) {
            $this->view->render('teams/ankety/error', [
                'message' => 'Nebyl zadán tým.'
            ]);
            return;
        }

        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            $this->storeNew((int)$teamId);
            return;
        }

        $this->view->render('teams/ankety/create', [
            'teamId' => $teamId
        ]);
    }

    /**
     * Uloží novou anketu
     */
    private function storeNew(int $teamId)
    {
        $title = $_POST['title'] ?? '';
        
        $optionInputs = $_POST['option'] ?? [];
        $options = array_filter(
            array_map('trim', $optionInputs),
            fn($o) => !empty($o)
        );
        
        if (empty($title) || count($options) < 2) {
            $this->view->render('teams/ankety/create', [
                'error' => 'Zadejte otázku a alespoň 2 odpovědi',
                'teamId' => $teamId
            ]);
            return;
        }

        try {
            $pollId = $this->anketaRepo->createWithOptions(
                $teamId,
                $title,
                $_SESSION['user']['id'] ?? 0,
                $options
            );
            Auth::setFlash('success', 'Anketa byla úspěšně vytvořena!');
            header('Location: ' . BASE_URL . '/anketa/show?id=' . $pollId);
            exit;
        } catch (\Exception $e) {
            $this->view->render('teams/ankety/create', [
                'error' => 'Chyba při vytváření ankety: ' . $e->getMessage(),
                'teamId' => $teamId
            ]);
        }
    }

    /**
     * Uzavře anketu
     */
    public function deactivate()
    {
        $user = Auth::user();
        $pollId = $_GET['id'] ?? null;
        $teamId = $_GET['team_id'] ?? null;

        if ($user['role'] !== 'admin') {
            $canDeactivate = false;
            if ($teamId) {
                $teamRepo = new \App\Models\TeamRepository($this->db);
                $teamRole = $teamRepo->getUserTeamRole((int)$teamId, $user['id']);
                $canDeactivate = ($teamRole === 'trener' || $teamRole === 'asistent');
            }
            if (!$canDeactivate) {
                http_response_code(403);
                return;
            }
        }
        
        if (!$pollId || !$teamId) {
            http_response_code(400);
            return;
        }

        $this->anketaRepo->deactivate((int)$pollId);
        Auth::setFlash('success', 'Anketa byla úspěšně uzavřena!');
        
        // přesměrování zpět do týmu na kartu Ankety
        $poll = $this->anketaRepo->getResults((int)$pollId);
        $teamId = $poll['tym_id'] ?? 0;
        header('Location: ' . BASE_URL . '/team/show?id=' . $teamId . '#polls-tab');
        exit;
    }
}
