<?php

require_once "conexion.php";

class ModeloVentas{

	/*=============================================
	MOSTRAR VENTAS
	=============================================*/

        static public function mdlMostrarVentas($tabla, $item = null, $valor = null, $fechaInicial = null, $fechaFinal = null){

            // Si se proporcionan las fechas
            if($fechaInicial != null && $fechaFinal != null){

                // Asegurar que el rango incluya toda la fecha final
                $fechaInicial .= " 00:00:00";
                $fechaFinal   .= " 23:59:59";

                $stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE fecha BETWEEN :fechaInicial AND :fechaFinal ORDER BY id ASC");
                $stmt->bindParam(":fechaInicial", $fechaInicial, PDO::PARAM_STR);
                $stmt->bindParam(":fechaFinal", $fechaFinal, PDO::PARAM_STR);

            } else if($item != null) {

                $stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE $item = :$item ORDER BY id ASC");
                $stmt->bindParam(":".$item, $valor, PDO::PARAM_STR);

            } else {

                $stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla ORDER BY id ASC");

            }

            $stmt->execute();

            if ($item != null) {
                return $stmt->fetch();
            } else {
                return $stmt->fetchAll();
            }

            $stmt->close();
            $stmt = null;
        }



	/*=============================================
	REGISTRO DE VENTA
	=============================================*/

