<?php

namespace Modules\Facture\WebService;

use Helpers\Fichier\Fichier;
use Helpers\Outil\Sql;
use Helpers\Outil\StringHelper;
use Helpers\Session\ParseBase1;

class CreationFacture
{
    public static function creationEntete($array)
    {
        $docRatt = '';
        $pj = '';
        $nbDocRatt = 1;
        $nbPJ = 1;
        $cs = '';
        foreach ($array as $key => $value) {
            $tbKey = explode('-', $key);
            if ($tbKey[0]=="PJ" and $tbKey[1]=="NO_ORDRE") {
                $NO_ORDRE = $value;
                $pj .=
                '<PJ>
                    <NO_ORDRE>'.$nbPJ++.'</NO_ORDRE>
                    <TYPE_PJ>'.$array['PJ-TYPE_PJ-'.$NO_ORDRE].'</TYPE_PJ>
                    <TITRE>'.htmlspecialchars($array['PJ-TITRE-'.$NO_ORDRE]).'</TITRE>
                    <LECTURE>'.$array['PJ-LECTURE-'.$NO_ORDRE].'</LECTURE>
                    <IMP_PJ>'.$array['PJ-IMP_PJ-'.$NO_ORDRE].'</IMP_PJ>
                    <IMP_TITRE>'.$array['PJ-IMP_TITRE-'.$NO_ORDRE].'</IMP_TITRE>
                    <NOM_FIC>'.htmlspecialchars($array['PJ-NOM_FIC-'.$NO_ORDRE]).'</NOM_FIC>
                    <NOM_ORI>'.htmlspecialchars($array['PJ-NOM_ORI-'.$NO_ORDRE]).'</NOM_ORI>
                </PJ>';
            }
            if ($tbKey[0]=="DC" and $tbKey[1]=="NO_ORDRE") {
                $NO_ORDRE = $value;
                $docRatt .=
                '<DOC>
                    <NO_ORDRE>'.$nbDocRatt++.'</NO_ORDRE>
                    <TYPE_PJ>'.$array['DC-TYPE_PJ-'.$NO_ORDRE].'</TYPE_PJ>
                    <TITRE>'.htmlspecialchars($array['DC-TITRE-'.$NO_ORDRE]).'</TITRE>
                    <NOM_FIC>'.htmlspecialchars($array['DC-NOM_FIC-'.$NO_ORDRE]).'</NOM_FIC>
                    <NOM_ORI>'.htmlspecialchars($array['DC-NOM_ORI-'.$NO_ORDRE]).'</NOM_ORI>
                </DOC>';
            }
           
            $tbKeyCs = explode('debut-----fin', $key);
            if ($tbKeyCs[0]=="CS_EXTENTION") {
                $cs .=
                '<ChpSup>
                    <CSNumFixe>'.$tbKeyCs[3].'</CSNumFixe>
                    <CSValeur>'.htmlspecialchars($value).'</CSValeur>
                </ChpSup>';
            }

            // Cs with short key
            if (str_starts_with($key, 'Cs_')) {
                $cs .=
                '<ChpSup>
                    <CSNumFixe>'.StringHelper::removePrefix($key, 'Cs_').'</CSNumFixe>
                    <CSValeur>'.htmlspecialchars($value).'</CSValeur>
                </ChpSup>';
            }
        }
        
        $TYPE_IMAGE = '';
        if (isset($array['FIC_LAD']) && $array['FIC_LAD']!='') {
            if (strpos($array['FIC_LAD'], 'http') === false) {
                $TYPE_IMAGE = 'C';
            } else {
                $TYPE_IMAGE = 'E';
            }
        }
        
        $xml = '<CreatFacture_In LngUtilisation="'.htmlspecialchars($_SESSION['Session_Langue']).'">
                    <Utilisateur>'.htmlspecialchars($_SESSION['Session_Login']).'</Utilisateur>
                    <TYPE>'.$array['TYPE'].'</TYPE>
                    <NO_FACT>'.$array['numEnregistrement'].'</NO_FACT>
                    <CODE_STE>'.htmlspecialchars($array['societe']).'</CODE_STE>
                    <LIB_COMPT>'.htmlspecialchars($array['LIB_COMPT']).'</LIB_COMPT>
                    <CODE_FOUR>'.$array['CODE_FOUR'].'</CODE_FOUR>
                    <FACT_FOU>'.$array['FACT_FOU'].'</FACT_FOU>
                    <DATE_FAFO>'.$array['DATE_FAFO'].'</DATE_FAFO>'
                    . (! empty($array['FacAnterieur'])
                    ? '<ListeFacturesAnterieures>
                        <FactureAnterieure>
                            <NUMFAC_ANTERIEURE>'.$array['FacAnterieur'].'</NUMFAC_ANTERIEURE>
                        </FactureAnterieure>
                    </ListeFacturesAnterieures>' : '')
                    . '<NUM_CDE>'.$array['NUM_CDE'].'</NUM_CDE>
                    <TOTAL_HT>'.$array['TOTAL_HT'].'</TOTAL_HT>
                    <TOTAL_TTC>'.$array['TOTAL_TTC'].'</TOTAL_TTC>
                    <DEVISE>'.$array['DEVISE'].'</DEVISE>
                    <TX_DEVISE>'.($array['TX_DEVISE']??'1').'</TX_DEVISE>
                    <TX_DEVSTE>'.($array['TX_DEVSTE']??'0').'</TX_DEVSTE>'
                    .implode(PHP_EOL, array_map(
                        fn($facEntKey, $tag) => '<'.$tag.'>'.htmlspecialchars($array[$facEntKey] ?? '') . '</'.$tag.'>',
                        $mapFields = [
                            'IBAN_COMPTE' => 'IBANCPT',

                            'IBAN_PAYS' => 'IBANPAYS',
                            'IBAN_CLE' => 'IBANCLE',
                            'CODE_BANQ' => 'CODE_BANQ',
                            'CODE_GUIC' => 'CODE_GUIC',
                            'NUM_COMPT' => 'NUM_COMPT',
                            'CLE_RIB' => 'CLE_RIB',

                            'DOM_BANQ' => 'DOM_BANQ',
                            'CODE_BIC' => 'CODEBIC',
                        ],
                        array_keys($mapFields)
                    ))
                    . '<ListCdes>'
                    . implode(PHP_EOL, array_map(
                        fn($numCde) => '<NUM_CDE>'.htmlspecialchars($numCde) . '</NUM_CDE>',
                        $array['ListCommandeId']
                        ?? array_filter([$array['CdeLad'] ?? null])
                    ))
                    .'</ListCdes>
                    <ISSUE_FE>'.(Sql::toBool($array['ISSUE_FE'] ?? false) ? 'true' : 'false') . '</ISSUE_FE>
                    <DATE_ENR>'.$array['DATE_ENR'].'</DATE_ENR>
                    <DATE_PER>'.$array['DATE_PER'].'</DATE_PER>
                    <ORDO>'.($array['ORDO']??'').'</ORDO>
                    <DTAE_ECH>'.$array['DTAE_ECH'].'</DTAE_ECH>
                    <FIC_LAD>'.htmlspecialchars($array['FIC_LAD']).'</FIC_LAD>
                    <TYPE_IMAGE>'.$TYPE_IMAGE.'</TYPE_IMAGE>
                    <MODE_PAIE>'.$array['modepaie'].'</MODE_PAIE>
                    <ListPJ>'.$pj.'</ListPJ>
                    <DocATT>'.$docRatt.'</DocATT> 
                    <ListChpSup>'.$cs.'</ListChpSup>
                </CreatFacture_In>';

        return new \Helpers\Webservice\Wsdl('Oxaproc_Gen.wsdl', 'OXAPRC_CREAT_FACT', $xml, false);
    }

    /**
     * @param array<mixed> $flow
     * @param array<mixed> $mappage
     */
    public static function convertToFacEnt(array $flow, array $mappage) :\SimpleXMLElement
    {
        $newName = Fichier::generateTmpUniqName($flow['FIC_LISIBLE']);// Generate new file name
        $b = Fichier::copyFile(
            (new ParseBase1())->getRep()->pj . DIRECTORY_SEPARATOR . $flow['FIC_LISIBLE'],
            (new ParseBase1())->getRep()->tmp . DIRECTORY_SEPARATOR . $newName
        );
        if ($b === false) {
            throw new \Exception('copyFile failed');
        }
        $res = \Modules\Facture\WebService\CreationFacture::creationEntete([
            'TYPE' => $mappage['TYPE_NEW'],
            'societe' => $mappage['CODE_STE'],
            'FIC_LAD' => $newName,
        ] + $mappage);
        return new \SimpleXMLElement($res->responseData);
    }
    
    /**
     * @param mixed $numFacture
     * @param array{
     *     listSelectionCde?:array<string>,
     *     listSelectionFac?:array<string>,
     *     DTE_PER_DEB?:string,
     *     DTE_PER_FIN?:string,
     * } $post
     * @return \Helpers\Webservice\Wsdl
     */
    public static function choixDesCommandes($numFacture, $post)
    {
        $xml ='<FactDemandeListeAffectation_In LngUtilisation="'.htmlspecialchars($_SESSION['Session_Langue']).'">
                    <Utilisateur>'.htmlspecialchars($_SESSION['Session_Login']).'</Utilisateur>
                    <NUM_FACT>'.$numFacture.'</NUM_FACT>
                    <LISTE_CDES>'
                    . htmlspecialchars(implode(',', $post['listSelectionCde'] ?? []))
                    . '</LISTE_CDES>
                    <LISTE_FACT>'
                    . htmlspecialchars(implode(',', $post['listSelectionFac'] ?? []))
                    .'</LISTE_FACT>
                    <DTE_PER_DEB>'
                    . ($post['DTE_PER_DEB'] ?? '')
                    . '</DTE_PER_DEB>
                    <DTE_PER_FIN>'
                    . ($post['DTE_PER_FIN'] ?? '')
                    .'</DTE_PER_FIN>
                </FactDemandeListeAffectation_In>';
                
        return new \Helpers\Webservice\Wsdl('Oxaproc_Gen.wsdl', 'OXAPRC_PROPOSE_AFFECT', $xml, false, true);
    }
    
    public static function enregistrementAffectation($array, $post)
    {
        $xml ='<FactEnregListeAffectation_In LngUtilisation="'.htmlspecialchars($_SESSION['Session_Langue']).'">
                <Utilisateur>'.$_SESSION['Session_Login'].'</Utilisateur>
                <NUM_FACT>'.$post['numFact'].'</NUM_FACT>
                <ENREG_TMP>'.($post['ENREG_TMP'] ? '1' : '0').'</ENREG_TMP>
            </FactEnregListeAffectation_In>';
            
        return new \Helpers\Webservice\Wsdl('Oxaproc_Gen.wsdl', 'OXAPRC_ENREG_AFFECT', $xml, false, true);
    }
    
    public static function validationFacture($array)
    {
        $xml ='<FactureValid_In LngUtilisation="'.htmlspecialchars($_SESSION['Session_Langue']).'">
            	<Utilisateur>'.$_SESSION['Session_Login'].'</Utilisateur>
            	<NUM_FACT>'.$array['numFact'].'</NUM_FACT>
            	<ValidEnt>'.$array['ValidEnt'].'</ValidEnt>
            	<ValidAffectations>'.$array['ValidAffectations'].'</ValidAffectations>
            	<ValidBAP>'.$array['ValidBAP'].'</ValidBAP>
            	<Confirmation>'.($array['Confirmation'] ? '1' : '').'</Confirmation>
            	<AlgoSpecif>'.($array['AlgoSpecif'] ?? '').'</AlgoSpecif>
            </FactureValid_In>';
            
        return new \Helpers\Webservice\Wsdl('Oxaproc_Gen.wsdl', 'OXAPRC_FACT_VAL', $xml, false, true);
    }
}
