<?php



if (isset($TipoFactura)) {
    $factur = $GLOBALS["facturaBodega"];

    $connn = new conexion();
    $conectar = $connn->conectar();



$query = "SELECT `tipoId`, `cedula`, `Nombre`,
`direccion`, `telefono`, `apellido`, `correo`,
  `dv`, `naturaleza`,
 `regimen`, `responsabilidad`, `codigociudad`,`ResoluPosElec`, `PrefijoPosE`, `userApi`, `passApi`,
 facturas.factura, `valor`, `fechaFactura`,  `F.Pago_Electro`, `Fecha_Venci_Electro`, `M.Pago_Electro`,`nit`,`detallef`,`bodegaEm`,`sucursalFacClient`,`direcionSc`,`TelSuc`,`otrDato1`,`otrDato2`
    FROM `facturas`
    INNER JOIN empresa ON facturas.idbodegaF = empresa.bodegaEm
    INNER JOIN clientes ON facturas.cliente = clientes.cedula 
    LEFT JOIN sucursalesclientes on facturas.sucursalFacClient=sucursalesclientes.id
    WHERE tipoFactura='Electronica' AND EstadoEjecucion='0' AND cufe='0' AND facturas.devolucion='0'  AND Pos_Electronico='1' AND facturas.factura='$factur'
    LIMIT 1";

    $resultado = $conectar->query($query);
} else {


$query = "SELECT `tipoId`, `cedula`, `Nombre`,
`direccion`, `telefono`, `apellido`, `correo`,
  `dv`, `naturaleza`,
 `regimen`, `responsabilidad`, `codigociudad`,`ResoluPosElec`, `PrefijoPosE`, `userApi`, `passApi`,
 facturas.factura, `valor`, `fechaFactura`,  `F.Pago_Electro`, `Fecha_Venci_Electro`, `M.Pago_Electro`,`nit`,`detallef`,`bodegaEm`,`sucursalFacClient`,
         `direcionSc`,`TelSuc`,`otrDato1`,`otrDato2`
    FROM `facturas`
    INNER JOIN empresa ON facturas.idbodegaF = empresa.bodegaEm
    INNER JOIN clientes ON facturas.cliente = clientes.cedula
    LEFT JOIN sucursalesclientes on facturas.sucursalFacClient=sucursalesclientes.id 
    WHERE tipoFactura='Electronica' AND EstadoEjecucion='0' AND cufe='0' AND facturas.devolucion='0'  AND Pos_Electronico='1' 
    LIMIT 1";

    $resultado = $conectar->query($query);
}

