<?php

require_once "conexion.php";
require_once __DIR__ . '/../config/config.php';

class ModeloCompras{

	/*=============================================
	MOSTRAR COMPRAS
	=============================================*/

	static public function mdlMostrarCompras($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 
                                                        referencia,
                                                        DATE(fecha) AS fecha,
                                                        id_proveedor,
                                                        id_usuario,
                                                        SUM(precio * cantidad) AS total FROM $tabla WHERE codigo_tipo_operacion='001' and fecha BETWEEN :fechaInicial AND :fechaFinal GROUP BY 
                                                        referencia, DATE(fecha), id_proveedor, id_usuario ORDER BY DATE(fecha) ASC");
                $stmt->bindParam(":fechaInicial", $fechaInicial, PDO::PARAM_STR);
                $stmt->bindParam(":fechaFinal", $fechaFinal, PDO::PARAM_STR);

            } else if($item != null) {

                $stmt = Conexion::conectar()->prepare("SELECT referencia,
                                                        DATE(fecha) AS fecha,
                                                        id_proveedor,
                                                        id_usuario,
                                                        SUM(precio * cantidad) AS total FROM $tabla WHERE codigo_tipo_operacion='001' and $item = :$item GROUP BY 
                                                        referencia, DATE(fecha), id_proveedor, id_usuario ORDER BY DATE(fecha) ASC");
                $stmt->bindParam(":".$item, $valor, PDO::PARAM_STR);

            } else {

                $stmt = Conexion::conectar()->prepare("SELECT referencia,
                                                        DATE(fecha) AS fecha,
                                                        id_proveedor,
                                                        id_usuario,
                                                        SUM(precio * cantidad) AS total FROM $tabla WHERE codigo_tipo_operacion='001' GROUP BY 
                                                        referencia, DATE(fecha), id_proveedor, id_usuario ORDER BY DATE(fecha) ASC");

            }

            $stmt->execute();

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

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


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

            $db = Conexion::conectar();

            $stmt = $db->prepare("INSERT INTO $tabla(codigo, id_proveedor, id_usuario, productos, impuesto, neto, total, metodo_pago, peso_tara, observacion, pesada) 
                                  VALUES (:codigo, :id_proveedor, :id_usuario, :productos, :impuesto, :neto, :total, :metodo_pago, :peso_tara, :observacion, :pesada)");

            $stmt->bindParam(":codigo", $datos["codigo"], PDO::PARAM_INT);
            $stmt->bindParam(":id_proveedor", $datos["id_proveedor"], PDO::PARAM_INT);
            $stmt->bindParam(":id_usuario", $datos["id_usuario"], 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);
            $stmt->bindParam(":peso_tara", $datos["peso_tara"], PDO::PARAM_STR);
            $stmt->bindParam(":observacion", $datos["observacion"], PDO::PARAM_STR);
            $stmt->bindParam(":pesada", $datos["pesada"], PDO::PARAM_STR);

            if ($stmt->execute()) {

                $idCompra = $db->lastInsertId();
                
                $compraReciente = ModeloCompras::mdlMostrarCompras("compras", "id", $idCompra);
                $fechaCompra = $compraReciente["fecha"];

                $montoCompra = (float)$datos["total"] - (float)$datos["pesada"];
                $montoPesada = (float)$datos["pesada"];

                // Transacción principal - Compra
                $datosTransaccionCompra = array(
                    "monto" => $montoCompra,
                    "fecha" => $fechaCompra,
                    "descripcion" => "Compra de productos",
                    "referencia" => $datos["codigo"],
                    "id_usuario" => (int)$datos["id_usuario"],
                    "id_tipo_transaccion" => TRANSACCION_COMPRA, // Compra
                    "metodo_pago" => explode('-', strtoupper($datos["metodo_pago"]))[0],
                    "id_compra" => $idCompra
                );

                $resTransaccionCompra = ModeloTransacciones::mdlIngresarTransaccion("transacciones", $datosTransaccionCompra);

                if ($resTransaccionCompra != "ok") {
                    return "error en transacción de compra";
                }

                // Transacción adicional - Balanza
                if ($montoPesada > 0) {
                    $datosTransaccionPesada = array(
                        "monto" => $montoPesada,
                        "fecha" => $fechaCompra,
                        "descripcion" => "Pago por balanza",
                        "referencia" => $datos["codigo"],
                        "id_usuario" => (int)$datos["id_usuario"],
                        "id_tipo_transaccion" => TRANSACCION_BALANZA, 
                        "metodo_pago" => explode('-', strtoupper($datos["metodo_pago"]))[0],
                        "id_compra" => $idCompra
                    );

                    $resTransaccionPesada = ModeloTransacciones::mdlIngresarTransaccion("transacciones", $datosTransaccionPesada);

                    if ($resTransaccionPesada != "ok") {
                        return "error en transacción de balanza";
                    }
                }

                return "ok";

            } else {
                return "error";
            }

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


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

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

		$stmt = Conexion::conectar()->prepare("UPDATE $tabla SET  id_proveedor = :id_proveedor, id_usuario = :id_usuario, 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_proveedor", $datos["id_proveedor"], PDO::PARAM_INT);
		$stmt->bindParam(":id_usuario", $datos["id_usuario"], 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 mdlEliminarCompra($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;

	}

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

            // Solo convertimos si no son null
            if ($fechaInicial !== null && $fechaFinal !== null) {
                $fechaInicial = (new DateTime($fechaInicial))->format("Y-m-d");
                $fechaFinal = (new DateTime($fechaFinal))->format("Y-m-d");
            }

            // Si no se especifica fecha inicial, obtener todas las compras
            if ($fechaInicial == null) {
                $stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla ORDER BY id ASC");
                $stmt->execute();
                $resultados = $stmt->fetchAll();
            } else if ($fechaInicial == $fechaFinal) {
                $stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE DATE(fecha) = :fechaFinal");
                $stmt->bindParam(":fechaFinal", $fechaFinal, PDO::PARAM_STR);
                $stmt->execute();
                $resultados = $stmt->fetchAll();
            } else {
                $fechaFinalMasUno = (new DateTime($fechaFinal))
                                    ->add(new DateInterval("P1D"))
                                    ->format("Y-m-d");

                $fechaActual = new DateTime();
                $fechaActualMasUno = $fechaActual->add(new DateInterval("P1D"))->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();
            }

            // Procesamos productos y total por compra
            foreach ($resultados as &$resultado) {
                if (isset($resultado['productos'])) {
                    $productos = json_decode($resultado['productos'], true);
                    $cantidadTotal = 0;

                    foreach ($productos as $producto) {
                        $cantidadTotal += $producto['cantidad'];
                    }

                    $resultado['cantidad_total'] = $cantidadTotal;
                } else {
                    $resultado['cantidad_total'] = 0;
                }
            }

            return $resultados;
        }


	/*=============================================
	SUMAR EL TOTAL DE COMPRAS
	=============================================*/

	static public function mdlSumaTotalCompras($tabla){	

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

		$stmt -> execute();

		return $stmt -> fetch();

		$stmt -> close();

		$stmt = null;

	}
        
        static public function mdlMostrarProductosAgrupados($tabla, $fechaInicial = null, $fechaFinal = null) {

            $query = "SELECT 
                        p.id, 
                        p.descripcion, 
                        ds.cantidad, 
                        p.precio_venta as precio, 
                        ds.cantidad * p.precio_venta as total 
                      FROM $tabla ds 
                      INNER JOIN productos p ON ds.id_producto = p.id 
                      WHERE ds.codigo_tipo_operacion = '001'";

            if ($fechaInicial != null && $fechaFinal != null) {
                // Agregar horas al rango para cubrir todo el día
                $fechaInicial .= ' 00:00:00';
                $fechaFinal   .= ' 23:59:59';

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

            $stmt = Conexion::conectar()->prepare($query);

            if ($fechaInicial != null && $fechaFinal != null) {
                $stmt->bindParam(":fechaInicial", $fechaInicial, PDO::PARAM_STR);
                $stmt->bindParam(":fechaFinal", $fechaFinal, PDO::PARAM_STR);
            }

            $stmt->execute();

            $resultado = $stmt->fetchAll(); // ✅ No usamos $item

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

            return $resultado;
        }
   

	
}