<?php
require_once '../models/model_producto_evento.php';

class ControllerProductoEvento {
    private $model;

    public function __construct() {
        $this->model = new ModelProductoEvento();
    }

    public function manejarAccion() {
        $accion = $_REQUEST['accion'] ?? 'listar';
        switch ($accion) {
            case 'listar':              return $this->listar();
            case 'crear':               return $this->crear();
            case 'obtener':             return $this->obtener();
            case 'actualizar':          return $this->actualizar();
            case 'cambiar_estado':      return $this->cambiarEstado();
            case 'eliminar':            return $this->eliminar();
            case 'buscar':              return $this->buscar();
            case 'filtrar_precio':      return $this->filtrarPorPrecio();
            case 'validar_titulo':      return $this->validarTitulo();
            case 'estadisticas':        return $this->estadisticas();
            default:
                return $this->respuestaJson(['success' => false, 'message' => 'Acción no válida']);
        }
    }

    private function listar() {
        try {
            $solo_activos = isset($_GET['solo_activos']) ? (bool)$_GET['solo_activos'] : false;
            $resultado = $this->model->leerTodos($solo_activos);
            return $this->respuestaJson($resultado);
        } catch (Exception $e) {
            return $this->respuestaJson(['success' => false, 'message' => 'Error interno del servidor']);
        }
    }

