<?php

declare(strict_types=1);

require_once dirname(__DIR__) . '/includes/bootstrap.php';
require_login();

$pageTitle = 'Partidos';
$currentNav = 'partidos';

function equipos_del_campeonato(int $cid): array
{
    $st = db()->prepare(
        "SELECT e.id, e.nombre FROM campeonato_equipo ce
         INNER JOIN equipos e ON e.id = ce.equipo_id
         WHERE ce.campeonato_id = ? AND ce.estado IN ('inscrito','activo')
         ORDER BY e.nombre"
    );
    $st->execute([$cid]);
    return $st->fetchAll();
}

function validar_equipos_en_campeonato(int $cid, int $e1, int $e2): bool
{
    if ($e1 === $e2) {
        return false;
    }
    $st = db()->prepare(
        'SELECT COUNT(*) FROM campeonato_equipo WHERE campeonato_id = ? AND equipo_id IN (?,?) AND estado IN (\'inscrito\',\'activo\')'
    );
    $st->execute([$cid, $e1, $e2]);
    return (int) $st->fetchColumn() === 2;
}

$campeonatoSel = (int) ($_GET['campeonato_id'] ?? 0);
$editPartido = null;
if (isset($_GET['edit'])) {
    $pid = (int) $_GET['edit'];
    $st = db()->prepare(
        'SELECT p.*, c.nombre AS campeonato_nombre, el.nombre AS nlocal, ev.nombre AS nvisit
         FROM partidos p
         INNER JOIN campeonatos c ON c.id = p.campeonato_id
         INNER JOIN equipos el ON el.id = p.equipo_local_id
         INNER JOIN equipos ev ON ev.id = p.equipo_visitante_id
         WHERE p.id = ?'
    );
    $st->execute([$pid]);
    $editPartido = $st->fetch();
    if ($editPartido) {
        $campeonatoSel = (int) $editPartido['campeonato_id'];
    }
}

if ($_SERVER['REQUEST_METHOD'] === 'POST' && can_manage_data()) {
    verify_csrf();
    $action = $_POST['action'] ?? '';
    if ($action === 'delete') {
        db()->prepare('DELETE FROM partidos WHERE id = ?')->execute([(int) ($_POST['id'] ?? 0)]);
        flash('ok', 'Partido eliminado.');
        redirect('/pages/partidos.php');
    }
    if ($action === 'nuevo') {
        $cid = (int) ($_POST['campeonato_id'] ?? 0);
        $loc = (int) ($_POST['equipo_local_id'] ?? 0);
        $vis = (int) ($_POST['equipo_visitante_id'] ?? 0);
        $fp = (string) ($_POST['fecha_programada'] ?? '');
        $eid = (int) ($_POST['estadio_id'] ?? 0);
        if ($cid && $loc && $vis && $fp !== '' && validar_equipos_en_campeonato($cid, $loc, $vis)) {
            $sql = 'INSERT INTO partidos (campeonato_id, equipo_local_id, equipo_visitante_id, fecha_programada, estadio_id, estado)
                    VALUES (?,?,?,?,?,?)';
            $est = (string) ($_POST['estado'] ?? 'programado');
            db()->prepare($sql)->execute([
                $cid, $loc, $vis, $fp, $eid ?: null, $est,
            ]);
            flash('ok', 'Partido programado.');
        } else {
            flash('err', 'Datos inválidos o equipos no inscritos en el campeonato.');
        }
        redirect('/pages/partidos.php?campeonato_id=' . $cid);
    }
    if ($action === 'actualizar') {
        $id = (int) ($_POST['id'] ?? 0);
        $gl = (int) ($_POST['goles_local'] ?? 0);
        $gv = (int) ($_POST['goles_visitante'] ?? 0);
        $est = (string) ($_POST['estado'] ?? 'programado');
        // La tabla de posiciones solo cuenta partidos finalizados (vista SQL). Si el acta se guarda
        // aún como programado/en_juego, pasar a finalizado salvo aplazado o suspendido.
        if (in_array($est, ['programado', 'en_juego'], true)) {
            $est = 'finalizado';
        }
        $fp = (string) ($_POST['fecha_programada'] ?? '');
        $uid = current_user()['id'] ?? null;
        if ($id && $fp !== '') {
            $sql = 'UPDATE partidos SET goles_local=?, goles_visitante=?, estado=?, fecha_programada=?, registrado_por=? WHERE id=?';
            db()->prepare($sql)->execute([$gl, $gv, $est, $fp, $uid, $id]);
            flash('ok', 'Partido actualizado.');
        }
        redirect('/pages/partidos.php?edit=' . $id);
    }
}

