<?php namespace App\Http\Controllers;

use App\Http\Controllers\MainController;
use App\Http\Controllers\ApiControllerV1;
use App\Http\Controllers\AFIPController;
use App\Custom\SQLConnection;
use App\Custom\Misc;
use stdClass;
use Session;
use Request;


class DataMatrixApiController extends Controller {

  public function obtenerDatos() {
    /*$cuit = '30505940187';
    $cuit = '30690771205';
    $cuit = '30500049460';
    $cuit = '30500010912';
    $cuit = '30501677643';
    $cuit = '30641368977';*/

    $sesion              = Self::obtenerSesion();
    $cuit                = $sesion['tax_id'];
    
    $info = [];
    $obtener_id_padron = SQLConnection::obtenerIdPadron($cuit);
    if(is_null($obtener_id_padron)){
      echo  json_encode(array('error'=>'1','message' =>'Error: Invalid Tax ID'));
      die();
    }
    $id_padron           = $obtener_id_padron->id_padron;
    $tipo_persona        = (substr($cuit,0,1) != '3') ? 'f' : 'j' ;

    $sociedad            = SQLConnection::obtenerSociedades($cuit);
    $domicilios          = SQLConnection::obtenerDomicilios($cuit);
    foreach ($domicilios as $objeto) {
      $domicilios_ordenados[$objeto->tipo_domicilio ?? "O"][] = $objeto;
    }
    $actividades         = SQLConnection::obtenerPadronActividades($cuit);
    $score               = json_decode(ApiControllerV1::obtenerServicioScore($cuit,true));
    if(!empty($score) && isset($score->score)){
      $score = $score->score;
    }
    $nombres_anteriores  = SQLConnection::backendCambiosNombres($cuit);
    $telefonos           = SQLConnection::backendStoreProcedure('obtener_telefono', array($id_padron));
    $telefonos_ordenados = [];
    foreach ($telefonos as $objeto) {
      $telefonos_ordenados[$objeto->tipo ?? "SIN_DESCRIPCION"][] = $objeto->telefono ?? null;
    }
    $emails              = SQLConnection::backendStoreProcedure('obtener_emails', array($id_padron));
    foreach ($emails as $objeto) {
      $emails_ordenados[$objeto->tipo ?? "SIN_DESCRIPCION"][]    = $objeto->email ?? null;
    }
    $demandados          = SQLConnection::obtenerJuiciosDemandadoActor(null,'D',$cuit);
    $socios_directores   = SQLConnection::obtenerSociosDirectores($cuit, $tipo_persona);
    $empleados           = SQLConnection::obtenerEmpleados($cuit);
    $bancos_de_cuit      = SQLConnection::backendStoreProcedure('obtener_bancos_de_cuit', array($cuit));
    $situaciones_bancos  = self::obtenerSituacionesBancos($cuit);
    $cheques             = self::obtenerCheques($cuit);

    // dd($cheques);
    // return response()->json($cheques);

    // ======================================= Company Summary =======================================
    
    $company_summary = [];
    $company_summary["business_name"]                       = $sociedad->nombre_persona ?? null;
    $company_summary["country"]                             = 'AR'; // ????
    $company_summary["company_registration_number"]         = $sociedad->nro_ins_rpc ?? null;
    $company_summary["activity_code"]                       = null;
    $company_summary["activity_description"]                = null;
    $company_summary["provider_credit_rating"]              = $score ?? null;
    $company_summary["provider_rating_description"]         = null; // ????

    // ======================================= Company Identification =======================================
    
    $company_identification = [];
    $company_identification["activity"] = [];
    $company_identification["previous_names"] = [];

    // Basic Information
    $basic_information = [];
    $basic_information["business_name"]                     = $sociedad->nombre_persona ?? null;
    $basic_information["registered_company_name"]           = $sociedad->nombre_persona ?? null;
    $basic_information["company_registration_number"]       = $sociedad->nro_ins_rpc ?? null;
    $basic_information["country"]                           = 'AR'; // ????
    $basic_information["vat_registration_number"]           = $cuit ?? null;
    $basic_information["vat_registration_date"]             = null; // ????
    $basic_information["date_of_company_registration"]      = $sociedad->fecha_cons ?? null;
    $basic_information["date_of_starting_operations"]       = $sociedad->fecha_contrato_social ?? null;
    $basic_information["legal_form"]                        = $sociedad->tipo_sociedad ?? null;
    $basic_information["type_of_ownership"]                 = null; // ????
    $basic_information["currency_of_this_Report"]           = $sociedad->moneda ?? null;
    $basic_information["principal_activity_code"]           = null;
    $basic_information["principal_activity_description"]    = null;
    $basic_information["contact_address"]                   = $emails_ordenados["COMERCIAL"][0] ?? $emails_ordenados["PERSONAL INTERNET"][0] ?? $emails_ordenados["PERSONAL"][0] ?? $emails_ordenados["E-VENTANILLA"][0] ?? $emails_ordenados["OTROS"][0] ?? $emails_ordenados["SIN_DESCRIPCION"][0] ?? null;
    $basic_information["contact_telephone_number"]          = $telefonos_ordenados["FIJO"][0] ?? $telefonos_ordenados["MOVIL"][0] ?? $telefonos_ordenados["SIN_DESCRIPCION"][0] ?? null;

    // Activity
    $activity = [];
    foreach ($actividades as $actividad) {
      if (isset($actividad->principal) and ($actividad->principal == 1)) {
        $company_summary["activity_code"]                       = $actividad->cod_clae ?? null;
        $company_summary["activity_description"]                = $actividad->descripcion ?? null;
        $basic_information["principal_activity_code"]           = $actividad->cod_clae ?? null;
        $basic_information["principal_activity_description"]    = $actividad->descripcion ?? null;
      }
      $activity["activity_code"]                      = $actividad->cod_clae ?? null;
      $activity["activity_description"]               = $actividad->descripcion ?? null;
      $company_identification["activity"][]           = $activity;
    }
    $company_identification["basic_information"]      = $basic_information;

    // Previous Names
    $previous_names = [];
    foreach ($nombres_anteriores as $anterior) {
      $previous_names["previous_name"]                = $anterior->nombre ?? null;
      $previous_names["date_changed"]                 = $anterior->fecha ?? null;
      $company_identification["previous_names"][]     = $previous_names;
    }

    // ======================================= Credit Score =======================================
   
    $credit_score = [];

    // Company Rating and Limit
    $company_rating_and_limit = [];
    $company_rating_and_limit["current_provider_credit_rating"]        = $score ?? null;
    $company_rating_and_limit["current_provider_rating_description"]   = null;
    $credit_score["company_rating_and_limit"] = $company_rating_and_limit;

    // ======================================= Contact Information =======================================
    
    $contact_information = [];

    // Main Address
    $main_address = [];
    $main_address["address"]               = null;
    $main_address["country"]               = null;
    $main_address["telephone"]             = null;
    if (isset($domicilios_ordenados["D"])) {
      $main_address["address"]             = $domicilios_ordenados["D"][0]->domicilio ?? null;
      $main_address["country"]             = $domicilios_ordenados["D"][0]->pai_nombre ?? null;
      $main_address["telephone"]           = $basic_information["contact_telephone_number"];
    } elseif (isset($domicilios_ordenados["L"])) {
      $main_address["address"]             = $domicilios_ordenados["L"][0]->domicilio ?? null;
      $main_address["country"]             = $domicilios_ordenados["L"][0]->pai_nombre ?? null;
      $main_address["telephone"]           = $basic_information["contact_telephone_number"];
    }
    $contact_information["main_address"]   = $main_address;

    // Other Addresses
    $other_addresses = [];
    $contact_information["other_addresses"] = [];
    foreach ($domicilios as $objeto) {
      if ($objeto->tipo_domicilio == 'D') {continue;}
      $other_addresses["address"]               = $objeto->domicilio ?? null;
      $other_addresses["country"]               = $objeto->pai_nombre ?? null;
      $contact_information["other_addresses"][] = $other_addresses;
    }

    // E-Mail Addresses
    $email_addresses = [];
    $contact_information["email_addresses"]     = [];
    foreach ($emails as $objeto) {
      $email_addresses["email"]                 = $objeto->email ?? null;
      $contact_information["email_addresses"][] = $email_addresses["email"];
    }

    // ======================================= Negative Information =======================================
    
    $negative_information = [];
    /* 
    "cause_name": "DAÑOS Y PERJUICIOS",
    "cause_date": "2016-10-18",
    "court": "2 C Y C DE LOMAS DE ZAMORA",
    "secretary": "U EXP 89527",
    "actor_identification_card": "",
    "actor_name": "",
    "observations": "MASTROIANNI JONATAN",
    "expedient": null,
    */

    // juicios 
    foreach($demandados as $demandado) {
      $judgment["cause_name"]                 = $demandado->nombre_causa ?? null;
      $judgment["cause_date"]                 = $demandado->fecha_causa ?? null;
      $judgment["court"]                      = $demandado->juzgado ?? null;
      $judgment["secretary"]                  = $demandado->secretaria ?? null;
      $judgment["actor_identification_card"]  = $demandado->cuit_otra_parte ?? null;
      $judgment["actor_name"]                 = $demandado->nombre_padron_otra_parte ?? $demandado->nombre_otra_parte ?? null;
      $judgment["observations"]               = $demandado->observaciones ?? null;
      $judgment["expedient"]                  = $demandado->expediente ?? null;

      if($demandado->grupo  == 'OJC') {
        // otros_juicios_comerciales
        $other_comercial_judgments[]      = $judgment;
      } elseif($demandado->grupo  == 'CYQ') { 
        // concursos_quiebras
        $contests_and_bankruptcies[]  = $judgment;
      } elseif($demandado->grupo  == 'PQ') {
        // pedidos_quiebra
        $bankruptcy_orders[]              = $judgment;
      }
    }
    $negative_information["contests_and_bankruptcies"] = $contests_and_bankruptcies ?? null;
    $negative_information["bankruptcy_orders"]             = $bankruptcy_orders ?? null;
    $negative_information["other_comercial_judgments"]     = $other_comercial_judgments ?? null;

    // Situaciones mayores a uno
    $negative_information["bank_situation"] = $situaciones_bancos ?? null;

    // cheques
    $negative_information["checks"] = $cheques;


    // ======================================= Directors / Managers =======================================

    $directors_managers = [];
    $directors_managers["current_directors_managers"] = [];

    // Current Directors / Managers
    $current_directors_managers = [];
    foreach ($socios_directores as $objeto) {
      $datos_persona        = new stdClass();
      $domicilios_persona_ordenados = [];
      if (isset($objeto->cuit)) {
        $datos_persona      = SQLConnection::obtenerCardScorePF($objeto->cuit);
        $domicilios_persona = SQLConnection::obtenerDomicilios($objeto->cuit);
        foreach ($domicilios as $dom) {
          $domicilios_persona_ordenados[$dom->tipo_domicilio ?? "O"][] = $dom;
        }
      }
      $current_directors_managers["taxid"]                 = $objeto->cuit ?? null;
      $current_directors_managers["name"]                  = $objeto->nombre_persona ?? null;
      $current_directors_managers["gender"]                = $datos_persona->sexo ?? null;
      $current_directors_managers["address"]               = $domicilios_ordenados["D"][0]->domicilio ?? $domicilios_ordenados["L"][0]->domicilio ?? $domicilios_ordenados["O"][0]->domicilio ?? null;
      $current_directors_managers["date_of_birth"]         = $datos_persona->fecha_nac ?? $objeto->fecha_nac ?? null;
      $current_directors_managers["position"]              = $objeto->car_nombre ?? null;
      $current_directors_managers["date_appointed"]        = $objeto->c04_periodo_desde ?? null;
      $directors_managers["current_directors_managers"][]  = $current_directors_managers;
    }

    // ======================================= Other Information =======================================
   
    $other_information = []; 

    // Employee Information
    $employee_information = [];
    $employee_information["year"]                = isset($empleados->fecha) ? Misc::convertirFormatoFecha($empleados->fecha,'m/Y','Y-m') : null;
    $employee_information["number_of_employees"] = isset($empleados->total) ? (int)$empleados->total : null;
    $other_information["employee_information"]   = $employee_information;

    // Bankers
    $bankers = [];
    $other_information["bankers"]       = [];
    foreach ($bancos_de_cuit as $banco) {
      $bankers["name"]                  = $banco->nombre ?? null;
      $bankers["bankers_address"]       = $banco->email ?? null;
      $bankers["bank_code"]             = $banco->cod_banco ?? null;
      $other_information["bankers"][]   = $bankers;
    }

    // ======================================= Financial Statements =======================================

    /*
    $financial_statements = [];

    //Profit & Loss Account
    $profit_and_loss_account = [];
    $profit_and_loss_account["financial_year"]          = null;
    $profit_and_loss_account["number_of_weeks"]         = null;
    $profit_and_loss_account["currency"]                = null;
    $profit_and_loss_account["consolidated_accounts"]   = null;
    $profit_and_loss_account["revenue"]                 = null;
    $profit_and_loss_account["operating_costs"]         = null;
    $profit_and_loss_account["operating_profit"]        = null;
    $profit_and_loss_account["wages_and_salaries"]      = null;
    $profit_and_loss_account["pension_costs"]           = null;
    $profit_and_loss_account["depreciation"]            = null;
    $profit_and_loss_account["amortisation"]            = null;
    $profit_and_loss_account["financial_income"]        = null;
    $profit_and_loss_account["financial_expenses"]      = null;
    $profit_and_loss_account["extraordinary_income"]    = null;
    $profit_and_loss_account["extraordinary_costs"]     = null;
    $profit_and_loss_account["profit_before_tax"]       = null;
    $profit_and_loss_account["tax"]                     = null;
    $profit_and_loss_account["profit_after_tax"]        = null;
    $profit_and_loss_account["dividends"]               = null;
    $profit_and_loss_account["minority_interests"]      = null;
    $profit_and_loss_account["other_appropriations"]    = null;
    $profit_and_loss_account["retained_profit"]         = null;
    $financial_statements["profit_and_loss_account"] = $profit_and_loss_account;
    */

    //-------------------------------------------------------------------------

    $info["company_summary"]          = $company_summary;
    $info["company_identification"]   = $company_identification;
    $info["credit_score"]             = $credit_score;
    $info["contact_information"]      = $contact_information;
    $info["negative_information"]     = $negative_information;
    $info["directors_managers"]       = $directors_managers;
    $info["other_information"]        = $other_information;
    // $info["financial_statements"]     = $financial_statements;
    
    return response()->json($info);
  }







