<?php

namespace App\Controllers\Admin;

use App\Controllers\BaseController;
use App\Models\GeneroModel;
use App\Entities\Genero;

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

        $builder = $model;
        if (!empty($q)) {
            $builder = $model->like('nombre', $q);
        }

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

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

    public function crear()
    {
        return view('admin/generos/crear');
    }

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

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

        $genero = new Genero();
        $genero->nombre = $this->request->getPost('nombre');

        if ($model->save($genero)) {
            return redirect()->to(base_url('admin/generos'))->with('success', 'Género guardado correctamente.');
        }

        return redirect()->back()->withInput()->with('error', 'No se pudo guardar el género.');
    }

    public function editar($id)
    {
        $model = new GeneroModel();
        $genero = $model->find($id);

        if (!$genero) {
            return redirect()->to(base_url('admin/generos'))->with('error', 'Género no encontrado.');
        }

        return view('admin/generos/editar', [
            'genero' => $genero
        ]);
    }

    public function actualizar($id)
    {
        $model = new GeneroModel();
        $genero = $model->find($id);

        if (!$genero) {
            return redirect()->to(base_url('admin/generos'))->with('error', 'Género no encontrado.');
        }

        // Reemplazar marcador en la validación is_unique
        $rules = $model->validationRules;
        $rules['nombre'] = "required|min_length[2]|max_length[80]|is_unique[genero.nombre,id_genero,{$id}]";

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

        $genero->nombre = $this->request->getPost('nombre');

        if ($model->save($genero)) {
            return redirect()->to(base_url('admin/generos'))->with('success', 'Género actualizado correctamente.');
        }

        return redirect()->back()->withInput()->with('error', 'No se pudo actualizar el género.');
    }

    public function eliminar($id)
    {
        $model = new GeneroModel();
        
        try {
            if ($model->delete($id)) {
                return redirect()->to(base_url('admin/generos'))->with('success', 'Género eliminado correctamente.');
            }
        } catch (\Exception $e) {
            return redirect()->to(base_url('admin/generos'))->with('error', 'No se puede eliminar el género porque está en uso por alguna película.');
        }

        return redirect()->to(base_url('admin/generos'))->with('error', 'No se pudo eliminar el género.');
    }
}