$cams = db()->query('SELECT id, nombre FROM campeonatos ORDER BY nombre')->fetchAll();
$estadios = db()->query('SELECT id, nombre FROM estadios ORDER BY nombre')->fetchAll();
$equiposCam = $campeonatoSel ? equipos_del_campeonato($campeonatoSel) : [];

$q = 'SELECT p.id, p.jornada, p.fecha_programada, p.estado, p.goles_local, p.goles_visitante,
             c.nombre AS campeonato, el.nombre AS local, ev.nombre AS visitante
      FROM partidos p
      INNER JOIN campeonatos c ON c.id = p.campeonato_id
      INNER JOIN equipos el ON el.id = p.equipo_local_id
      INNER JOIN equipos ev ON ev.id = p.equipo_visitante_id';
$params = [];
if ($campeonatoSel) {
    $q .= ' WHERE p.campeonato_id = ?';
    $params[] = $campeonatoSel;
}
$q .= ' ORDER BY p.fecha_programada DESC';
$st = db()->prepare($q);
$st->execute($params);
$lista = $st->fetchAll();

require dirname(__DIR__) . '/includes/layout/header.php';
?>

<?php if (flash('ok')) : ?>
  <div class="alert alert-success"><?= h((string) flash('ok')) ?></div>
<?php endif; ?>
<?php if (flash('err')) : ?>
  <div class="alert alert-error"><?= h((string) flash('err')) ?></div>
<?php endif; ?>

<div class="card" style="margin-bottom:1rem;">
  <div class="card-header">
    <h2>Filtrar por campeonato</h2>
  </div>
  <form method="get" class="form-grid" style="padding:1rem 1.25rem;max-width:480px;">
    <div>
      <label class="field" for="campeonato_id">Campeonato</label>
      <select id="campeonato_id" name="campeonato_id" onchange="this.form.submit()">
        <option value="0">Todos</option>
        <?php foreach ($cams as $c) : ?>
          <option value="<?= (int) $c['id'] ?>" <?= $campeonatoSel === (int) $c['id'] ? 'selected' : '' ?>><?= h($c['nombre']) ?></option>
        <?php endforeach; ?>
      </select>
    </div>
  </form>
</div>

<?php if (can_manage_data()) : ?>
<div class="card" style="margin-bottom:1.5rem;">
  <div class="card-header">
    <h2>Programar partido</h2>
  </div>
  <?php if (!$campeonatoSel) : ?>
    <p style="padding:1rem 1.25rem;color:#64748b;margin:0;">Elige un <strong>campeonato</strong> en el filtro superior para cargar los equipos inscritos y poder crear un encuentro.</p>
  <?php else : ?>
  <form method="post" class="form-grid cols-2">
    <?= csrf_field() ?>
    <input type="hidden" name="action" value="nuevo">
    <input type="hidden" name="campeonato_id" value="<?= (int) $campeonatoSel ?>">
    <div>
      <label class="field" for="fecha_programada_n">Fecha y hora</label>
      <input type="datetime-local" id="fecha_programada_n" name="fecha_programada" required>
    </div>
    <div>
      <label class="field" for="equipo_local_id">Equipo local</label>
      <select id="equipo_local_id" name="equipo_local_id" required>
        <option value="">— Elegir —</option>
        <?php foreach ($equiposCam as $e) : ?>
          <option value="<?= (int) $e['id'] ?>"><?= h($e['nombre']) ?></option>
        <?php endforeach; ?>
      </select>
    </div>
    <div>
      <label class="field" for="equipo_visitante_id">Equipo visitante</label>
      <select id="equipo_visitante_id" name="equipo_visitante_id" required>
        <option value="">— Elegir —</option>
        <?php foreach ($equiposCam as $e) : ?>
          <option value="<?= (int) $e['id'] ?>"><?= h($e['nombre']) ?></option>
        <?php endforeach; ?>
      </select>
    </div>
    <div>
      <label class="field" for="estadio_id">Estadio</label>
      <select id="estadio_id" name="estadio_id">
        <option value="">—</option>
        <?php foreach ($estadios as $es) : ?>
          <option value="<?= (int) $es['id'] ?>"><?= h($es['nombre']) ?></option>
        <?php endforeach; ?>
      </select>
    </div>
    <div>
      <label class="field" for="estado_n">Estado inicial</label>
      <select id="estado_n" name="estado">
        <?php foreach (['programado', 'en_juego'] as $es) : ?>
          <option value="<?= h($es) ?>"><?= h($es) ?></option>
        <?php endforeach; ?>
      </select>
    </div>
    <div class="form-actions" style="grid-column:1/-1;">
      <button type="submit" class="btn btn-primary">Crear partido</button>
    </div>
  </form>
  <?php endif; ?>
