<?php

require_once "conexion.php";

class ModeloCompras{

    /*=============================================
	RANGO FECHAS PARA EL ADMINISTRADOR PARA EL LISTADO DE LAS COMPRAS
	=============================================*/	

	static public function mdlRangoFechasCompras($tabla, $fechaInicial, $fechaFinal){
		
		date_default_timezone_set("America/Lima");
        $fechaActual = date('Y');


		if($fechaInicial == null && $fechaFinal == null){

			$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE fecha_emision like '%$fechaActual%' ORDER BY id DESC");

			$stmt -> execute();

			return $stmt -> fetchAll();	


		}else if($fechaInicial == $fechaFinal){

			$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE fecha_emision like '%$fechaFinal%' ORDER BY id DESC");

			$stmt -> execute();

			return $stmt -> fetchAll();

		}else{

			$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_emision BETWEEN '$fechaInicial' AND '$fechaFinalMasUno' ORDER BY id DESC");

			}else{


				$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE fecha_emision BETWEEN '$fechaInicial' AND '$fechaFinalMasUno' ORDER BY id DESC");

			}
		
			$stmt -> execute();

			return $stmt -> fetchAll();

		}

	}

	static public function mdlMostrarDetalleCompras($tabla, $item, $valor){

		if($item != null){

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

			$stmt -> bindParam(":".$item, $valor, PDO::PARAM_STR);

			$stmt -> execute();

			return $stmt -> fetchAll();

		}else{
			

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

			$stmt -> execute();

			return $stmt -> fetchAll();

		}
		
		$stmt -> close();

		$stmt = null;

	}


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

		if($fechaInicial == null && $fechaFinal == null){

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

			$stmt -> execute();

			return $stmt -> fetchAll();	


		}else if($fechaInicial == $fechaFinal){

			$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE estado = 0 and fecha_emision like '%$fechaFinal%' ORDER BY id DESC");

			$stmt -> execute();

			return $stmt -> fetchAll();

		}else{

			$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_emision BETWEEN '$fechaInicial' AND '$fechaFinalMasUno' ORDER BY id DESC");

			}else{


				$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE fecha_emision BETWEEN '$fechaInicial' AND '$fechaFinalMasUno' ORDER BY id DESC");

			}
		
			$stmt -> execute();

			return $stmt -> fetchAll();

		}

	}

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

	static public function mdlMostrarCompras($tabla, $item, $valor){

		if($item != null){

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

			$stmt -> bindParam(":".$item, $valor, PDO::PARAM_STR);

			$stmt -> execute();

			return $stmt -> fetch();

		}else{
			

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

			$stmt -> execute();

			return $stmt -> fetchAll();

		}
		
		$stmt -> close();

		$stmt = null;

	}

	/*=============================================
	MOSTRAR COMPRAS DE PRODUCTOS
	=============================================*/

	static public function mdlMostrarComprasProductos($tabla, $item, $valor){

		if($item != null){

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

			$stmt -> bindParam(":".$item, $valor, PDO::PARAM_STR);

			$stmt -> execute();

			return $stmt -> fetch();

		}else{
			

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

			$stmt -> execute();

			return $stmt -> fetchAll();

		}
		
		$stmt -> close();

		$stmt = null;

	}


	/*=============================================
	REGISTRO DE COMPRA
	=============================================*/

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

	try {

		$pdo = Conexion::conectar();
		$pdo->beginTransaction();


		$stmt=$pdo->prepare("INSERT INTO $tabla(sucursal_id, serie, numero, id_proveedor, id_usuario, fecha_emision, fecha_registro, estado, forma_pago, moneda, igv, neto, total) VALUES (:sucursal_id,  :serie, :numero, :id_proveedor, :id_usuario, :fecha_emision, :fecha_registro, :estado, :forma_pago, :moneda, :igv, :neto, :total)");

		$stmt->execute([
            ":sucursal_id" => $datos["sucursal_id"],
            ":serie" => $datos["serie"],
            ":numero" => $datos["numero"],
            ":id_proveedor" => $datos["id_proveedor"],
            ":id_usuario" => $datos["id_usuario"],
            ":fecha_emision" => $datos["fecha_emision"],
            ":fecha_registro" => $datos["fecha_registro"],
            ":estado" => $datos["estado"],
			":forma_pago" => $datos["forma_pago"],
			":moneda" => $datos["moneda"],
            ":igv" => $datos["igv"],
			":neto" => $datos["neto"],
			":total" => $datos["total"]
  
        ]);

		$idCompra = $pdo->lastInsertId();
		
		foreach ($listaProductos as $producto) {
            // Insertar detalle
            $stmtDetalle = $pdo->prepare("INSERT INTO detalle_compras (
                compra_id, producto_id, cantidad, precio_unitario
            ) VALUES (
                :compra_id, :producto_id, :cantidad, :precio_unitario
            )");

            $stmtDetalle->execute([
                ":compra_id" => $idCompra,
                ":producto_id" => $producto["id"],
                ":cantidad" => $producto["cantidad"],
                ":precio_unitario" => $producto["costo"]
            ]);

            // Insertar movimiento de entrada
            $stmtMov = $pdo->prepare("INSERT INTO inventario_movimientos (
                producto_id, sucursal_id, tipo, cantidad, referencia
            ) VALUES (
                :producto_id, :sucursal_id, 'entrada', :cantidad, :referencia
            )");

            $stmtMov->execute([
                ":producto_id" => $producto["id"],
                ":sucursal_id" => $datos["sucursal_id"],
                ":cantidad" => $producto["cantidad"],
                ":referencia" => "Compra #$idCompra"
            ]);
        }

        $pdo->commit();
        return "ok";

		 } catch (Exception $e) {
        $pdo->rollBack();
        return "error: " . $e->getMessage();
    }


	}

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

		$stmt = Conexion::conectar();
		$stmt->beginTransaction();


		$sentencia=$stmt ->prepare("INSERT INTO $tabla(tipo_documento, tipo_factura, num_factura, id_proveedor, productos, descripcion, fecha_emision, fecha_registro, estado, forma_pago, moneda, igv, neto, total) VALUES (:tipo_documento, :tipo_factura, :num_factura, :id_proveedor, :productos, :descripcion, :fecha_emision, :fecha_registro, :estado, :forma_pago, :moneda, :igv, :neto, :total)");

		$sentencia->bindParam(":tipo_documento", $datos["tipo_documento"], PDO::PARAM_INT);
		$sentencia->bindParam(":tipo_factura", $datos["tipo_factura"], PDO::PARAM_STR);
		$sentencia->bindParam(":serie", $datos["serie"], PDO::PARAM_STR);
		$sentencia->bindParam(":numero", $datos["numero"], PDO::PARAM_STR);
		$sentencia->bindParam(":id_proveedor", $datos["id_proveedor"], PDO::PARAM_INT);
		$sentencia->bindParam(":productos", $datos["productos"], PDO::PARAM_STR);
		$sentencia->bindParam(":descripcion", $datos["descripcion"], PDO::PARAM_STR);
		$sentencia->bindParam(":fecha_emision", $datos["fecha_emision"], PDO::PARAM_STR);
		$sentencia->bindParam(":fecha_registro", $datos["fecha_registro"], PDO::PARAM_STR);
		$sentencia->bindParam(":estado", $datos["estado"], PDO::PARAM_STR);
		$sentencia->bindParam(":forma_pago", $datos["forma_pago"], PDO::PARAM_STR);
		$sentencia->bindParam(":moneda", $datos["moneda"], PDO::PARAM_STR);
		$sentencia->bindParam(":igv", $datos["igv"], PDO::PARAM_STR);
		$sentencia->bindParam(":neto", $datos["neto"], PDO::PARAM_STR);
		$sentencia->bindParam(":total", $datos["total"], PDO::PARAM_STR);
		
		$stmt ->commit();

		if($sentencia->execute()){

			return "ok";

		}else{

			return "error";
		
		}

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

	}

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

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

		try {
        $pdo = Conexion::conectar();
        $pdo->beginTransaction();

        // 1. Obtener compra actual
        $stmtCompra = $pdo->prepare("SELECT id, id_proveedor, total FROM $tabla WHERE id = :id");
        $stmtCompra->execute([":id" => $datos["id"]]);
        $compraActual = $stmtCompra->fetch();
        $compra_id = $compraActual["id"];
        $totalAnterior = $compraActual["total"];

		 // 2. Obtener detalle anterior
        $stmtDetalle = $pdo->prepare("SELECT producto_id, cantidad FROM detalle_compras WHERE compra_id = ?");
        $stmtDetalle->execute([$compra_id]);
        $detalleAnterior = $stmtDetalle->fetchAll();

		foreach ($detalleAnterior as $producto) {
            // Revertir stock
            $pdo->prepare("UPDATE stock_sucursal
                SET stock_fisico = stock_fisico - :cantidad
                WHERE producto_id = :producto_id AND sucursal_id = :sucursal_id")->execute([
                ":cantidad" => $producto["cantidad"],
                ":producto_id" => $producto["producto_id"],
                ":sucursal_id" => $datos["sucursal_id"]
            ]);

            // Revertir acumulador compras (si lo usas)
            $pdo->prepare("UPDATE productos
                SET compras = compras - :cantidad
                WHERE id = :producto_id")->execute([
                ":cantidad" => $producto["cantidad"],
                ":producto_id" => $producto["producto_id"]
            ]);
        }





		$stmt = $pdo->prepare("UPDATE $tabla SET  id_proveedor = :id_proveedor, serie = :serie, numero = :numero, sucursal_id = :sucursal_id, fecha_emision = :fecha_emision, fecha_registro = :fecha_registro, moneda = :moneda, igv = :igv, neto = :neto, total= :total, forma_pago = :forma_pago WHERE id = :id");

		$stmt->execute([
            ":id_proveedor" => $datos["id_proveedor"],
			"serie" => $datos["serie"],
			":numero"=> $datos["numero"],
			":sucursal_id"=> $datos["sucursal_id"],
			":fecha_emision"=> $datos["fecha_emision"], 
			":fecha_registro"=> $datos["fecha_registro"],
			":moneda"=> $datos["moneda"],
			":igv"=> $datos["igv"],
            ":neto" => $datos["neto"],
            ":total" => $datos["total"],
            ":forma_pago"=> $datos["forma_pago"],
            ":id" => $datos["id"]
        ]);


		   // 4. Eliminar detalle y movimientos anteriores
        $pdo->prepare("DELETE FROM detalle_compras WHERE compra_id = ?")->execute([$compra_id]);
        $pdo->prepare("DELETE FROM inventario_movimientos WHERE referencia = ?")->execute(["Compra #" . $datos["id"]]);

        // 5. Insertar nuevos detalles y movimientos
        foreach ($listaProductos as $producto) {
            // Insertar detalle
            $pdo->prepare("INSERT INTO detalle_compras (
                compra_id, producto_id, cantidad, precio_unitario
            ) VALUES (?, ?, ?, ?)")->execute([
                $compra_id,
                $producto["id"],
                $producto["cantidad"],
                $producto["costo"]
            ]);

            // Insertar movimiento
            $pdo->prepare("INSERT INTO inventario_movimientos (
                producto_id, sucursal_id, tipo, cantidad, referencia
            ) VALUES (?, ?, 'entrada', ?, ?)")->execute([
                $producto["id"],
                $datos["sucursal_id"],
                $producto["cantidad"],
                "Compra #" . $datos["id"]
            ]);

            // Actualizar stock
            $pdo->prepare("UPDATE stock_sucursal
                SET stock_fisico = stock_fisico + :cantidad
                WHERE producto_id = :producto_id AND sucursal_id = :sucursal_id")->execute([
                ":cantidad" => $producto["cantidad"],
                ":producto_id" => $producto["id"],
                ":sucursal_id" => $datos["sucursal_id"]
            ]);

        }

        $pdo->commit();
        return "ok";


	  } catch (Exception $e) {
        $pdo->rollBack();
        return "error: " . $e->getMessage();
    }




	}

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

	static public function mdlEliminarCompra($tabla, $compra_id, $sucursal_id){
 	try {
        $pdo = Conexion::conectar();
        $pdo->beginTransaction();

		// Obtener compra
        $stmtCompra = $pdo->prepare("SELECT id_proveedor, total FROM compras WHERE id = ?");
        $stmtCompra->execute([$compra_id]);
        $compra = $stmtCompra->fetch();

		// Obtener detalle
        $stmtDetalle = $pdo->prepare("SELECT producto_id, cantidad FROM detalle_compras WHERE compra_id = ?");
        $stmtDetalle->execute([$compra_id]);
        $productos = $stmtDetalle->fetchAll();

		foreach ($productos as $producto) {
					// Revertir stock
					$pdo->prepare("UPDATE stock_sucursal
						SET stock_fisico = stock_fisico - :cantidad
						WHERE producto_id = :producto_id AND sucursal_id = :sucursal_id")->execute([
						":cantidad" => $producto["cantidad"],
						":producto_id" => $producto["producto_id"],
						":sucursal_id" => $sucursal_id
					]);

			
        }

		 // Anular compra (estado = 1)
        $pdo->prepare("UPDATE compras SET estado = 1 , forma_pago = 'ANULADO' WHERE id = ?")->execute([$compra_id]);

        // Opcional: eliminar movimientos si no los mantienes
        $pdo->prepare("DELETE FROM inventario_movimientos WHERE referencia = ?")->execute(["Compra #$compra_id"]);

        $pdo->commit();
        return "ok";


	} catch (Exception $e) {
        $pdo->rollBack();
        return "error: " . $e->getMessage();
    }

	}

		static public function mdlConsultarDetalleCompras($tabla, $compra_id){

		$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE compra_id = ?");

		$stmt -> execute([$compra_id]);

		return $stmt -> fetchAll();	

		$stmt -> close();

		$stmt = null;

	}



}