<?php

namespace App\Controllers\Admin;

use App\Controllers\BaseController;
use App\Models\PeliculaModel;
use App\Models\GeneroModel;
use App\Entities\Pelicula;

class Peliculas extends BaseController
{
    /**
     * Listado de películas con paginación y búsqueda
     */
    public function index()
    {
        $model = new PeliculaModel();
        $q = $this->request->getGet('q');

        // Construir consulta con JOIN para el género
        $builder = $model->select('pelicula.*, genero.nombre as genero_nombre')
                         ->join('genero', 'genero.id_genero = pelicula.id_genero');

        if (!empty($q)) {
            $builder->groupStart()
                    ->like('pelicula.titulo', $q)
                    ->orLike('genero.nombre', $q)
                    ->groupEnd();
        }

        // Paginación nativa de CodeIgniter 4
        $peliculas = $builder->paginate(5, 'default');
        $pager = $model->pager;

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

    /**
     * Formulario de creación
     */
    public function crear()
    {
        $generoModel = new GeneroModel();
        
        return view('admin/peliculas/crear', [
            'generos' => $generoModel->findAll()
        ]);
    }

    /**
     * Guardar nueva película
     */
    public function guardar()
    {
        $model = new PeliculaModel();

        // Validaciones
        $rules = [
            'id_genero'     => 'required|integer',
            'titulo'        => 'required|min_length[2]|max_length[200]',
            'sinopsis'      => 'permit_empty',
            'duracion_min'  => 'required|integer|greater_than[0]',
            'clasificacion' => 'required|in_list[G,PG,PG-13,R,NC-17]',
            'idioma'        => 'required|min_length[2]|max_length[50]',
            'poster_url'    => 'permit_empty|max_length[500]',
            'trailer_url'   => 'permit_empty|max_length[500]'
        ];

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

        // Instancia de Entity
        $pelicula = new Pelicula();
        $pelicula->id_genero = $this->request->getPost('id_genero');
        $pelicula->titulo = $this->request->getPost('titulo');
        $pelicula->sinopsis = $this->request->getPost('sinopsis');
        $pelicula->duracion_min = $this->request->getPost('duracion_min');
        $pelicula->clasificacion = $this->request->getPost('clasificacion');
        $pelicula->idioma = $this->request->getPost('idioma');
        $pelicula->trailer_url = $this->request->getPost('trailer_url');
        $pelicula->estado = $this->request->getPost('estado') !== null ? 1 : 0;

        // Procesar poster (archivo subido o URL externa)
        $file = $this->request->getFile('poster_file');
        if ($file && $file->isValid() && !$file->hasMoved()) {
            // Guardar localmente
            $newName = $file->getRandomName();
            $file->move(FCPATH . 'uploads/posters', $newName);
            $pelicula->poster_url = $newName;
        } else {
            // Si no hay archivo, usar el campo de texto URL
            $pelicula->poster_url = $this->request->getPost('poster_url');
        }

        if ($model->save($pelicula)) {
            return redirect()->to(base_url('admin/peliculas'))->with('success', 'Película agregada correctamente.');
        }

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

    /**
     * Formulario de edición
     */
    public function editar($id)
    {
        $model = new PeliculaModel();
        $generoModel = new GeneroModel();

        $pelicula = $model->find($id);
        if (!$pelicula) {
            return redirect()->to(base_url('admin/peliculas'))->with('error', 'Película no encontrada.');
        }

        return view('admin/peliculas/editar', [
            'pelicula' => $pelicula,
            'generos'  => $generoModel->findAll()
        ]);
    }

    /**
     * Actualizar cambios
     */
    public function actualizar($id)
    {
        $model = new PeliculaModel();
        
        $pelicula = $model->find($id);
        if (!$pelicula) {
            return redirect()->to(base_url('admin/peliculas'))->with('error', 'Película no encontrada.');
        }

        // Validaciones
        $rules = [
            'id_genero'     => 'required|integer',
            'titulo'        => 'required|min_length[2]|max_length[200]',
            'sinopsis'      => 'permit_empty',
            'duracion_min'  => 'required|integer|greater_than[0]',
            'clasificacion' => 'required|in_list[G,PG,PG-13,R,NC-17]',
            'idioma'        => 'required|min_length[2]|max_length[50]',
            'poster_url'    => 'permit_empty|max_length[500]',
            'trailer_url'   => 'permit_empty|max_length[500]'
        ];

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

        // Llenar datos en Entity
        $pelicula->id_genero = $this->request->getPost('id_genero');
        $pelicula->titulo = $this->request->getPost('titulo');
        $pelicula->sinopsis = $this->request->getPost('sinopsis');
        $pelicula->duracion_min = $this->request->getPost('duracion_min');
        $pelicula->clasificacion = $this->request->getPost('clasificacion');
        $pelicula->idioma = $this->request->getPost('idioma');
        $pelicula->trailer_url = $this->request->getPost('trailer_url');
        $pelicula->estado = $this->request->getPost('estado') !== null ? 1 : 0;

        // Procesar poster
        $file = $this->request->getFile('poster_file');
        if ($file && $file->isValid() && !$file->hasMoved()) {
            // Eliminar poster viejo si era local
            $oldPoster = $pelicula->poster_url;
            if (!empty($oldPoster) && !filter_var($oldPoster, FILTER_VALIDATE_URL)) {
                $oldPath = FCPATH . 'uploads/posters/' . $oldPoster;
                if (file_exists($oldPath)) {
                    unlink($oldPath);
                }
            }

            // Guardar el nuevo
            $newName = $file->getRandomName();
            $file->move(FCPATH . 'uploads/posters', $newName);
            $pelicula->poster_url = $newName;
        } else {
            // Si no subió archivo nuevo, mantener el del campo de texto (URL o nombre existente)
            $newUrl = $this->request->getPost('poster_url');
            if ($newUrl !== null) {
                $pelicula->poster_url = $newUrl;
            }
        }

        if ($model->save($pelicula)) {
            return redirect()->to(base_url('admin/peliculas'))->with('success', 'Película actualizada correctamente.');
        }

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

    /**
     * Eliminar película con manejo inteligente de restricciones FK
     */
    public function eliminar($id)
    {
        $model = new PeliculaModel();
        $pelicula = $model->find($id);

        if (!$pelicula) {
            return redirect()->to(base_url('admin/peliculas'))->with('error', 'Película no encontrada.');
        }

        try {
            // Intentar eliminación física
            $model->delete($id);

            // Eliminar archivo local de poster si correspondía
            $oldPoster = $pelicula->poster_url;
            if (!empty($oldPoster) && !filter_var($oldPoster, FILTER_VALIDATE_URL)) {
                $oldPath = FCPATH . 'uploads/posters/' . $oldPoster;
                if (file_exists($oldPath)) {
                    unlink($oldPath);
                }
            }

            return redirect()->to(base_url('admin/peliculas'))->with('success', 'Película eliminada de la base de datos.');
        } catch (\CodeIgniter\Database\Exceptions\DatabaseException $e) {
            // Si falla por restricción de clave foránea (funciones programadas asociadas)
            // Desactivamos la película como soft-delete
            $pelicula->estado = 0;
            $model->save($pelicula);

            return redirect()->to(base_url('admin/peliculas'))->with('success', 'La película tiene funciones programadas y no puede eliminarse físicamente. Se ha desactivado en su lugar.');
        }
    }
}