    private function crear() {
        try {
            if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
                return $this->respuestaJson(['success' => false, 'message' => 'Método no permitido']);
            }

            $datos = $this->obtenerDatosFormulario();
            $valid = $this->validarDatos($datos);
            if (!$valid['valido']) {
                return $this->respuestaJson(['success' => false, 'message' => $valid['mensaje']]);
            }

            if ($this->model->existeTitulo($datos['titulo'])) {
                return $this->respuestaJson(['success' => false, 'message' => 'Ya existe un producto de evento con este título']);
            }

            $foto_url = $this->manejarSubidaImagen();
            $res = $this->model->crear($datos['titulo'], $datos['descripcion'], $datos['precio'], $foto_url, $datos['activo']);
            return $this->respuestaJson($res);
        } catch (Exception $e) {
            return $this->respuestaJson(['success' => false, 'message' => 'Error interno del servidor']);
        }
    }

    private function obtener() {
        try {
            $id = $_GET['id'] ?? null;
            if (!$id || !is_numeric($id)) {
                return $this->respuestaJson(['success' => false, 'message' => 'ID no válido']);
            }
            $res = $this->model->leerPorId($id);
            return $this->respuestaJson($res);
        } catch (Exception $e) {
            return $this->respuestaJson(['success' => false, 'message' => 'Error interno del servidor']);
        }
    }

    private function actualizar() {
        try {
            if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
                return $this->respuestaJson(['success' => false, 'message' => 'Método no permitido']);
            }

            $id = $_POST['id'] ?? null;
            if (!$id || !is_numeric($id)) {
                return $this->respuestaJson(['success' => false, 'message' => 'ID no válido']);
            }

            $datos = $this->obtenerDatosFormulario();
            $valid = $this->validarDatos($datos);
            if (!$valid['valido']) {
                return $this->respuestaJson(['success' => false, 'message' => $valid['mensaje']]);
            }

            if ($this->model->existeTitulo($datos['titulo'], $id)) {
                return $this->respuestaJson(['success' => false, 'message' => 'Ya existe un producto de evento con este título']);
            }

            $foto_url = $this->manejarSubidaImagen();
            if ($foto_url === null) {
                $actual = $this->model->leerPorId($id);
                if ($actual['success']) $foto_url = $actual['data']['foto_url'];
            }

            $res = $this->model->actualizar($id, $datos['titulo'], $datos['descripcion'], $datos['precio'], $foto_url, $datos['activo']);
            return $this->respuestaJson($res);
        } catch (Exception $e) {
            return $this->respuestaJson(['success' => false, 'message' => 'Error interno del servidor']);
        }
    }

    private function cambiarEstado() {
        try {
            if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
                return $this->respuestaJson(['success' => false, 'message' => 'Método no permitido']);
            }
            $id = $_POST['id'] ?? null;
            $activo = isset($_POST['activo']) ? (int)$_POST['activo'] : null;
            if (!$id || !is_numeric($id) || ($activo !== 0 && $activo !== 1)) {
                return $this->respuestaJson(['success' => false, 'message' => 'Datos inválidos']);
            }
            $res = $this->model->cambiarEstado($id, $activo);
            return $this->respuestaJson($res);
        } catch (Exception $e) {
            return $this->respuestaJson(['success' => false, 'message' => 'Error interno del servidor']);
        }
    }

    private function eliminar() {
        try {
            if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
                return $this->respuestaJson(['success' => false, 'message' => 'Método no permitido']);
            }
            $id = $_POST['id'] ?? null;
            if (!$id || !is_numeric($id)) {
                return $this->respuestaJson(['success' => false, 'message' => 'ID no válido']);
            }
            $res = $this->model->eliminar($id);
            return $this->respuestaJson($res);
        } catch (Exception $e) {
            return $this->respuestaJson(['success' => false, 'message' => 'Error interno del servidor']);
        }
    }

    private function buscar() {
        try {
            $termino = trim($_GET['termino'] ?? '');
            $solo_activos = isset($_GET['solo_activos']) ? (bool)$_GET['solo_activos'] : false;
            if (strlen($termino) < 2) {
                return $this->respuestaJson(['success' => false, 'message' => 'El término debe tener al menos 2 caracteres']);
            }
            $res = $this->model->buscar($termino, $solo_activos);
            return $this->respuestaJson($res);
        } catch (Exception $e) {
            return $this->respuestaJson(['success' => false, 'message' => 'Error interno del servidor']);
        }
    }

    private function filtrarPorPrecio() {
        try {
            $min = $_GET['precio_min'] ?? 0;
            $max = $_GET['precio_max'] ?? 999999;
            $solo_activos = isset($_GET['solo_activos']) ? (bool)$_GET['solo_activos'] : false;

            if (!is_numeric($min) || !is_numeric($max) || $min > $max) {
                return $this->respuestaJson(['success' => false, 'message' => 'Rango de precios inválido']);
            }
            $res = $this->model->leerPorRangoPrecio($min, $max, $solo_activos);
            return $this->respuestaJson($res);
        } catch (Exception $e) {
            return $this->respuestaJson(['success' => false, 'message' => 'Error interno del servidor']);
        }
    }

    private function validarTitulo() {
        try {
            $titulo = $_GET['titulo'] ?? '';
            $excluir_id = $_GET['excluir_id'] ?? null;
            if (empty($titulo)) {
                return $this->respuestaJson(['disponible' => false, 'message' => 'Título requerido']);
            }
            $existe = $this->model->existeTitulo($titulo, $excluir_id);
            return $this->respuestaJson([
                'disponible' => !$existe,
                'message' => $existe ? 'Título ya usado' : 'Título disponible'
            ]);
        } catch (Exception $e) {
            return $this->respuestaJson(['disponible' => false, 'message' => 'Error al validar']);
        }
    }

    private function estadisticas() {
        try {
            $id = $_GET['id'] ?? null;
            if (!$id || !is_numeric($id)) {
                return $this->respuestaJson(['success' => false, 'message' => 'ID no válido']);
            }
            $res = $this->model->obtenerEstadisticas($id);
            return $this->respuestaJson($res);
        } catch (Exception $e) {
            return $this->respuestaJson(['success' => false, 'message' => 'Error interno del servidor']);
        }
    }

    /* ---------- helpers ---------- */
    private function obtenerDatosFormulario() {
        return [
            'titulo'      => trim($_POST['titulo'] ?? ''),
            'descripcion' => trim($_POST['descripcion'] ?? ''),
            'precio'      => (float)($_POST['precio'] ?? 0),
            'activo'      => isset($_POST['activo']) ? (int)$_POST['activo'] : 1,
        ];
    }

    private function validarDatos($d) {
        if (empty($d['titulo']))               return ['valido' => false, 'mensaje' => 'El título es requerido'];
        if (strlen($d['titulo']) > 100)        return ['valido' => false, 'mensaje' => 'El título no debe exceder 100 caracteres'];
        if ($d['precio'] <= 0)                 return ['valido' => false, 'mensaje' => 'El precio debe ser mayor a 0'];
        if ($d['precio'] > 999999.99)          return ['valido' => false, 'mensaje' => 'Precio demasiado alto'];
        if (!empty($d['descripcion']) && strlen($d['descripcion']) > 1000)
                                               return ['valido' => false, 'mensaje' => 'La descripción no puede exceder 1000 caracteres'];
        return ['valido' => true, 'mensaje' => 'ok'];
    }

    private function manejarSubidaImagen() {
        if (!isset($_FILES['foto']) || $_FILES['foto']['error'] === UPLOAD_ERR_NO_FILE) return null;
        if ($_FILES['foto']['error'] !== UPLOAD_ERR_OK) throw new Exception('Error al subir la imagen');
    
        $f = $_FILES['foto'];
        $extPermitidas = ['jpg','jpeg','png','gif','webp'];
        $max = 5 * 1024 * 1024;
    
        if ($f['size'] > $max) throw new Exception('La imagen no puede exceder 5MB');
    
        $ext = strtolower(pathinfo($f['name'], PATHINFO_EXTENSION));
        if (!in_array($ext, $extPermitidas)) throw new Exception('Formato no permitido');
    
        // Nombre único
        $nombre = 'evento_' . uniqid('', true) . '.' . $ext;
    
        // RUTAS
        $dirRel = 'uploads/eventos/';                         // lo que guardarás en BD
        $dirAbs = dirname(__DIR__) . '/' . $dirRel;           // /taqueria/uploads/eventos/
    
        // Crear carpeta si no existe
        if (!is_dir($dirAbs) && !mkdir($dirAbs, 0755, true)) {
            throw new Exception('No se pudo crear el directorio de subida');
        }
    
        // Mover archivo
        if (!move_uploaded_file($f['tmp_name'], $dirAbs . $nombre)) {
            throw new Exception('Error al guardar la imagen');
        }
    
        // Devuelve la ruta relativa pública para el <img src="">
        return $dirRel . $nombre;
    }
    

    private function respuestaJson($datos) {
        header('Content-Type: application/json; charset=utf-8');
        echo json_encode($datos, JSON_UNESCAPED_UNICODE);
        exit;
    }
}

if (basename(__FILE__) == basename($_SERVER['SCRIPT_FILENAME'])) {
    $c = new ControllerProductoEvento();
    $c->manejarAccion();
}
