<?php

namespace App\Controllers\Admin;

use App\Controllers\BaseController;
use App\Models\PromocionModel;
use App\Models\PromocionDiaModel;
use App\Entities\Promocion;

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

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

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

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

    public function crear()
    {
        return view('admin/promociones/crear', [
            'diasSeleccionados' => [],
        ]);
    }

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

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

        $promocion = new Promocion();
        $this->llenarDesdeRequest($promocion);

        if ($model->save($promocion)) {
            $this->guardarDias((int) $model->getInsertID());
            return redirect()->to(base_url('admin/promociones'))->with('success', 'Promoción guardada correctamente.');
        }

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

    public function editar($id)
    {
        $model = new PromocionModel();
        $promocion = $model->find($id);

        if (!$promocion) {
            return redirect()->to(base_url('admin/promociones'))->with('error', 'Promoción no encontrada.');
        }

        $diaModel = new PromocionDiaModel();

        return view('admin/promociones/editar', [
            'promocion' => $promocion,
            'diasSeleccionados' => $diaModel->getDiasDePromocion((int) $id),
        ]);
    }

    public function actualizar($id)
    {
        $model = new PromocionModel();
        $promocion = $model->find($id);

        if (!$promocion) {
            return redirect()->to(base_url('admin/promociones'))->with('error', 'Promoción no encontrada.');
        }

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

        $this->llenarDesdeRequest($promocion);

        if ($model->save($promocion)) {
            $this->guardarDias((int) $id);
            return redirect()->to(base_url('admin/promociones'))->with('success', 'Promoción actualizada correctamente.');
        }

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

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

        try {
            if ($model->delete($id)) {
                return redirect()->to(base_url('admin/promociones'))->with('success', 'Promoción eliminada correctamente.');
            }
        } catch (\Exception $e) {
            return redirect()->to(base_url('admin/promociones'))->with('error', 'No se puede eliminar la promoción porque está asociada a compras.');
        }

        return redirect()->to(base_url('admin/promociones'))->with('error', 'No se pudo eliminar la promoción.');
    }

    /**
     * Copia los campos comunes del formulario (crear/actualizar) a la entidad.
     */
    private function llenarDesdeRequest(Promocion $promocion): void
    {
        $promocion->nombre = $this->request->getPost('nombre');
        $promocion->descripcion = $this->request->getPost('descripcion');
        $promocion->imagen = $this->request->getPost('imagen');
        $promocion->tipo = $this->request->getPost('tipo');
        $promocion->tipo_descuento = $this->request->getPost('tipo_descuento');
        $promocion->valor_descuento = $this->request->getPost('valor_descuento');

        $cantidadMinima = $this->request->getPost('cantidad_minima');
        $promocion->cantidad_minima = ($cantidadMinima !== null && $cantidadMinima !== '') ? (int) $cantidadMinima : 1;

        $tipoSala = $this->request->getPost('aplica_tipo_sala');
        $promocion->aplica_tipo_sala = !empty($tipoSala) ? $tipoSala : null;

        $stock = $this->request->getPost('stock');
        $promocion->stock = ($stock !== null && $stock !== '') ? (int) $stock : null;

        $promocion->fecha_inicio = $this->request->getPost('fecha_inicio');
        $promocion->fecha_fin = $this->request->getPost('fecha_fin');
        $promocion->activo = $this->request->getPost('activo') !== null ? 1 : 0;
    }

    /**
     * Reemplaza los días configurados para la promoción (tabla promocion_dia)
     * según los checkboxes marcados en el formulario.
     */
    private function guardarDias(int $idPromocion): void
    {
        $diaModel = new PromocionDiaModel();
        $diaModel->where('id_promocion', $idPromocion)->delete();

        $diasSeleccionados = (array) $this->request->getPost('dias');
        foreach ($diasSeleccionados as $dia) {
            if (in_array($dia, PromocionDiaModel::DIAS_VALIDOS, true)) {
                $diaModel->insert(['id_promocion' => $idPromocion, 'dia' => $dia]);
            }
        }
    }
}
