<?php
// app/Models/DochazkaRepository.php
// Repozitář pro docházku hráčů na události – ukládání, načítání a souhrny (tabulka dochazka).

namespace App\Models;

use App\Models\BaseRepository;
use App\Models\Entities\DochazkaEntity;
use App\Core\Database;

/**
 * Poskytuje metody pro čtení a zápis docházky.
 * Jeden záznam = jeden hráč na jedné události se stavem (pritomen, nepritomen, …).
 */
class DochazkaRepository extends BaseRepository
{
    public function __construct(Database $db)
    {
        parent::__construct($db, 'dochazka', DochazkaEntity::class);
    }

    /**
     * Mapování stavů na klíče pro shrnutí
     */
    private function mapStavToKey($stav)
    {
        $map = [
            'pritomen' => 'pritomny',
            'nepritomen' => 'nepritomny',
            'omluven' => 'omluven',
            'pozdni_prichod' => 'pozde',
            'nevyjadril_se' => 'nevyjadril'
        ];
        return $map[$stav] ?? $stav;
    }

    /**
     * Získá shrnutí docházky pro více událostí
     */
    public function getAttendanceSummaryForMeetings(array $eventIds): array
    {
        if (empty($eventIds)) return [];
        
        $placeholders = implode(',', array_fill(0, count($eventIds), '?'));
        $sql = "SELECT udalost_id, stav, COUNT(*) as cnt 
                FROM dochazka 
                WHERE udalost_id IN ($placeholders) 
                GROUP BY udalost_id, stav";
        
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($eventIds);
        
        $summary = [];
        foreach ($eventIds as $eid) {
            $summary[$eid] = [
                'pritomny' => 0,
                'nepritomny' => 0,
                'omluven' => 0,
                'pozde' => 0,
                'celkem' => 0
            ];
        }
        
        while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
            $eid = $row['udalost_id'];
            $stav = $row['stav'];
            $cnt = (int)$row['cnt'];
            $key = $this->mapStavToKey($stav);
            
            if (isset($summary[$eid][$key])) {
                $summary[$eid][$key] += $cnt;
            }
            $summary[$eid]['celkem'] += $cnt;
        }
        
        return $summary;
    }

    /**
     * Získá docházku pro konkrétní událost
     */
    public function getDochazkaForMeeting($eventId): array
    {
        $sql = "SELECT uzivatel_id, stav FROM dochazka WHERE udalost_id = ?";
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute([$eventId]);
        
        $result = [];
        while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
            $result[$row['uzivatel_id']] = $row['stav'];
        }
        return $result;
    }

    /**
     * Uloží docházku pro událost
     */
    public function saveDochazka($eventId, $dochazka)
    {
        // smaže předchozí docházku pro danou událost
        $sql = "DELETE FROM dochazka WHERE udalost_id = ?";
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute([$eventId]);
        
        // Pak vlož nové záznamy
        foreach ($dochazka as $userId => $stav) {
            $sql = "INSERT INTO dochazka (udalost_id, uzivatel_id, stav) 
                    VALUES (?, ?, ?)";
            $stmt = $this->pdo->prepare($sql);
            $stmt->execute([$eventId, $userId, $stav]);
        }
    }

    /**
     * Získá souhrn docházky uživatele rozdělený podle týmů
     */
    public function getAttendanceSummaryForUser(int $userId): array
    {
        $sql = "SELECT
                    t.id as tym_id,
                    t.nazev as tym_nazev,
                    SUM(CASE WHEN d.stav = 'pritomen' THEN 1 ELSE 0 END) as pritomny,
                    SUM(CASE WHEN d.stav = 'nepritomen' THEN 1 ELSE 0 END) as nepritomny,
                    SUM(CASE WHEN d.stav = 'omluven' THEN 1 ELSE 0 END) as omluven,
                    SUM(CASE WHEN d.stav = 'pozdni_prichod' THEN 1 ELSE 0 END) as pozde,
                    COUNT(*) as celkem
                FROM dochazka d
                JOIN udalosti u ON u.id = d.udalost_id
                JOIN tymy t ON t.id = u.tym_id
                WHERE d.uzivatel_id = ?
                GROUP BY t.id, t.nazev
                ORDER BY t.nazev";

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