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

class ControllerCategoria {
    private $model;

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

    // Manejar todas las acciones desde una sola entrada
    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 'eliminar':
                return $this->eliminar();
            case 'validar_nombre':
                return $this->validarNombre();
            default:
                return $this->respuestaJson(['success' => false, 'message' => 'Acción no válida']);
        }
    }

    // Listar todas las categorías
    private function listar() {
        try {
            $resultado = $this->model->leerTodas();
            if ($resultado['success']) {
                // Agregar conteo de productos a cada categoría
                foreach ($resultado['data'] as &$categoria) {
                    $categoria['total_productos'] = $this->model->contarProductos($categoria['id_categoria']);
                }
            }
            return $this->respuestaJson($resultado);
        } catch (Exception $e) {
            return $this->respuestaJson(['success' => false, 'message' => 'Error interno del servidor']);
        }
    }

    // Crear nueva categoría
    private function crear() {
        try {
            // Validar método HTTP
            if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
                return $this->respuestaJson(['success' => false, 'message' => 'Método no permitido']);
            }

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

            // Verificar que no exista el nombre
            if ($this->model->existeNombre($datos['nombre'])) {
                return $this->respuestaJson(['success' => false, 'message' => 'Ya existe una categoría con este nombre']);
            }

            // Crear categoría
            $resultado = $this->model->crear($datos['nombre'], $datos['descripcion']);
            return $this->respuestaJson($resultado);

        } catch (Exception $e) {
            return $this->respuestaJson(['success' => false, 'message' => 'Error interno del servidor']);
        }
    }

    // Obtener una categoría por ID
    private function obtener() {
        try {
            $id = $_GET['id'] ?? null;
            
            if (!$id || !is_numeric($id)) {
                return $this->respuestaJson(['success' => false, 'message' => 'ID de categoría no válido']);
            }

            $resultado = $this->model->leerPorId($id);
            if ($resultado['success']) {
                $resultado['data']['total_productos'] = $this->model->contarProductos($id);
            }
            
            return $this->respuestaJson($resultado);

        } catch (Exception $e) {
            return $this->respuestaJson(['success' => false, 'message' => 'Error interno del servidor']);
        }
    }

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

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

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

            // Verificar que no exista el nombre (excluyendo la categoría actual)
            if ($this->model->existeNombre($datos['nombre'], $id)) {
                return $this->respuestaJson(['success' => false, 'message' => 'Ya existe una categoría con este nombre']);
            }

            // Actualizar categoría
            $resultado = $this->model->actualizar($id, $datos['nombre'], $datos['descripcion']);
            return $this->respuestaJson($resultado);

        } catch (Exception $e) {
            return $this->respuestaJson(['success' => false, 'message' => 'Error interno del servidor']);
        }
    }

    // Eliminar categoría
    private function eliminar() {
        try {
            // Validar método HTTP
            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 de categoría no válido']);
            }

            $resultado = $this->model->eliminar($id);
            return $this->respuestaJson($resultado);

        } catch (Exception $e) {
            return $this->respuestaJson(['success' => false, 'message' => 'Error interno del servidor']);
        }
    }

    // Validar nombre de categoría (AJAX)
    private function validarNombre() {
        try {
            $nombre = $_GET['nombre'] ?? '';
            $excluir_id = $_GET['excluir_id'] ?? null;

            if (empty($nombre)) {
                return $this->respuestaJson(['disponible' => false, 'message' => 'Nombre requerido']);
            }

            $existe = $this->model->existeNombre($nombre, $excluir_id);
            return $this->respuestaJson([
                'disponible' => !$existe,
                'message' => $existe ? 'Este nombre ya está en uso' : 'Nombre disponible'
            ]);

        } catch (Exception $e) {
            return $this->respuestaJson(['disponible' => false, 'message' => 'Error al validar']);
        }
    }

    // Obtener datos del formulario
    private function obtenerDatosFormulario() {
        return [
            'nombre' => trim($_POST['nombre'] ?? ''),
            'descripcion' => trim($_POST['descripcion'] ?? '')
        ];
    }

    // Validar datos de entrada
    private function validarDatos($datos) {
        // Validar nombre
        if (empty($datos['nombre'])) {
            return ['valido' => false, 'mensaje' => 'El nombre de la categoría es requerido'];
        }

        if (strlen($datos['nombre']) > 60) {
            return ['valido' => false, 'mensaje' => 'El nombre no puede exceder 60 caracteres'];
        }

        if (!preg_match('/^[a-zA-ZñÑáéíóúÁÉÍÓÚ\s]+$/', $datos['nombre'])) {
            return ['valido' => false, 'mensaje' => 'El nombre solo puede contener letras y espacios'];
        }

        // Validar descripción (opcional)
        if (!empty($datos['descripcion']) && strlen($datos['descripcion']) > 255) {
            return ['valido' => false, 'mensaje' => 'La descripción no puede exceder 255 caracteres'];
        }

        return ['valido' => true, 'mensaje' => 'Datos válidos'];
    }

    // Sanitizar cadena de texto
    private function sanitizar($texto) {
        return htmlspecialchars(trim($texto), ENT_QUOTES, 'UTF-8');
    }

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

    // Método público para obtener categorías (para usar en otros controladores)
    public function obtenerCategoriasActivas() {
        return $this->model->leerTodas();
    }
}

// Ejecutar el controlador si se accede directamente
if (basename(__FILE__) == basename($_SERVER['SCRIPT_FILENAME'])) {
    $controller = new ControllerCategoria();
    $controller->manejarAccion();
}
?>