</div>
<?php endif; ?>

<?php if ($editPartido && can_manage_data()) : ?>
<div class="card" style="margin-bottom:1.5rem;border:2px solid #0ea5e9;">
  <div class="card-header">
    <h2>Acta: <?= h($editPartido['nlocal']) ?> vs <?= h($editPartido['nvisit']) ?></h2>
    <span class="badge badge-muted"><?= h($editPartido['campeonato_nombre']) ?></span>
  </div>
  <form method="post" class="form-grid cols-2">
    <?= csrf_field() ?>
    <input type="hidden" name="action" value="actualizar">
    <input type="hidden" name="id" value="<?= (int) $editPartido['id'] ?>">
    <div>
      <label class="field" for="fecha_programada_e">Fecha programada</label>
      <input type="datetime-local" id="fecha_programada_e" name="fecha_programada" required
        value="<?= h(str_replace(' ', 'T', substr((string) $editPartido['fecha_programada'], 0, 16))) ?>">
    </div>
    <div>
      <label class="field" for="estado_e">Estado</label>
      <select id="estado_e" name="estado">
        <?php foreach (['programado', 'en_juego', 'finalizado', 'suspendido', 'aplazado', 'wo'] as $es) : ?>
          <option value="<?= h($es) ?>" <?= $editPartido['estado'] === $es ? 'selected' : '' ?>><?= h($es) ?></option>
        <?php endforeach; ?>
      </select>
    </div>
    <div>
      <label class="field" for="goles_local">Goles local</label>
      <input type="number" id="goles_local" name="goles_local" min="0" max="99" value="<?= (int) $editPartido['goles_local'] ?>">
    </div>
    <div>
      <label class="field" for="goles_visitante">Goles visitante</label>
      <input type="number" id="goles_visitante" name="goles_visitante" min="0" max="99" value="<?= (int) $editPartido['goles_visitante'] ?>">
    </div>
    <div class="form-actions" style="grid-column:1/-1;">
      <button type="submit" class="btn btn-primary">Guardar acta</button>
      <a class="btn btn-ghost" href="<?= h(url('pages/partidos.php')) ?>">Cerrar edición</a>
    </div>
  </form>
</div>
<?php endif; ?>

<div class="card">
  <div class="card-header"><h2>Calendario</h2></div>
  <div class="table-wrap">
    <table class="data-table">
      <thead>
        <tr>
          <th>Campeonato</th>
          <th>Local</th>
          <th>Visitante</th>
          <th>Fecha</th>
          <th>Marcador</th>
          <th>Estado</th>
          <th></th>
        </tr>
      </thead>
      <tbody>
        <?php foreach ($lista as $row) : ?>
          <tr>
            <td><?= h($row['campeonato']) ?></td>
            <td><?= h($row['local']) ?></td>
            <td><?= h($row['visitante']) ?></td>
            <td><?= h($row['fecha_programada']) ?></td>
            <td><?= (int) $row['goles_local'] ?> - <?= (int) $row['goles_visitante'] ?></td>
            <td><span class="badge <?= $row['estado'] === 'finalizado' ? 'badge-ok' : 'badge-warn' ?>"><?= h($row['estado']) ?></span></td>
            <td>
              <?php if (can_manage_data()) : ?>
                <a href="<?= h(url('pages/partidos.php?edit=' . (int) $row['id'])) ?>">Editar</a>
                <form method="post" style="display:inline;margin-left:0.5rem;" onsubmit="return confirm('¿Eliminar partido?');">
                  <?= csrf_field() ?>
                  <input type="hidden" name="action" value="delete">
                  <input type="hidden" name="id" value="<?= (int) $row['id'] ?>">
                  <button type="submit" class="btn btn-danger" style="padding:0.25rem 0.5rem;font-size:0.8rem;">Eliminar</button>
                </form>
              <?php endif; ?>
            </td>
          </tr>
        <?php endforeach; ?>
      </tbody>
    </table>
  </div>
  <?php if (!$lista) : ?><div class="empty-state">No hay partidos.</div><?php endif; ?>
</div>

<?php require dirname(__DIR__) . '/includes/layout/footer.php'; ?>