if($resultado->num_rows > 0 ){
// $fila = $resultado->fetch_all(MYSQLI_ASSOC);
$fila = $resultado->fetch_assoc();



$factur =$fila["factura"];
$bodega= $fila["bodegaEm"];

// $facturaEnvia = preg_replace('/\D/', '', $factur);
// $PREFIJO = preg_replace('/\d/', '', $factur);

// Extraer el prefijo (números iniciales seguidos de letras)
preg_match('/^(\d*[a-zA-Z]+)/', $factur, $prefixMatches);
$PREFIJO = isset($prefixMatches[1]) ? $prefixMatches[1] : '';

// Extraer la parte numérica después del prefijo
preg_match('/[a-zA-Z]+(\d+)$/', $factur, $matches);
$facturaEnvia = isset($matches[1]) ? $matches[1] : '';


$actulizarEstadoFac = "UPDATE facturas SET EstadoEjecucion = 1 WHERE factura = '$factur'";

$eje = $conectar->query($actulizarEstadoFac);

// $productosQuery = "SELECT * FROM `ventas` INNER JOIN productos on ventas.codigoProducto=productos.codigo  WHERE factura='$factur'";
// $resultado1 = $conectar->query($productosQuery);
// $fila1 = $resultado1->fetch_all(MYSQLI_ASSOC);

       $productosQuery = "SELECT * FROM `ventas` INNER JOIN productos ON ventas.codigoProducto = productos.codigo WHERE factura=?";
        $stmt1 = $conectar->prepare($productosQuery);
        $stmt1->bind_param("s", $factur);
        $stmt1->execute();
        $resultado1 = $stmt1->get_result();
        $fila1 = $resultado1->fetch_all(MYSQLI_ASSOC);


$productos = [];


foreach ($fila1 as $value) {
    $tipoProduct = $value["tipoProduct"];
    $precioVenta = $value["valor"];

    if (($tipoProduct == "hibrido" || $tipoProduct == "Fabricacion") && $precioVenta == 0) {
        
    }else{

    $caja = $value["cantCaja"];
    $frcc = $value["cantfrcc"];
    


    $precioUnita=$value["base"];
    if( $precioUnita==0){
        $precioUnita=$value["valor"];  
    }
    $cnatidad = (int)$caja + (int)$frcc;

    $tipoiva = $value["tipoiva"];
    $valorNombre = $value["nombre"];
  
    $costounitario = $precioUnita / $cnatidad;


    $tipo = "";
    $claseImpuesto = "";
    $iva = "";

    switch ($tipoiva) {
        case "19":
            $tipo = "IVA";
            $claseImpuesto = "PO";
            $iva = "19";
            break;
        case "5":
            $tipo = "IVA";
            $claseImpuesto = "PO";
            $iva = "5";
            break;
        case "0":
            $tipo = "EXE";
            $claseImpuesto = "PO";
            $iva = "0";
            break;
        case "1":
            $tipo = "EXC";
            $claseImpuesto = "PO";
            $iva = "0";
            break;
        case "8":
            $tipo = "INC";
            $claseImpuesto = "PO";
            $iva = "8";
            break;
    }

    $datos = [
        "codigo" => $value["codigoProducto"],
        "nombreItem" => $valorNombre,
        "precioBaseUnitario" => $costounitario,
        "cantidad" => $cnatidad,
        "observacion" => "",
        "unidad" => "94",
        "impuestos" => [
            [
                "tipo" => $tipo,
                "claseImpuesto" => $claseImpuesto,
                "tarifaTributo" => $iva
            ]

        ]
            ];

    $productos[] = $datos;


    }


}




// $fechaap = date('Y-m-d');

$respFiscales = "";
switch ($fila["responsabilidad"]) {
    case "O-13":
        $respFiscales = "GRC";
        break;
    case "O-15":
        $respFiscales = "ART";
        break;
    case "O-23":
        $respFiscales = "RIV";
        break;
    case "O-47":
        $respFiscales = "RST";
        break;
    default:
        $respFiscales = "NOA";
}

$respTributarias = "";
switch ($fila["regimen"]) {
    case "NO_APLICA":
        $respTributarias = "NOA";
        break;
    case "IVA":
        $respTributarias = "IVA";
        break;
    case "INC":
        $respTributarias = "INC";
        break;
    default:
        $respTributarias = "IEC";
}

$natural = ($fila["naturaleza"] == "NATURALES") ? "NATURAL" : "JURIDICA";

$formaPago = $fila["F.Pago_Electro"];
$fechaVenci=$fila["Fecha_Venci_Electro"];
$dateObject = new DateTime($fechaVenci);
$formattedDate = $dateObject->format('Y-m-d'); 

// Fecha actual
$fechaActual = date('Y-m-d');

// Convertir ambas fechas a objetos DateTime
$fechaComparar = new DateTime($formattedDate);
$fechaHoy = new DateTime($fechaActual);

// Comparar las fechas
if ($fechaComparar < $fechaHoy) {
    $formattedDate =date('Y-m-d'); 

}


   //nombre cliente
   if (!isset($fila["otrDato1"]) || !is_string($fila["otrDato1"]) || empty(trim($fila["otrDato1"]))) {
    $nombreC=$fila["Nombre"] . " " . $fila["apellido"];
}else{

    $nombreC=$fila["otrDato1"];
}

//diereccion
if (!isset($fila["direcionSc"]) || !is_string($fila["direcionSc"]) || empty(trim($fila["direcionSc"]))) {
    $direccion=$fila["direccion"];
}else{

    $direccion=$fila["direcionSc"];
}

 //telefono
 if (!isset($fila["TelSuc"]) || !is_string($fila["TelSuc"]) || empty(trim($fila["TelSuc"]))) {
    $telefono=$fila["telefono"];
}else{

    $telefono=$fila["TelSuc"];
}


$facturaelectronica = [
    "nit" => $fila["nit"],
    "numeroResolucion" => $fila["ResoluPosElec"],
    "consecutivoDcto" => $facturaEnvia,
    "prefijoDcto" => $PREFIJO,
    "fechaVencimiento" =>$formattedDate ,
    "formaPago" => $formaPago,
    "mediosPago" => [$fila["M.Pago_Electro"]],
    "total" => $fila["valor"],
    "observacion" => $fila["detallef"],
    "cliente" => [
        "nombreRazonSocial" => $nombreC,
        "tipoIdentificacion" => $fila["tipoId"],
        "numIdentificacion" => $fila["cedula"],
        "naturaleza" => $natural,
        "email" => $fila["correo"],
        "respFiscales" => $respFiscales,
        "respTributarias" => $respTributarias,
        "direccion" => $direccion,
        "ciudad" => $fila["codigociudad"],
        "telefono" => $telefono
    ],
    "items" => $productos,
    "extensiones" => [
        "beneficiosComprador" => [
            "codigo" => $fila["tipoId"],
            "nombreApellido" => $fila["Nombre"],
            "puntos" => 0
        ],
        "puntoVenta" => [
            "placaCaja" => "00",
            "ubicacionCaja" => "LOCAL",
            "cajero" => "General",
            "tipoCaja" => "RAPIDA",
            "codigoVenta" => "001",
            "subTotal" => 0
        ]
    ]
];



// echo(var_dump($facturaelectronica));
// die();

try {

if(isset($_SESSION[$bodega]["toke"])){
    $token=$_SESSION[$bodega]["toke"];
    
}else {
    $userrApi = $fila["userApi"];
    $passApi = $fila["passApi"];

    //producion
  //  $url="https://csi.clarisa.co:8443/seguridad/rest/api/v1/login/"
    //pruebas
    //$url="https://pru.clarisacloud.com:8443/seguridad/rest/api/v1/login/";
   
    $url = "https://csi.clarisa.co:8443/seguridad/rest/api/v1/login/";

    $data = [
        'usuario' => $userrApi,
        'contrasenia' => $passApi
    ];

    $options = [
        'http' => [
            'header' => "Content-type: application/json",
            'method' => 'POST',
            'content' => json_encode($data),
            'timeout' => 5,
            'ignore_errors' => true
        ]
        ];

    $context = stream_context_create($options);
    



  try {
                $response = @file_get_contents($url, false, $context); // Usar @ para suprimir errores
                if ($response === false) {
                    throw new Exception("Error al obtener el token. No se pudo conectar con la API.");
                }

                $result = json_decode($response, true);
                if (json_last_error() !== JSON_ERROR_NONE) {
                    throw new Exception("Error al decodificar la respuesta JSON: " . json_last_error_msg());
                }

                $token = $result["data"]["token"] ?? null;
                if (!$token) {
                    throw new Exception("El token no se encontró en la respuesta.");
                }

                $_SESSION[$bodega] = ["toke" => $token];
            } catch (Exception $e) {
                file_put_contents('mensajeError.txt', "Error al obtener el token: " . $e->getMessage() . "\n", FILE_APPEND);
                $token = null; // Token no disponible
    }

}
// produ=
//$url = "https://api.clarisa.co:8443/api/equivalente/rest/v1/de/pos/";
//pruebas
//$url="https://pru.clarisacloud.com:8443/api/equivalente/rest/v1/de/pos/";




try {
    // Definir URL y opciones para la solicitud
    $url = "https://api.clarisa.co:8443/api/equivalente/rest/v1/de/pos/";

    $options = [
        'http' => [
            'header' => "Content-type: application/json\r\n" . "Authorization: $token",
            'method' => 'POST',
            'content' => json_encode($facturaelectronica),
            'timeout' => 10,
            'ignore_errors' => true
        ]
    ];

    $context = stream_context_create($options);

    // Realizar la solicitud
    $response = @file_get_contents($url, false, $context);

    if ($response === false) {
        // Obtener detalles del error
        $error = error_get_last();
        $errorMessage = $error['message'] ?? 'Error desconocido al realizar la solicitud';
        throw new Exception($errorMessage); // Lanzamos una excepción si la respuesta es falsa
    }

    // Decodificar la respuesta
    $resulta = json_decode($response, true);

    if ($resulta["success"] == true || $resulta["success"] == "true") {
        // Si la respuesta es exitosa
        $cufe = $resulta["data"]["informacionDEQR"]["CUDE"];
        if (strlen($cufe) == 0) {
            $cufe = 0;
        }

        // Actualizar estado de la factura
        $actulizarEstadoFac = "UPDATE facturas SET EstadoEjecucion = '1', cufe = '$cufe', mensajeProveTecno = 'Factura Creada Con exito' WHERE factura = '$factur'";
        $eje = $conectar->query($actulizarEstadoFac);
    } else {
        // Si la respuesta no es exitosa, manejar los errores
        if (isset($resulta["data"]["errores"][0]["errorMessage"])) {
            $erro = $resulta["data"]["errores"][0]["errorMessage"];
        } else {
            if (isset($resulta["data"]["errores"][0]["codError"])) {
                $erro = $resulta["data"]["errores"][0]["codError"];
            } else {
                $erro = "Validar En la plataforma del proveedor Tecnológico";
            }
        }

        // Actualizar estado con el mensaje de error
        $actulizarEstadoFac = "UPDATE facturas SET mensajeProveTecno = '$erro' WHERE factura = '$factur'";
        $eje = $conectar->query($actulizarEstadoFac);
    }

} catch (Exception $e) {
    // Capturar cualquier error que ocurra y manejarlo
  $errorMessage = date('Y-m-d H:i:s') . " " . $factur. " - Error: " . $e->getMessage() . " in " . $e->getFile() . " on line " . $e->getLine() . "\n";
    file_put_contents('mensajeError.txt', $errorMessage, FILE_APPEND);
  

    // Aquí puedes optar por manejar el error de manera diferente (por ejemplo, mostrando un mensaje al usuario)
    //echo "Hubo un error al procesar la solicitud: " . $errorMessage;
}

} catch (Exception $e) {
    $errorMessage = date('Y-m-d H:i:s') . " " . $factur. " - Error: " . $e->getMessage() . " in " . $e->getFile() . " on line " . $e->getLine() . "\n";
    file_put_contents('mensajeError.txt', $errorMessage, FILE_APPEND);

}
}else{
    echo("sin datos");
}


?>