  // ------------- SITUACIONES DE BANCOS ------------------------------------
  public static function obtenerSituacionesBancos($cuit) {
    $situaciones_bancos_ordenados           = [];
    $situaciones_bancos_ordenados_separados = [];
    $periodos_ordenados         = [];
    $periodo = [];
    $periodo_maximo             = SQLConnection::obtenerPeriodoMaximo($cuit);

    for ($i = 0; $i <= 23; $i++) {
      if ($i%8==0){
          $periodo[$i] = date("Ym", strtotime( $periodo_maximo." -$i months"));
      }else{
        $periodo[$i] = date("Ym", strtotime( $periodo_maximo." -$i months")); 
      }
    }
    krsort($periodo);
    $periodo = array_values($periodo);
    $obtener_situaciones_bancos = SQLConnection::obtenerBancos($cuit);
    if($obtener_situaciones_bancos){
      foreach($obtener_situaciones_bancos as $key_banco =>$banco) {
        foreach($periodo as $key_mes => $mes) {
          if($mes == $banco->fec_inf) {
            if(($obtener_situaciones_bancos[$key_banco]->situacion)) {
              if(!isset(  $situaciones_bancos_ordenados['total_period'][$mes]['total_period'] )) {
                  $situaciones_bancos_ordenados['total_period'][$mes]['total_period']  = 0;
              }
              $situaciones_bancos_ordenados[$banco->nombre][$mes]['situation']  = $obtener_situaciones_bancos[$key_banco]->situacion;
              $situaciones_bancos_ordenados[$banco->nombre][$mes]['total']      = $obtener_situaciones_bancos[$key_banco]->total ?? 0;
              $situaciones_bancos_ordenados['total_period'][$mes]['total_period'] += $obtener_situaciones_bancos[$key_banco]->total ?? 0;
            }
          }
        }
      }

      foreach($situaciones_bancos_ordenados as $key_bo => $bancos) {
        ksort ($situaciones_bancos_ordenados[$key_bo]);
      }
    
      foreach($situaciones_bancos_ordenados as $key_bo => $bancos) {
        $i =0;
        $n =0;
        foreach($bancos as $key_b  => $banco) {
          if($n%8==0) {
            $i++;
          }
          $situaciones_bancos_ordenados_separados[$key_bo][$i][$key_b] = $banco;
          $n++;
        }
      }
      $i =0;
      foreach($periodo as $key_mes => $mes) {
        if($key_mes%8==0) {
          $i++;
        }
        $periodos_ordenados[$i][$key_mes] = $mes;
      }
    }
    $periodo = $periodos_ordenados;
    $situaciones_bancos_ordenados_separados = array_reverse($situaciones_bancos_ordenados_separados);
    
    return $situaciones_bancos_ordenados_separados;
  }