            static public function mdlIngresarVenta($tabla, $datos){

                $db = Conexion::conectar();

                $stmt = $db->prepare("INSERT INTO $tabla(codigo, id_cliente, id_vendedor, productos, impuesto, neto, total, metodo_pago) 
                                                          VALUES (:codigo, :id_cliente, :id_vendedor, :productos, :impuesto, :neto, :total, :metodo_pago)");

                $stmt->bindParam(":codigo", $datos["codigo"], PDO::PARAM_INT);
                $stmt->bindParam(":id_cliente", $datos["id_cliente"], PDO::PARAM_INT);
                $stmt->bindParam(":id_vendedor", $datos["id_vendedor"], PDO::PARAM_INT);
                $stmt->bindParam(":productos", $datos["productos"], PDO::PARAM_STR);
                $stmt->bindParam(":impuesto", $datos["impuesto"], PDO::PARAM_STR);
                $stmt->bindParam(":neto", $datos["neto"], PDO::PARAM_STR);
                $stmt->bindParam(":total", $datos["total"], PDO::PARAM_STR);
                $stmt->bindParam(":metodo_pago", $datos["metodo_pago"], PDO::PARAM_STR);

                if($stmt->execute()){

                    $idVenta = $db->lastInsertId(); // ID de la venta
                    
                    $ventaReciente = ModeloVentas::mdlMostrarVentas("ventas", "id", $idVenta);
                    $fechaVenta = $ventaReciente["fecha"];

                    // Preparamos los datos para la transacción
                    $datosTransaccion = array(
                    "monto" => (float) $datos["total"],
                    "fecha" => $fechaVenta, // ahora mismo, en formato MySQL
                    "descripcion" => "Venta de productos",
                    "referencia" => $datos["codigo"],
                    "id_usuario" => (int) $datos["id_vendedor"],
                    "id_tipo_transaccion" => TRANSACCION_VENTA, // asegurate que sea el tipo correcto
                    "metodo_pago" => explode('-', strtoupper($datos["metodo_pago"]))[0], // esto es CLAVE
                    "id_venta" => $idVenta // este es el que ahora se va a guardar
                    
                );

                    // Insertamos en transacciones con el método modular
                    $resTransaccion = ModeloTransacciones::mdlIngresarTransaccion("transacciones", $datosTransaccion);

                    if($resTransaccion == "ok"){
                            return "ok";
                    } else {
                            return "error en transacción";
                    }
            }
            else {
                    return "error";
            }

            $stmt->close();
            $stmt = null;
        }


	/*=============================================
	EDITAR VENTA
	=============================================*/

	static public function mdlEditarVenta($tabla, $datos){

		$stmt = Conexion::conectar()->prepare("UPDATE $tabla SET  id_cliente = :id_cliente, id_vendedor = :id_vendedor, productos = :productos, impuesto = :impuesto, neto = :neto, total= :total, metodo_pago = :metodo_pago WHERE codigo = :codigo");

		$stmt->bindParam(":codigo", $datos["codigo"], PDO::PARAM_INT);
		$stmt->bindParam(":id_cliente", $datos["id_cliente"], PDO::PARAM_INT);
		$stmt->bindParam(":id_vendedor", $datos["id_vendedor"], PDO::PARAM_INT);
		$stmt->bindParam(":productos", $datos["productos"], PDO::PARAM_STR);
		$stmt->bindParam(":impuesto", $datos["impuesto"], PDO::PARAM_STR);
		$stmt->bindParam(":neto", $datos["neto"], PDO::PARAM_STR);
		$stmt->bindParam(":total", $datos["total"], PDO::PARAM_STR);
		$stmt->bindParam(":metodo_pago", $datos["metodo_pago"], PDO::PARAM_STR);

		if($stmt->execute()){

			return "ok";

		}else{

			return "error";
		
		}

		$stmt->close();
		$stmt = null;

	}

	/*=============================================
	ELIMINAR VENTA
	=============================================*/

	static public function mdlEliminarVenta($tabla, $datos){

		$stmt = Conexion::conectar()->prepare("DELETE FROM $tabla WHERE id = :id");

		$stmt -> bindParam(":id", $datos, PDO::PARAM_INT);

		if($stmt -> execute()){

			return "ok";
		
		}else{

			return "error";	

		}

		$stmt -> close();

		$stmt = null;

	}

	/*=============================================
	RANGO FECHAS
	=============================================*/	

	static public function mdlRangoFechasVentas($tabla, $fechaInicial, $fechaFinal){

            // Si no se especifica fecha inicial, obtener todas las ventas
            if($fechaInicial == null){
                $stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla ORDER BY id ASC");
                $stmt -> execute();
                $resultados = $stmt -> fetchAll();    
            } else if($fechaInicial == $fechaFinal){
                // Si las fechas son iguales, usamos 'DATE' para comparar solo la parte de la fecha (sin la hora)
                $stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE DATE(fecha) = :fechaFinal");
                $stmt -> bindParam(":fechaFinal", $fechaFinal, PDO::PARAM_STR);
                $stmt -> execute();
                $resultados = $stmt -> fetchAll();
            } else {
                // Lógica para el caso de un rango de fechas
                $fechaActual = new DateTime();
                $fechaActual->add(new DateInterval("P1D"));
                $fechaActualMasUno = $fechaActual->format("Y-m-d");

                $fechaFinal2 = new DateTime($fechaFinal);
                $fechaFinal2->add(new DateInterval("P1D"));
                $fechaFinalMasUno = $fechaFinal2->format("Y-m-d");

                if($fechaFinalMasUno == $fechaActualMasUno){
                    $stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE fecha BETWEEN :fechaInicial AND :fechaFinalMasUno");
                    $stmt->bindParam(":fechaInicial", $fechaInicial, PDO::PARAM_STR);
                    $stmt->bindParam(":fechaFinalMasUno", $fechaFinalMasUno, PDO::PARAM_STR);
                } else {
                    $stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE fecha BETWEEN :fechaInicial AND :fechaFinal");
                    $stmt->bindParam(":fechaInicial", $fechaInicial, PDO::PARAM_STR);
                    $stmt->bindParam(":fechaFinal", $fechaFinal, PDO::PARAM_STR);
                }

                $stmt -> execute();
                $resultados = $stmt -> fetchAll();
            }

            // Ahora procesamos el JSON de cada venta y agregamos la cantidad total de productos
            foreach ($resultados as &$resultado) {
                // Supongamos que el campo JSON en la tabla se llama 'productos'
                if (isset($resultado['productos'])) {
                    // Decodificamos el JSON
                    $productos = json_decode($resultado['productos'], true);

                    // Inicializamos la variable cantidad total
                    $cantidadTotal = 0;

                    // Sumamos la cantidad de cada producto
                    foreach ($productos as $producto) {
                        $cantidadTotal += $producto['cantidad'];
                    }

                    // Agregamos el campo de cantidad total al resultado
                    $resultado['cantidad_total'] = $cantidadTotal;
                } else {
                    $resultado['cantidad_total'] = 0;  // Si no hay productos, la cantidad es 0
                }
            }

            return $resultados;
        }


	/*=============================================
	SUMAR EL TOTAL DE VENTAS
	=============================================*/

	static public function mdlSumaTotalVentas($tabla){	

		$stmt = Conexion::conectar()->prepare("SELECT SUM(neto) as total FROM $tabla");

		$stmt -> execute();

		return $stmt -> fetch();

		$stmt -> close();

		$stmt = null;

	}
        
        // Modelo para obtener los productos agrupados desde JSON
        static public function mdlMostrarProductosAgrupados($tabla, $fechaInicial = null, $fechaFinal = null) {

            // Consulta base para obtener las ventas
            $query = "SELECT * FROM $tabla";

            // Si se proporcionan fechas, las agregamos a la consulta
            if ($fechaInicial != null && $fechaFinal != null) {
                // Aseguramos que las fechas incluyan el rango completo de horas
                $fechaInicial .= " 00:00:00";
                $fechaFinal .= " 23:59:59";

                $query .= " WHERE fecha BETWEEN :fechaInicial AND :fechaFinal";
            }

            // Preparamos la consulta
            $stmt = Conexion::conectar()->prepare($query);

            // Vinculamos las fechas si se proporcionan
            if ($fechaInicial != null && $fechaFinal != null) {
                $stmt->bindParam(":fechaInicial", $fechaInicial, PDO::PARAM_STR);
                $stmt->bindParam(":fechaFinal", $fechaFinal, PDO::PARAM_STR);
            }

            // Ejecutamos la consulta
            $stmt->execute();

            // Obtenemos todas las ventas
            $ventas = $stmt->fetchAll();

            // Inicializamos un arreglo para almacenar los productos agrupados
            $productosAgrupados = [];

            // Iteramos sobre cada venta
            foreach ($ventas as $venta) {
                // Decodificamos el campo 'productos' que está en formato JSON
                $productos = json_decode($venta['productos'], true);

                // Iteramos sobre los productos de cada venta
                foreach ($productos as $producto) {
                    $productoId = $producto['id'];
                    $productoDescripcion = $producto['descripcion'];
                    $productoCantidad = $producto['cantidad'];
                    $productoPrecio = $producto['precio'];
                    $productoTotal = $producto['total'];

                    // Si el producto ya está en el arreglo, agrupamos las cantidades
                    if (isset($productosAgrupados[$productoId])) {
                        $productosAgrupados[$productoId]['cantidad'] += $productoCantidad;
                        $productosAgrupados[$productoId]['total'] += $productoTotal;
                    } else {
                        // Si el producto no está en el arreglo, lo agregamos
                        $productosAgrupados[$productoId] = [
                            'descripcion' => $productoDescripcion,
                            'cantidad' => $productoCantidad,
                            'precio' => $productoPrecio,
                            'total' => $productoTotal
                        ];
                    }
                }
            }

            return $productosAgrupados;
        }



	
}