<?php 
require_once "conexion.php";

class ModeloProductos{

/** MOSTRAR PRODUCTOS */
static public function mdlMostrarProductos($tabla, $item, $valor){

    if($item != null){

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

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

        return $stmt -> fetch();

    }else {

        $stmt = Conexion:: conectar()->prepare("SELECT p.*, s.stock_fisico FROM $tabla p INNER JOIN stock_sucursal s ON p.id = s.producto_id");
        
        $stmt -> execute();

        return $stmt -> fetchAll();
    }

    $stmt -> close();

    $stmt = null;
}

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

    if($item != null && $valor != null){

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

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

        return $stmt -> fetch();

    }else {

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

        return $stmt -> fetchAll();
    }

    $stmt -> close();

    $stmt = null;
}

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

    if($item != null && $valor != null){

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

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

        return $stmt -> fetch();

    }else {

        $stmt = Conexion:: conectar()->prepare("SELECT descripcion FROM $tabla ORDER BY ventas DESC ");
        
        $stmt -> execute();

        return $stmt -> fetchAll();
    }

    $stmt -> close();

    $stmt = null;
}
/** MOSTRAR PRODUCTOS */

static public function mdlMostrarProductos1($tabla, $item, $valor, $orden){

    if($item != null){

        $stmt = Conexion::conectar()->prepare("SELECT p.*, s.stock_fisico, s.stock_minimo FROM $tabla p INNER JOIN stock_sucursal s ON p.id = s.producto_id WHERE p.id = $valor");

        $stmt -> execute();

        return $stmt -> fetch();

    }else{

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

        $stmt -> execute();

        return $stmt -> fetchAll();

    }

    $stmt -> close();

    $stmt = null;

}

public static function mdlExisteProducto($tabla, $codigo) {

    $stmt = Conexion::conectar()->prepare("SELECT id FROM $tabla WHERE codigo = :codigo");
    $stmt->bindParam(":codigo", $codigo, PDO::PARAM_STR);
    $stmt->execute();
    return $stmt->fetch(); // Devuelve false si no existe
}


/** REGISTRAR PRODUCTO */
static public function mdlIngresarProducto($tabla, $datos){

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


        $stmt = $pdo->prepare("INSERT INTO $tabla(id_categoria, id_marca, id_unidad, codigo, descripcion, imagen, precio_compra_promedio, porcentaje_menor, precio_venta_sugerido, estado, fecha_ingreso, fecha_vencimiento) VALUES (:id_categoria, :id_marca, :id_unidad, :codigo, :descripcion, :imagen, :precio_compra_promedio, :porcentaje_menor, :precio_venta_sugerido, :estado, :fecha_ingreso, :fecha_vencimiento)");


         $stmt->execute([
            ":id_categoria" => $datos["id_categoria"],
            ":id_marca" => $datos["id_marca"],
            ":id_unidad" => $datos["id_unidad"],
            ":codigo" => $datos["codigo"],
            ":descripcion" => $datos["descripcion"],
            ":imagen" => $datos["imagen"],
            ":precio_compra_promedio" => $datos["precio_compra_promedio"],
            ":porcentaje_menor" => $datos["porcentaje_menor"],
            ":precio_venta_sugerido" => $datos["precio_venta_sugerido"],
            ":estado" => $datos["estado"],
            ":fecha_ingreso" => $datos["fecha_ingreso"],
            ":fecha_vencimiento" => $datos["fecha_vencimiento"]
        ]);



       $id_producto = $pdo->lastInsertId();

        // 2. Insertar movimiento inicial
        $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" => $id_producto,
            ":sucursal_id" => $datos["sucursal_id"],
            ":cantidad" => $datos["stock_fisico"],
            ":referencia" => 'INGRESO MANUAL'
        ]);

        // 3. Insertar stock inicial
        $stmtStock = $pdo->prepare("
            INSERT INTO stock_sucursal (
                producto_id, sucursal_id, stock_fisico, stock_minimo
            ) VALUES (
                :producto_id, :sucursal_id, :stock_fisico, :stock_minimo
            )
        ");

        $stmtStock->execute([
            ":producto_id" => $id_producto,
            ":sucursal_id" => $datos["sucursal_id"],
            ":stock_fisico" => $datos["stock_fisico"],
            ":stock_minimo" => 5
        ]);

        $pdo->commit();
        return ["status" => "ok", "id_producto" => $id_producto];


    } catch (Exception $e) {
        $pdo->rollBack();
        return ["status" => "error", "mensaje" => $e->getMessage()];
    }


}


