<?php

namespace Modules\Additional\Specifique\Client123\Modules\Outil;

use Helpers\ChampsSupplementaire\ChampSupp;

class CalculCodeTaxe
{
    
    public static function calculCodeTaxe($pdo, $param)
    {
        // Initialisation du code taxe en fonction du CDC (Compte comptable) et du Code Atlas
        $Dilispec = new  \Entity\Model\Dilispec($pdo);
        $CsDon = new  \Entity\Model\CsDon($pdo);
        $Societe = new  \Entity\Model\Societe($pdo);
        $Fourniss = new  \Entity\Model\Fourniss($pdo);

        $fournisseur = $param['fournisseur'];
        $ste = $param['societe'];

        /* Récupération de la valeur du Code Atlas selon le Type TVA du fournisseur */
        $typeTvaFour = $Fourniss->find($fournisseur)['TYP_TVA'];
        $NUM_FIX_CODE_ATLAS = $Dilispec->find(['TYPEDICO' => 'PARNCS0123', 'CODEDICO'=> 'NCS_TYPETVA_CODE_ATLAS'])['LIB01DICO'];
        $codeAtlas = $CsDon->find(['COD_TAB' => 'TYPETVA', 'COD_ENR' => $typeTvaFour, 'NUM_FIX' => trim($NUM_FIX_CODE_ATLAS)])['VALEUR'];
        
        /* Récupération de la valeur du CODE TAXE selon le CDC */
        $NUM_FIX_CODE_TAXE_CDC = $Dilispec->find(['TYPEDICO' => 'PARNCS0123', 'CODEDICO'=> 'NCS_CODECOMP_CODE_TAXE'])['LIB01DICO'];
        $codeTva = $CsDon->find(['COD_TAB' => 'CODECOMP', 'COD_ENR' => $param['codeEnrCdc'], 'NUM_FIX' => trim($NUM_FIX_CODE_TAXE_CDC)])['VALEUR'];
        
        /* Initalisation CS */
        $valeurCodeTaxe = '';

        $paysIntal = \unserialize($_SESSION['OxaParams'], ["allowed_classes" => false])['PAYSINSTAL'];
        $paysSte = $Societe->find($ste)['PAYS'];
        
        // Si pays de la société de la facture = pays de la base
        if ($paysSte == $paysIntal && $codeAtlas != '' && $codeTva != '') {
            switch ($codeAtlas) {
                case 'FRA':
                    $valeurCodeTaxe = $codeTva;
                    break;
                case 'CEE':
                    $valeurCodeTaxe = 'FR031';
                    break;
                case 'EXO':
                case 'EXP':
                    /** @phpstan-ignore-next-line */
                    $caract4 = substr($codeTva, 3, 1)+4;
                    $valeurCodeTaxe = substr($codeTva, 0, 3).$caract4.'9';
                    break;
            }
        }

        $NUM_FIX_CODE_TAXE_FACLIG = $Dilispec->find(['TYPEDICO' => 'PARNCS0123', 'CODEDICO'=> 'NCS_FAC_LIG_CODE_TAXE'])['LIB01DICO'];
        $result = ['csNumCodeTaxe' => trim($NUM_FIX_CODE_TAXE_FACLIG), 'CodeTaxe' => $valeurCodeTaxe];

        // Récupération du taux de TVA
        $outilCalculCodeTaxe = new \Modules\Additional\Specifique\Client123\Modules\Outil\CalculCodeTaxe();
        $resultTauxTva = $outilCalculCodeTaxe->calculTauxTva($pdo, $valeurCodeTaxe);
        if ($resultTauxTva['paramTva']) {
            $result = array_merge($result, $resultTauxTva);
        }
        
        return $result;
    }
    
    public static function calculTauxTva($pdo, $codeTaxe)
    {
        // Récupération du Type CS du Code taxe
        $Dilispec = new  \Entity\Model\Dilispec($pdo);
        $codTab_codeTaxe = $Dilispec->find(['TYPEDICO' => 'PARAMSOCO', 'CODEDICO'=> 'CSTYPE_CODETAXE'])['LIB01DICO'];
        
        // Récupération du numéro de CS Taux de TVA
        $req = "SELECT LIB01DICO FROM DILISPEC with(nolock) WHERE TYPEDICO='PARNCS0123' 
        AND CODEDICO='NCS_'+LTRIM(rtrim((SELECT LIB01DICO FROM DILISPEC with(nolock) WHERE TYPEDICO='PARAMSOCO' and CODEDICO='CSTYPE_CODETAXE')))+'_TVA'";

        $sql = $pdo->prepare($req);
        $sql->execute();
        $numCS = trim(($sql->fetch()['LIB01DICO']) ?? '0');
        
        $paramTva = 0;
        if ($numCS != '0' && $numCS != '') {
            // Récupération du taux de TVA
            $paramTva = 1;
            $tauxTva = trim(ChampSupp::getValueCS($codTab_codeTaxe, $codeTaxe, $numCS, $pdo));
            if ($tauxTva == '') {
                $tauxTva = 0;
            }
        }
        
        return ['paramTva' => $paramTva, 'TAUX_TVA' => $tauxTva ?? null];
    }
}
