<?php

namespace App\Controllers\Admin;

use App\Controllers\BaseController;
use App\Models\ProductoModel;
use App\Entities\Producto;

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

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

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

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

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

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

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

        $producto = new Producto();
        $producto->nombre = $this->request->getPost('nombre');
        $producto->descripcion = $this->request->getPost('descripcion');
        $producto->precio = $this->request->getPost('precio');
        $producto->categoria = $this->request->getPost('categoria');
        $producto->imagen_url = $this->request->getPost('imagen_url');
        $producto->disponible = $this->request->getPost('disponible') !== null ? 1 : 0;

        if ($model->save($producto)) {
            return redirect()->to(base_url('admin/productos'))->with('success', 'Producto guardado correctamente.');
        }

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

    public function editar($id)
    {
        $model = new ProductoModel();
        $producto = $model->find($id);

        if (!$producto) {
            return redirect()->to(base_url('admin/productos'))->with('error', 'Producto no encontrado.');
        }

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

    public function actualizar($id)
    {
        $model = new ProductoModel();
        $producto = $model->find($id);

        if (!$producto) {
            return redirect()->to(base_url('admin/productos'))->with('error', 'Producto no encontrado.');
        }

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

        $producto->nombre = $this->request->getPost('nombre');
        $producto->descripcion = $this->request->getPost('descripcion');
        $producto->precio = $this->request->getPost('precio');
        $producto->categoria = $this->request->getPost('categoria');
        $producto->imagen_url = $this->request->getPost('imagen_url');
        $producto->disponible = $this->request->getPost('disponible') !== null ? 1 : 0;

        if ($model->save($producto)) {
            return redirect()->to(base_url('admin/productos'))->with('success', 'Producto actualizado correctamente.');
        }

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

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

        try {
            if ($model->delete($id)) {
                return redirect()->to(base_url('admin/productos'))->with('success', 'Producto eliminado correctamente.');
            }
        } catch (\Exception $e) {
            return redirect()->to(base_url('admin/productos'))->with('error', 'No se puede eliminar el producto porque está asociado a reservas previas.');
        }

        return redirect()->to(base_url('admin/productos'))->with('error', 'No se pudo eliminar el producto.');
    }
}
