<?php
require_once '../services/pdo_connection.php';

class ModelCategoria {
    private $conn;
    private $table_name = "categoria";

    public function __construct() {
        $database = new Database();
        $this->conn = $database->getConnection();
    }

    // Crear nueva categoría
    public function crear($nombre, $descripcion) {
        try {
            $query = "INSERT INTO " . $this->table_name . " (nombre, descripcion) VALUES (:nombre, :descripcion)";
            $stmt = $this->conn->prepare($query);
            
            $stmt->bindParam(':nombre', $nombre);
            $stmt->bindParam(':descripcion', $descripcion);
            
            if ($stmt->execute()) {
                return [
                    'success' => true,
                    'message' => 'Categoría creada exitosamente',
                    'id' => $this->conn->lastInsertId()
                ];
            }
            return ['success' => false, 'message' => 'Error al crear la categoría'];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => 'Error: ' . $e->getMessage()];
        }
    }

    // Leer todas las categorías
    public function leerTodas() {
        try {
            $query = "SELECT id_categoria, nombre, descripcion FROM " . $this->table_name . " ORDER BY nombre ASC";
            $stmt = $this->conn->prepare($query);
            $stmt->execute();
            
            return [
                'success' => true,
                'data' => $stmt->fetchAll(PDO::FETCH_ASSOC)
            ];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => 'Error: ' . $e->getMessage()];
        }
    }

    // Leer una categoría por ID
    public function leerPorId($id) {
        try {
            $query = "SELECT id_categoria, nombre, descripcion FROM " . $this->table_name . " WHERE id_categoria = :id";
            $stmt = $this->conn->prepare($query);
            $stmt->bindParam(':id', $id);
            $stmt->execute();
            
            $resultado = $stmt->fetch(PDO::FETCH_ASSOC);
            if ($resultado) {
                return ['success' => true, 'data' => $resultado];
            }
            return ['success' => false, 'message' => 'Categoría no encontrada'];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => 'Error: ' . $e->getMessage()];
        }
    }

    // Actualizar categoría
    public function actualizar($id, $nombre, $descripcion) {
        try {
            $query = "UPDATE " . $this->table_name . " SET nombre = :nombre, descripcion = :descripcion WHERE id_categoria = :id";
            $stmt = $this->conn->prepare($query);
            
            $stmt->bindParam(':id', $id);
            $stmt->bindParam(':nombre', $nombre);
            $stmt->bindParam(':descripcion', $descripcion);
            
            if ($stmt->execute() && $stmt->rowCount() > 0) {
                return ['success' => true, 'message' => 'Categoría actualizada exitosamente'];
            }
            return ['success' => false, 'message' => 'No se realizaron cambios o categoría no encontrada'];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => 'Error: ' . $e->getMessage()];
        }
    }

    // Eliminar categoría (solo si no tiene productos asociados)
    public function eliminar($id) {
        try {
            // Primero verificar si tiene productos asociados
            $checkQuery = "SELECT COUNT(*) as total FROM producto WHERE id_categoria = :id";
            $checkStmt = $this->conn->prepare($checkQuery);
            $checkStmt->bindParam(':id', $id);
            $checkStmt->execute();
            $result = $checkStmt->fetch(PDO::FETCH_ASSOC);
            
            if ($result['total'] > 0) {
                return ['success' => false, 'message' => 'No se puede eliminar: la categoría tiene productos asociados'];
            }
            
            $query = "DELETE FROM " . $this->table_name . " WHERE id_categoria = :id";
            $stmt = $this->conn->prepare($query);
            $stmt->bindParam(':id', $id);
            
            if ($stmt->execute() && $stmt->rowCount() > 0) {
                return ['success' => true, 'message' => 'Categoría eliminada exitosamente'];
            }
            return ['success' => false, 'message' => 'Categoría no encontrada'];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => 'Error: ' . $e->getMessage()];
        }
    }

    // Verificar si existe una categoría con el mismo nombre (para validaciones)
    public function existeNombre($nombre, $excluirId = null) {
        try {
            $query = "SELECT COUNT(*) as total FROM " . $this->table_name . " WHERE nombre = :nombre";
            if ($excluirId) {
                $query .= " AND id_categoria != :excluir_id";
            }
            
            $stmt = $this->conn->prepare($query);
            $stmt->bindParam(':nombre', $nombre);
            if ($excluirId) {
                $stmt->bindParam(':excluir_id', $excluirId);
            }
            
            $stmt->execute();
            $result = $stmt->fetch(PDO::FETCH_ASSOC);
            return $result['total'] > 0;
        } catch (PDOException $e) {
            return false;
        }
    }

    // Contar productos por categoría
    public function contarProductos($id) {
        try {
            $query = "SELECT COUNT(*) as total FROM producto WHERE id_categoria = :id AND activo = 1";
            $stmt = $this->conn->prepare($query);
            $stmt->bindParam(':id', $id);
            $stmt->execute();
            
            $result = $stmt->fetch(PDO::FETCH_ASSOC);
            return $result['total'];
        } catch (PDOException $e) {
            return 0;
        }
    }
}
?>