/** EDITAR PRODUCTO */
static public function mdlEditarProducto($tabla, $datos){

    $stmt = Conexion::conectar()->prepare("UPDATE $tabla SET id_categoria = :id_categoria, id_marca = :id_marca, id_unidad = :id_unidad, descripcion = :descripcion, imagen = :imagen, precio_compra_promedio = :precio_compra_promedio, porcentaje_menor = :porcentaje_menor , precio_venta_sugerido = :precio_venta_sugerido, estado =:estado, fecha_vencimiento =:fecha_vencimiento WHERE id = :id");

        $stmt -> bindParam(":id_categoria", $datos["id_categoria"], PDO::PARAM_STR);
        $stmt -> bindParam(":id_marca", $datos["id_marca"], PDO::PARAM_STR);
        $stmt -> bindParam(":id_unidad", $datos["id_unidad"], PDO::PARAM_STR);
        $stmt -> bindParam(":id", $datos["id"], PDO::PARAM_STR);
        $stmt -> bindParam(":descripcion", $datos["descripcion"], PDO::PARAM_STR);
        $stmt -> bindParam(":imagen", $datos["imagen"], PDO::PARAM_STR);
        $stmt -> bindParam(":precio_compra_promedio", $datos["precio_compra_promedio"], PDO::PARAM_STR);
        $stmt -> bindParam(":porcentaje_menor", $datos["porcentaje_menor"], PDO::PARAM_STR);
        $stmt -> bindParam(":precio_venta_sugerido", $datos["precio_venta_sugerido"], PDO::PARAM_STR);
        $stmt -> bindParam(":estado", $datos["estado"], PDO::PARAM_STR);
        $stmt -> bindParam(":fecha_vencimiento", $datos["fecha_vencimiento"], PDO::PARAM_STR);

    $stmtMov = Conexion::conectar()->prepare("UPDATE inventario_movimientos SET sucursal_id = :sucursal_id, cantidad = :cantidad WHERE producto_id = :producto_id");

    $stmtMov->execute([
                ":producto_id" => $datos["id"],
                ":sucursal_id" => $datos["sucursal_id"],
                ":cantidad" => $datos["stock_fisico"]
            ]);
    $stmtStock = Conexion::conectar()->prepare("UPDATE stock_sucursal SET sucursal_id = :sucursal_id, stock_fisico = :stock_fisico WHERE producto_id = :producto_id");
    
    $stmtStock->execute([
            ":producto_id" => $datos["id"],
            ":sucursal_id" => $datos["sucursal_id"],
            ":stock_fisico" => $datos["stock_fisico"]
        ]);

        if($stmt -> execute()){
            return "ok";
        }else{
            return "error";
        }
        
        $stmt -> close();

        $stmt = null;

}

    /*=============================================
	ELIMINAR PRODUCTO
	=============================================*/

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

        $stmtMov = Conexion::conectar()->prepare("DELETE FROM inventario_movimientos WHERE producto_id = :id");
        $stmtMov -> execute([
                ":id" => $datos
            ]);

        $stmtStock = Conexion::conectar()->prepare("DELETE FROM stock_sucursal WHERE producto_id = :id");
        $stmtStock -> execute([
                ":id" => $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;


	}


	/*=============================================
	ACTUALIZAR PRODUCTO ESTADO
	=============================================*/

	static public function mdlActualizarProducto($tabla, $item1, $valor1, $item2, $valor2){

		$stmt = Conexion::conectar()->prepare("UPDATE $tabla SET $item1 = :$item1 WHERE $item2 = :$item2");

		$stmt -> bindParam(":".$item1, $valor1, PDO::PARAM_STR);
		$stmt -> bindParam(":".$item2, $valor2, PDO::PARAM_STR);

		if($stmt -> execute()){

			return "ok";
		
		}else{

			return "error";	

		}

		$stmt -> close();

		$stmt = null;

	}

    /*=============================================
	ACTUALIZAR PRODUCTO
	=============================================*/

	static public function mdlActualizarProducto1($tabla, $item1, $valor1, $valor){

		$stmt = Conexion::conectar()->prepare("UPDATE $tabla SET $item1 = :$item1 WHERE id = :id");

		$stmt -> bindParam(":".$item1, $valor1, PDO::PARAM_STR);
		$stmt -> bindParam(":id", $valor, PDO::PARAM_STR);

		if($stmt -> execute()){

			return "ok";
		
		}else{

			return "error";	

		}

		$stmt -> close();

		$stmt = null;

	}
    
	static public function mdlActualizarProducto3($tabla, $item1, $valor1, $valor){

		$stmt = Conexion::conectar()->prepare("UPDATE $tabla SET $item1 = :$item1 WHERE producto_id = :producto_id");

		$stmt -> bindParam(":".$item1, $valor1, PDO::PARAM_STR);
		$stmt -> bindParam(":producto_id", $valor, PDO::PARAM_STR);

		if($stmt -> execute()){

			return "ok";
		
		}else{

			return "error";	

		}

		$stmt -> close();

		$stmt = null;

	}

    /*=============================================
	ACTUALIZAR PRODUCTO EL STOCK Y EL PRECIO DE COMPRA
	=============================================*/

	static public function mdlActualizarProducto2($tabla, $item2, $valor2, $item4, $valor4, $valor){

		$stmt = Conexion::conectar()->prepare("UPDATE $tabla SET  $item2 = :$item2, $item4 = :$item4 WHERE id = :id");

        $stmt -> bindParam(":".$item2, $valor2, PDO::PARAM_STR);
        $stmt -> bindParam(":".$item4, $valor4, PDO::PARAM_STR);
		$stmt -> bindParam(":id", $valor, PDO::PARAM_STR);

		if($stmt -> execute()){

			return "ok";
		
		}else{

			return "error";	

		}

		$stmt -> close();

		$stmt = null;

	}


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

	static public function mdlMostrarSumaVentas($tabla){

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

		$stmt -> execute();

		return $stmt -> fetch();

		$stmt -> close();

		$stmt = null;
	}

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

        $stmt = Conexion::conectar()->prepare("UPDATE $tabla SET descripcion = :descripcion WHERE id = :id");

        $stmt -> bindParam(":id", $datos["id"], PDO::PARAM_INT);
		$stmt -> bindParam(":descripcion", $datos["descripcion"], PDO::PARAM_STR);
       
		if($stmt -> execute()){

			return "ok";
            
		
		}else{

			return "error";	

		}

		$stmt -> close();

		$stmt = null;

    }

     /** CREAR ALMACEN */

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

        $stmt = Conexion::conectar()->prepare("INSERT INTO $tabla(descripcion) VALUES (:descripcion)");

        $stmt -> bindParam(":descripcion", $datos, PDO::PARAM_STR);

        if($stmt -> execute()){
            return "ok";
        }else{
            return "error";
        }
        
        $stmt -> close();

        $stmt = null;
    }

    	
	
    

}