  public function obtenerCheques($cuit) {
  /*
    "nombre_persona_firmante": "SANCOR COOPERATIVAS UNIDAS LIMITADA",
    "cuit_firmante": "30501677643",
    "nombre_persona_relacionado": "0",
    "Cuit_relacionado": "0",
    "nro_cheque": "48106",
    "idp": "22584",
    "idppr": "0",
    "fecha_rechazo": "01/03/2017",
    "fecha_levantamiento": null,
    "fecha_pago": "03/01/2017",
    "importe": "42874976.00",
    "cantidad": "0",
    "causa": "SIN FONDOS",
    "tipo": "a_nombre_de_empresa",
    "total_cheques": "150"
  */

    $cheques = SQLConnection::backendStoreProcedure('obtener_cheques', array($cuit, null, 2147483647));
    if($cheques){
      foreach($cheques as $key => $cheque) {
        if ($cheque->tipo == "a_nombre_de_empresa") {
          $aux_cheque = [];
          $aux_cheque["signer_name"] = $cheque->nombre_persona_firmante ?? null;
          $aux_cheque["signer_identification_card"] = $cheque->cuit_firmante ?? null;
          $aux_cheque["related_person_name"] = (isset($cheque->nombre_persona_relacionado) && $cheque->nombre_persona_relacionado != "0") ? $cheque->nombre_persona_relacionado : null;
          $aux_cheque["related_person_identification_card"] = (isset($cheque->Cuit_relacionado) && $cheque->Cuit_relacionado != "0") ? $cheque->Cuit_relacionado : null;
          $aux_cheque["check_number"] = $cheque->nro_cheque;
          $aux_cheque["reject_date"] = $cheque->fecha_rechazo;
          $aux_cheque["pick_up_date"] = $cheque->fecha_levantamiento;
          $aux_cheque["payment_date"] = $cheque->fecha_pago;
          $aux_cheque["amount"] = $cheque->importe;
          if (($cheque->causa == "SIN FONDOS") ) {
            $cheques_ordenados["without_funds"][] = $aux_cheque;
          }
        }
      }
    }
    return $cheques_ordenados ?? [];
  }

