<?php
// app/api/accounts/generate

    header("Content-Type:application/json");
    include("../dbconn.php");
    include("../utils.php");
    
    // parametros obligatorios
    $parmsob = array("sessionid","currencies");
    if (!parametrosValidos($_GET, $parmsob)){
        badEnd("400", array("msg"=>"Parametros obligatorios " . implode(",", $parmsob)));
    }
    
    //Definicion de variables e inicializacion
    $out= new stdClass;
    $sessionid = $_GET["sessionid"];
    $currencies = $_GET["currencies"];
    
    //Validamos la session
    $userid = isSessionValid($db, $sessionid);
    
    //Validamos el si el usuario puede crear cuentas
    isLevelValid($db, $userid);
    
    //Consultamos los datos del usuarios para la insercion/validacion
    $sql = "SELECT * from users WHERE sessionid = '".$sessionid."'";
    if (!$rs=$db->query($sql))
        badEnd("500", array("msg"=>$db->error));
        
    $userdata = $rs->fetch_assoc();
    
    //Partimos la cadena con las monedas separadas por -
    $currenciesid = explode('-',$currencies);
    
    //Recorremos cada moneda
    foreach($currenciesid as $currencyid){
        $record = new stdClass();
        
        //consultamos las monedas disponibles para las cuentas AFX
        $sql = "SELECT currencies FROM paymentmethods WHERE id = -1";
        if (!$rs=$db->query($sql))
            badEnd("500", array("msg"=>$db->error));
        
        $allowedcurrencies = $rs->fetch_assoc();
    
        //Validamos que la moneda enviada sea valida
        $allowedcurrenciesarr = explode(",",$allowedcurrencies["currencies"]);
        $isValid = false;
    
        foreach($allowedcurrenciesarr as $allowedcurrency){
            if($allowedcurrency == $currencyid){
                $isValid = true;
            }
        }
    
        //Si la moneda no es valida retornamos error
        if(!$isValid){
            badEnd("400", array("msg"=>"La moneda es invalida ".$currencyid,'test'=>$allowedcurrenciesarr,'currency'=>$currencyid));
        }
    
        //Consultamos si ya posee una cuenta de AFX
        $sql = "SELECT COUNT(id) AS qty FROM accounts".
        "       WHERE userid = ".$userid.
        "       AND paymentmethodid = -1 ".
        "       AND currencyid = ".$currencyid;
        if (!$rs=$db->query($sql))
            badEnd("500", array("msg"=>$db->error));
        
        $row = $rs->fetch_assoc();
    
        if(intval($row["qty"]) > 0){
            badEnd("409", array("msg"=>"Registro Duplicado"));
        }
    
        //Consultamos los datos de la moneda
        $sql = "SELECT name, symbol, interface, decimals FROM currencies ".
        "       WHERE id = ".$currencyid;
        if (!$rs=$db->query($sql))
            badEnd("500", array("msg"=>$db->error));
        
        $row = $rs->fetch_assoc();
    
        //Validamos si es una criptomoneda o fiat
        $isCripto = false;
        $isFiat = false;
        
        // Guardamos el nombre de la moneda para la auditoria
        $currencynameaudit = $row['name'];
        
        /*
        1 = BS
        2 = Internacional
        3 = Saldos
        4 = BTC
        5 = PTR
        */
        if(intval($row['interface']) == 1 || intval($row['interface']) == 3 || intval($row['interface']) == 2){
            $isFiat = true;
        }else if(intval($row['interface']) == 4 || intval($row['interface']) == 5){
            $isCripto = true;
        }
        
        //Retornamos los datos de la moneda
        $record->symbol = $row['symbol'];
        
        $db->autocommit(FALSE);
        
        if($isCripto && !$isFiat){
            // Si es 5 Consultmos la api de TCV, si no es de prueba
            if(intval($row['interface']) == 5){
                $rsp = queryPrivate('deposit_address', $TCV_JWT, $TCV_URL, $VERSION_API, false, ['currency' => $row['symbol']]);
                
                // Si la direccion es null y la respuesta es distinta a 201, hubo un error
                if($rsp['address'] == NULL || $rsp['httpres'] != 201){
                    badEnd("402", array("msg"=>'Error al obtener direccion: '.$rsp['httpres']." - ".$rsp['error']->message));
                }
                $walletid = $rsp['address'];
            }else if(intval($row['interface']) == 4){
                $parms = array("label"=>"afxaddr");
                $request = array('method'=>'getnewaddress','parms' => $parms);
                $rsp = json_decode(queryServicesBTC($BTC_URL, $request), true);
    
                // Validamos que el error no sea nulo para mandar el mensaje
                if($rsp['error'] != null){
                    badEnd('500',array("msg"=>$rest['error']['message']));
                }
                
                if($rsp['result'] == null){
                    badEnd('402',array("msg"=>"Error al obtener direccion: ", 'msg2'=>$rsp));
                }
                
                $walletid = $rsp['result'];
            }else{
                $walletid = randomString(30);
            }
            
            //Insertamos la nueva cuenta
            $sql = "INSERT INTO accounts".
            "       (".
            "       paymentmethodid, ".
            "       userid, ".
            "       currencyid, ".
            "       details1, ".
            "       status ".
            "       )".
            "       VALUES(".
            "       -1, ".
            "       ".$userdata["id"].", ".
            "       ".$currencyid.", ".
            "       '".$walletid."', ".
            "       1 ".
            "       )";
            if (!$db->query($sql)){
                $error = $db->error;
                $db->rollback();
                $db->close();
                badEnd("500", array("msg"=>$error));
            }
            
            // Retornamos el id que fue insertado
            $record->id = (int)$db->insert_id;
        
            //Al ser una cripto, creamos una wallet
            $sql = "INSERT INTO wallets".
            "       (".
            "       wallet, ".
            "       secretKey, ".
            "       accountid, ".
            "       expirationDate".
            "       )".
            "       VALUES(".
            "       '".$walletid."', ".
            "       '".randomString(8)."', ".
            "       ".$record->id.", ".
            "       DATE_ADD(NOW(), INTERVAL 1 YEAR)".
            "       )";
            if (!$db->query($sql)){
                $error = $db->error;
                $db->rollback();
                $db->close();
                badEnd("500", array("msg"=>$error));
            }
        
        }else if($isFiat && !$isCripto){
            //Insertamos la nueva cuenta
            $sql = "INSERT INTO accounts".
            "       (".
            "       paymentmethodid, ".
            "       userid, ".
            "       currencyid, ".
            "       status".
            "       )".
            "       VALUES(".
            "       -1, ".
            "       ".$userdata["id"].", ".
            "       ".$currencyid.", ".
            "       1".
            "       )";
            if (!$db->query($sql)){
                $error = $db->error;
                $db->rollback();
                $db->close();
                badEnd("500", array("msg"=>$error));
            }
            
            // Retornamos el id que fue insertado
            $record->id = (int)$db->insert_id;
        }else{
            $db->rollback();
            $db->close();
            badEnd("500", array("msg"=>"No se logro determinar el tipo de moneda, avise para verificar el interface de la moneda"));
        }
        
        /********************** FONDEO INICIAL DE CUENTAS*****************************/
        
        if($isCripto && intval($row['interface']) == 4){
            /*
            $parms = array('address'=>$walletid,'amount'=>1);
            $request = array('method'=>'sendtoaddress','parms' => $parms);
            $rest = json_decode(queryServicesBTC($BTC_URL, $request), true);
    
            if($rest['error'] != null){
                badEnd('500',array("msg"=>$rest['error']['message']));
            }
    
            $record->probando = $rest;
    
            /*
            //Consultamos la cuenta que tiene la moneda del retiro de AFX
            $sql = "SELECT * FROM accounts WHERE userid = -1".
            "       AND currencyid = ".$currencyid.
            "       AND paymentmethodid = -3";
            if (!$res=$db->query($sql))
                badEnd("500", array("msg"=>$db->error.$sql));
    
            //Guardamos la data de la cuenta AFX
            $afxdata = $res->fetch_assoc();
            
            //Obtenemos el nivel de usuario para determinar su fee
            $sql = "SELECT * FROM users WHERE sessionid = '".$sessionid."'";
            if (!$res=$db->query($sql))
                badEnd("500", array("msg"=>$db->error.$sql));
    
            //Guardamos la data de la cuenta
            $userdata = $res->fetch_assoc();
    
            $level = 1;
    
            if($userdata["level"] == 0){
                $level = 1;
            }else{
                $level = $userdata["level"];
            }
    
            //Obtenemos el fee de cada operacion por la moneda de la cuenta
            $sql = "SELECT * FROM cmspreffees WHERE currencyid = ".$currencyid.
            "       AND levelid = ".$level.
            "       AND usertype = ".$userdata["type"];
            if (!$res=$db->query($sql))
                badEnd("500", array("msg"=>$db->error.$sql));
    
            //Guardamos la data de la cuenta
            $fee = $res->fetch_assoc();
    
            $amount = 5;
    
            //Calculamos el monto real quitandole la comision
            if($fee["pctfeedeposits"] != null){
                if($fee["pctfeedeposits"] == 0){
                    $realfee = number_format($amount - ($amount - $fee["nmlfeedeposits"]), $row['decimals'], '.', '');
                    $realamount = number_format($amount - $realfee, $row['decimals'], '.', '');
                }else{
                    $realfee = number_format(($fee["pctfeedeposits"]*$amount)/100, $row['decimals'], '.', '');
                    $realamount = number_format($amount - $realfee, $row['decimals'], '.', '');
                }
            }else{
                //$realfee = (1*$amount)/100;
                $realfee = 0;
                $realamount = number_format($amount - $realfee, $row['decimals'], '.', '');
            }
            
            //insertamos la trasaccion del deposito
            $sql = "INSERT INTO transactions".
            "       (".
            "       datecreated, ".
            "       dsc, ".
            "       amountghost, ".
            "       amount, ".
            "       accountid, ".
            "       orderid, ".
            "       txid, ".
            "       accountorigin, ".
            "       accountdestination".
            "       )".
            "       VALUES(".
            "       NOW(), ".
            "       'Depósito inicial de pruebas', ".
            "       0, ".
            "       ".$realamount.", ".
            "       ".$record->id.", ".
            "       NULL, ".
            "       NULL, ".
            "       NULL, ".
            "       ".$afxdata['id'].
            "       )";
            if (!$db->query($sql)){
                $error = $db->error;
                $db->rollback();
                $db->close();
                badEnd("500", array("msg"=>$error));
            }
            
            //Guardamos el id de la transaccion de deposito
            $txid = (int)$db->insert_id;
            $out->id = $txid;
            
            //Le colocamos a la primera transferencia el txid
            $sql = "UPDATE transactions SET".
            "       txid = ".$txid.
            "       WHERE id = ".$txid;
            if (!$db->query($sql)){
                $error = $db->error;
                $db->rollback();
                $db->close();
                badEnd("500", array("msg"=>$error));
            }
            
            //insertamos la comision del deposito
            $sql = "INSERT INTO transactions".
            "       (".
            "       datecreated, ".
            "       dsc, ".
            "       amountghost, ".
            "       amount, ".
            "       accountid, ".
            "       orderid, ".
            "       txid, ".
            "       accountorigin, ".
            "       accountdestination".
            "       )".
            "       VALUES(".
            "       NOW(), ".
            "       'Comisión de Depósito inicial de pruebas', ".
            "       0, ".
            "       -".$realfee.", ".
            "       ".$record->id.", ".
            "       NULL, ".
            "       ".$txid.", ".
            "       NULL, ".
            "       ".$afxdata['id'].
            "       )";
            if (!$db->query($sql)){
                $error = $db->error;
                $db->rollback();
                $db->close();
                badEnd("500", array("msg"=>$error));
            }
            
            //insertamos la comision del deposito
            $sql = "INSERT INTO transactions".
            "       (".
            "       datecreated, ".
            "       dsc, ".
            "       amountghost, ".
            "       amount, ".
            "       accountid, ".
            "       orderid, ".
            "       txid, ".
            "       accountorigin, ".
            "       accountdestination".
            "       )".
            "       VALUES(".
            "       NOW(), ".
            "       'Comisión de Depósito inicial de pruebas', ".
            "       0, ".
            "       ".$realfee.", ".
            "       ".$afxdata['id'].", ".
            "       NULL, ".
            "       ".$txid.", ".
            "       NULL, ".
            "       ".$afxdata['id'].
            "       )";
            if (!$db->query($sql)){
                $error = $db->error;
                $db->rollback();
                $db->close();
                badEnd("500", array("msg"=>$error));
            }
    
    
            //insertamos la comision del deposito
            $sql = "INSERT INTO deposits".
            "       (".
            "       paymentref, ".
            "       paymentaccountid, ".
            "       filetype, ".
            "       paymentdate, ".
            "       createddate, ".
            "       fee, ".
            "       transactionid, ".
            "       valid, ".
            "       amount ".
            "       )".
            "       VALUES(".
            "       NULL, ".
            "       ".$afxdata['id'].", ".
            "       NULL, ".
            "       NOW(), ".
            "       NOW(), ".
            "       ".$realfee.", ".
            "       ".$txid.", ".
            "       NULL, ".
            "       ".$amount." ".
            "       )";
            if (!$db->query($sql)){
                $error = $db->error;
                $db->rollback();
                $db->close();
                badEnd("500", array("msg"=>$error));
            }*/
        }
        
        //retornamos el id de la moneda
        $record->currid = (int)$currencyid;
        
        $records [] = $record;
        
        // Obtenemos el nombre del usuario
        $sql = "SELECT IF(userpersons.fname IS NULL, usercompanies.name, CONCAT(userpersons.fname,' ',userpersons.flastname)) AS name ".
        "       FROM users ".
        "       LEFT JOIN userpersons ON userpersons.usrid = users.id ".
        "       LEFT JOIN usercompanies ON usercompanies.usrid = users.id ".
        "       WHERE sessionid = '".$sessionid."'";
        if (!$res=$db->query($sql)){
            $error = $db->error;
            $db->rollback();
            $db->close();
            badEnd("500", array("msg"=>$error));
        }
        
        $userdataaudit = $res->fetch_assoc();
    
        //auditoria
        setAudit($db, "F. DE PAGO", $sessionid, "APP", "Se creo una cuenta de ".$currencynameaudit."(".$currencyid.") para el usuario ".$userdataaudit['name']);
        $db->commit();
        
        $db->autocommit(TRUE);
    }
    
    // Retornamos los records
    $out = $records;
    
    //Cerramos la conexion
    $db->close();
    
    header("HTTP/1.1 200");
    echo (json_encode($out));
    die();
?>
