<?php

namespace App\Controllers\Admin;

use App\Controllers\BaseController;
use App\Models\SalaModel;
use App\Models\LocalModel;
use App\Models\AsientoModel;
use App\Entities\Sala;

class Salas extends BaseController
{
    public function index()
    {
        $model = new SalaModel();
        $q = $this->request->getGet('q');

        $builder = $model->select('sala.*, local.nombre as local_nombre')
                         ->join('local', 'local.id_local = sala.id_local');

        if (!empty($q)) {
            $builder->groupStart()
                    ->like('sala.nombre', $q)
                    ->orLike('local.nombre', $q)
                    ->orLike('sala.tipo', $q)
                    ->groupEnd();
        }

        $salas = $builder->paginate(10, 'default');

        // Adjuntar el conteo de asientos configurados por sala, para poder
        // avisar en la vista cuáles salas quedaron sin butacas (bug histórico).
        $asientoModel = new AsientoModel();
        foreach ($salas as $sala) {
            $sala->total_asientos = $asientoModel->where('id_sala', $sala->id_sala)->countAllResults();
        }

        return view('admin/salas/index', [
            'salas' => $salas,
            'pager' => $model->pager,
            'q'     => $q
        ]);
    }

    public function crear()
    {
        $localModel = new LocalModel();
        return view('admin/salas/crear', [
            'locales' => $localModel->where('estado', 1)->findAll()
        ]);
    }

    public function guardar()
    {
        $model = new SalaModel();

        if (!$this->validate($model->validationRules)) {
            return redirect()->back()->withInput()->with('errors', $this->validator->getErrors());
        }

        $sala = new Sala();
        $sala->id_local = $this->request->getPost('id_local');
        $sala->nombre = $this->request->getPost('nombre');
        $sala->tipo = $this->request->getPost('tipo');
        $sala->capacidad = $this->request->getPost('capacidad');
        $sala->estado = $this->request->getPost('estado') !== null ? 1 : 0;

        if ($model->save($sala)) {
            $id_sala = $model->getInsertID();

            // Generar automáticamente el mapa de butacas según la capacidad indicada.
            // Antes, las salas se creaban sin ningún asiento y las funciones que se
            // programaban en ellas quedaban sin butacas seleccionables para el cliente.
            try {
                $asientoModel = new AsientoModel();
                $asientoModel->generarAsientosParaSala((int) $id_sala, (int) $sala->capacidad);
            } catch (\Throwable $e) {
                log_message('error', 'No se pudieron generar los asientos de la sala ' . $id_sala . ': ' . $e->getMessage());
            }

            return redirect()->to(base_url('admin/salas'))->with('success', 'Sala guardada correctamente.');
        }

        return redirect()->back()->withInput()->with('error', 'No se pudo guardar la sala.');
    }

    public function editar($id)
    {
        $model = new SalaModel();
        $localModel = new LocalModel();
        
        $sala = $model->find($id);
        if (!$sala) {
            return redirect()->to(base_url('admin/salas'))->with('error', 'Sala no encontrada.');
        }

        return view('admin/salas/editar', [
            'sala' => $sala,
            'locales' => $localModel->where('estado', 1)->findAll()
        ]);
    }

    public function actualizar($id)
    {
        $model = new SalaModel();
        $sala = $model->find($id);

        if (!$sala) {
            return redirect()->to(base_url('admin/salas'))->with('error', 'Sala no encontrada.');
        }

        if (!$this->validate($model->validationRules)) {
            return redirect()->back()->withInput()->with('errors', $this->validator->getErrors());
        }

        $sala->id_local = $this->request->getPost('id_local');
        $sala->nombre = $this->request->getPost('nombre');
        $sala->tipo = $this->request->getPost('tipo');
        $sala->capacidad = $this->request->getPost('capacidad');
        $sala->estado = $this->request->getPost('estado') !== null ? 1 : 0;

        if ($model->save($sala)) {
            return redirect()->to(base_url('admin/salas'))->with('success', 'Sala actualizada correctamente.');
        }

        return redirect()->back()->withInput()->with('error', 'No se pudo actualizar la sala.');
    }

    public function eliminar($id)
    {
        $model = new SalaModel();

        try {
            if ($model->delete($id)) {
                return redirect()->to(base_url('admin/salas'))->with('success', 'Sala eliminada correctamente.');
            }
        } catch (\Exception $e) {
            return redirect()->to(base_url('admin/salas'))->with('error', 'No se puede eliminar la sala porque está asociada a funciones o asientos.');
        }

        return redirect()->to(base_url('admin/salas'))->with('error', 'No se pudo eliminar la sala.');
    }

    /**
     * Genera (o regenera) el mapa de butacas de una sala existente.
     * Pensado para reparar salas creadas antes de que la generación fuera automática,
     * las cuales quedaron sin ningún asiento seleccionable.
     */
    public function generarAsientos($id)
    {
        $model = new SalaModel();
        $sala = $model->find($id);

        if (!$sala) {
            return redirect()->to(base_url('admin/salas'))->with('error', 'Sala no encontrada.');
        }

        $asientoModel = new AsientoModel();
        $existentes = $asientoModel->where('id_sala', $sala->id_sala)->countAllResults();

        if ($existentes > 0) {
            return redirect()->to(base_url('admin/salas'))->with('error', 'Esta sala ya tiene asientos configurados.');
        }

        $generados = $asientoModel->generarAsientosParaSala((int) $sala->id_sala, (int) $sala->capacidad);

        if ($generados > 0) {
            return redirect()->to(base_url('admin/salas'))->with('success', "Se generaron {$generados} asientos para la sala.");
        }

        return redirect()->to(base_url('admin/salas'))->with('error', 'No se pudieron generar los asientos. Verifica que la sala tenga una capacidad válida.');
    }
}