  private static function obtenerSesion(){
    $cuit           = isset($_POST['tax_id'])   ? $_POST['tax_id']    : '';
     //obtenerAFIP.
    if(!empty($cuit) && strlen($cuit) == 11){
      AFIPController::obtenerPadron($cuit,true,'AR',false);
    }
    $apikey         = isset($_POST['apikey']) ? $_POST['apikey']  : '';
    $usuario        = Session::get('usuario');
    $user_id        = $usuario->user_id;
    //SQLConnection::consumirServicio($user_id,$cuit,29);
    $producto       = $usuario->producto ?? 29;
    ApiControllerV1::consumir_servicio($cuit,$producto); 

    if(empty($cuit) || !Misc::esCuitArgentino($cuit)) {
      echo  json_encode(array('error'=>'1','message' =>'Error: La CUIT no está seteada o es inválida'));
      die();
    }
    $razon_social   = SQLConnection::obtenerRazonSocial($cuit);
    if(!$razon_social){
      echo  json_encode(array('error'=>'1','message' =>'Error: La CUIT no está seteada o es inválida'));
      die();

     }
    $razon_social   = $razon_social->nombre_persona;
    $client_id      = $usuario->cliente['client_id'];
    $secciones      = self::obtenerSeccionesHabilitadas($user_id,$apikey);
    $usuario->cliente[ENV('INFORME_API')]             = new stdClass;
    $secciones = array_change_key_case($secciones, CASE_LOWER);
    $usuario->cliente[ENV('INFORME_API')]->secciones  = $secciones;
    $usuario->cliente[ENV('INFORME_API')]->client_id  = $client_id;
    Session::put('usuario',$usuario);
    Session::save();
    return ['tax_id' => $cuit,'razon_social' => $razon_social,'apikey' => $apikey,'secciones' => $secciones];
  }

  private static function obtenerSeccionesHabilitadas($user_id,$apikey){
    if($user_id == '673762136' || $apikey = 'E6AF0CC45EB1D3CE'){
      $secciones_habilitadas  = SQLConnection::obtenerSeccionesHabilitadasInforme($user_id,ENV('INFORME_API'));
    }else{
      $secciones_habilitadas  = SQLConnection::obtenerSeccionesHabilitadasInforme($user_id,ENV('ID_INFORME_COMERCIAL'));
    }

    $secciones_habilitadas_ordenadas = [];
    foreach($secciones_habilitadas as $secciones){
      $secciones_habilitadas_ordenadas[$secciones->nombre_seccion] = $secciones; 
    }
    return $secciones_habilitadas_ordenadas;
  }

}