<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Request;
use Illuminate\Support\Facades\Session;

use App\Custom\Misc;
use App\Custom\SQLConnection;

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) && ($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;
            }
            /* 
                html_entity_decode: Esta funcion convierte las entidades HTML (como &#209;) en sus caracteres correspondientes (por ejemplo, Ñ).
                ENT_QUOTES | ENT_HTML5: Estas banderas aseguran que tanto las comillas simples como las dobles se decodifiquen, y que la funcion utilice HTML5.
                'UTF-8': Esto especifica la codificacion de caracteres que se debe utilizar (en este caso, UTF-8)
            */
            $other_addresses["address"] = html_entity_decode($objeto->domicilio ?? null, ENT_QUOTES | ENT_HTML5, 'UTF-8');
            $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);
    }

    // ------------- OBTENER CHEQUES ------------------------------------
    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 ?? [];
    }

    // ------------- 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;
    }

    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;
    }
}
