<?php
namespace Modules\Fournisseur\Controller;

use GuzzleHttp\Psr7\Response;
use Helpers\ChampsSupplementaire\ChampSupp;
use Helpers\Outil\ArrayHelper;
use Helpers\Outil\StringHelper;
use Helpers\Parametres\Constante;
use Skeleton\Controller\Controller;
use Helpers\Session\Session;
use Helpers\Trad\Trad;
use Traits\Validator\ValidatorChampSupp;

class SessionCreationFournisseurController extends Controller
{

    
    public function sessionFournisseurTypeAction() : string
    {
        $post = $this->request->getParsedBody();
        $type = $this->request->getAttribute('type');
        
        
        if ($type) {
            (new Session($type))->setSession('PROSPECT', $post['PROSPECT']);
        } else {
            $_SESSION['Fournisseur']['Fournisseur']['PROSPECT'] = $post['PROSPECT'];
        }

        return '';
    }

    public function sessionAddAction() :Response
    {
        $post = $this->request->getParsedBody();
        $isSimplifier = $this->request->getAttribute('is_simplifier');

        $session = new Session($isSimplifier ? 'FournisseurSimplie' : 'Fournisseur');

        $session->setSession(
            'Fournisseur',
            ['PROSPECT' => $post['PROSPECT'] ? 1 : 0]
            + ArrayHelper::filterByKey($post, [
                'ENSCOMM', 'RS', 'ADR', 'VILLE1', 'CPOSTAL', 'CODE_PAYS',
                'TEL', 'FAX', 'EMAIL', 'SITEWEB',
                'NO_SIRET', 'TAXE2', 'TAXE3', 'TAXE4',
                'NO_TVA_IC', 'NO_DUNS', 'TYP_TVA', 'ID_EXT',
                'DTEVALMIN', 'DTEVALMAX',
                'FOUPPAL', // Groupement
            ])
            + ArrayHelper::filterByKey(
                $post,
                fn($key) => str_starts_with($key, 'CS_EXTENTION')
            )
            + $session->getSession('Fournisseur')
        );
        $listChiffAff = $session->getSession('chiffreAffaire') ?? [];
        $listId = array_reduce(array_keys($post), function ($carry, $key) {
            if (str_starts_with($key, 'ANNEE_CA')) {
                $carry[] = intval(StringHelper::removePrefix($key, 'ANNEE_CA'));
            }
            return $carry;
        }, []);
        foreach ($listId as $id) {
            $listChiffAff[] = [
                'ANNEE' => $post['ANNEE_CA'.$id],
                'CHIFF_AFF' => str_replace(' ', '', $post['CHIFF_AFF'.$id]),
                'DEVISE_CA' => $post['DEVISE_CA'.$id],
                'ETAT' => $post['ca_etat'.$id] ?? 'A',
            ];
        }
        $session->setSession('chiffreAffaire', $listChiffAff);
        $session->setSession('validation', true);

        //_______________
        // Champ sup

        return new Response(200);
    }
    
    public function sessionFournisseurAction() : string
    {
        $post = $this->request->getParsedBody();
        $code = $this->request->getAttribute('code');
        
        if ($code && !in_array($code, ['FournisseurSimplie', 'Fournisseur'])) {
            throw new \Exception('Invalid code "'.$code.'"');
        }

        $validator = $this->createValidator();
        $session = new Session($code?$code:'Fournisseur');

        $validator->isDate($post['DTEVALMIN'], '', '', true);
        $validator->isDate($post['DTEVALMAX'], '', '', true);
        
        $matches  = (array) str_replace("nom_contact", "", preg_grep('/^nom_contact/', array_keys($post)));
        $position = array_keys($matches);
        
        $contact = [];
        
        for ($compteur=0; $compteur<count($matches); $compteur++) {
            $i = $position[$compteur];
            
            $validator->isCheck($post['e-proc'.$matches[$i]]);
            $validator->isCheck($post['CTC_OXALINK'.$matches[$i]]);
            
            $contact[$compteur]=[
                'ETAT' => $post['etat'.$matches[$i]],
                'IND_FOU' => $post['id'.$matches[$i]],
                'NOM' => $post['nom_contact'.$matches[$i]],
                'FONCTION' => $post['fonction_contact'.$matches[$i]],
                'TEL' => $post['fixe_contact'.$matches[$i]],
                'FAX' => $post['fax_contact'.$matches[$i]],
                'VIBOXAP' => $post['e-proc'.$matches[$i]],
                'TELPORT' => $post['portable_contact'.$matches[$i]],
                'EMAIL' => $post['email_contact'.$matches[$i]],
                'OXALINK_ID' => $post['OXALINK_ID'.$matches[$i]],
                'CTC_OXALINK' => $post['CTC_OXALINK'.$matches[$i]],
                'CTC_CONSULT' => $post['CTC_CONSULT'.$matches[$i]],
            ];
        }
        
        $matches  = (array)str_replace("adrCompl_COD_ADR", "", preg_grep('/^adrCompl_COD_ADR/', array_keys($post)));
        $position = array_keys($matches);
        
        for ($compteur=0; $compteur<count($matches); $compteur++) {
            $i = $position[$compteur];
            
            $validator->isCheck($post['adrCompl_ADR_COMMANDE'.$matches[$i]]);
            
            $adresseCompl[$compteur]=[
                'COD_ADR' => $post['adrCompl_COD_ADR'.$matches[$i]],
                'ETAT' => $post['adrCompl_etat'.$matches[$i]],
                'RAISOC' => $post['adrCompl_RAISOC'.$matches[$i]],
                'ADRFOUR' => $post['adrCompl_ADRFOUR'.$matches[$i]],
                'CP' => $post['adrCompl_CP'.$matches[$i]],
                'VILLE' => $post['adrCompl_VILLE'.$matches[$i]],
                'CODPAYS' => $post['adrCompl_CODPAYS'.$matches[$i]],
                'TELEPHONE' => $post['adrCompl_TELEPHONE'.$matches[$i]],
                'TELEX' => $post['adrCompl_TELEX'.$matches[$i]],
                'FAX' => $post['adrCompl_FAX'.$matches[$i]],
                'EMAIL' => $post['adrCompl_EMAIL'.$matches[$i]],
                'ADR_COMMANDE' => $post['adrCompl_ADR_COMMANDE'.$matches[$i]],
            ];
        }
        
        $matches  = (array)str_replace("ANNEE_CA", "", preg_grep('/^ANNEE_CA/', array_keys($post)));
        $position = array_keys($matches);
        
        for ($compteur=0; $compteur<count($matches); $compteur++) {
            $i = $position[$compteur];
            
            $chiffreAffaire[$compteur]=[
                'ANNEE' => $post['ANNEE_CA'.$matches[$i]],
                'CHIFF_AFF' => str_replace(' ', '', $post['CHIFF_AFF'.$matches[$i]]),
                'DEVISE_CA' => $post['DEVISE_CA'.$matches[$i]],
                'ETAT' => $post['ca_etat'.$matches[$i]],
            ];
        }
        
        //$validator->isCheck($post['PROSPECT']);
        
        $validator->isCheck($post['DISPO_MOBILITY']);
        $validator->isCheck($post['ADR_COMMANDE']);
        
        $validator->isCheck($post['AUTOCC']);
        $validator->isCheck($post['NOCCGEN']);
        $validator->isCheck($post['SEUILEPDIF']);
        
        $validator->isCheck($post['FOURPREF']);
        $validator->isCheck($post['RMINCPXN']);
        
        $validator->isCheck($post['FRPOBLIG']);
        
        $validator->isCheck($post['FRANCTVA']);
        $validator->isCheck($post['NOT_MANU']);
        $validator->isCheck($post['NAUTOSFA']);
        $validator->isCheck($post['RECEP_AUTO']);
        
        $validator->isCheck($post['GEREPORTAIL']);
        $validator->isCheck($post['RFRACT']);
        
        $validator->isDate($post['DTE_AGREM'], '', '', true);
        
        $post['MTMAXCC']    = str_replace(' ', '', $post['MTMAXCC']??'');
        $post['MTMAXCCHCT'] = str_replace(' ', '', $post['MTMAXCCHCT']??'');
        $post['MNTMINFAC']  = str_replace(' ', '', $post['MNTMINFAC']??'');
        $post['CA_MIN_ST']  = str_replace(' ', '', $post['CA_MIN_ST']??'');
        $post['CA_MAX_ST']  = str_replace(' ', '', $post['CA_MAX_ST']??'');
        $post['MNTMINFRA']  = str_replace(' ', '', $post['MNTMINFRA']??'');
        
        ValidatorChampSupp::reformateDate($this->pdo, 'FOURNISS', '', null, null, $post, 'jj/mm/aaaa');
        
        $session->setSession('validation', true);
        $session->setSession('contact', $contact);
        $session->setSession('adresseCompl', $adresseCompl??[]);
        $session->setSession('chiffreAffaire', $chiffreAffaire??[]);
        $session->setSession('Fournisseur', $post);


        
        return '';
    }
    public function sessionEdiRoutageAction() : string
    {
        $post = $this->request->getParsedBody();
        
        $validator = $this->createValidator();
        $session = new Session('Fournisseur');
        
        $validator->isCheck($post['BDC_ELEC']);

        if (!$post['BDC_ELEC']) {
            $ediRoutage=[
                'BDC_ELEC' => 0,
                'ROUTAGECDE' => $post['ROUTAGECDE'],
            ];
        } else {
            if ($post['MODE_ENV']==1) {
                $ediRoutage = [
                    'BDC_ELEC' => 1,
                    'TYPE_FORM' => $post['TYPE_FORM'],
                    'FORMAT' => $post['FORMAT'],
                    'MODE_ENV' => $post['MODE_ENV'],
                    'MAIL_DEST' => $post['MAIL_DEST'],
                ];
            } else {
                $ediRoutage=$post;
            }
        }
        
        $session->setSession('EdiRoutage', $ediRoutage);
        
        return '';
    }
    
    public function sessionExistAction() : string
    {
        $action = $this->request->getAttribute('action');
        $post = $this->request->getParsedBody();
        $session = new Session('Fournisseur');
        
        
        $trad = $this->getTranslationService();

        if ($session->getMode()=='Modification') {
            $id = $_SESSION['Fournisseur']['Fournisseur']['CODE']??'';

            if ($id == '') {
                $backPath =
                    $this->router->generateUri('Fournisseur.ModificationFournisseur.ModificationFournisseur', [
                        'id' => $session->getSession('codeDemande'),
                        'mode' => 'FrsWithOutCode',
                        'codeType' => 'CODE_DEMANDE'
                    ]);
            } elseif ($session->getSession('codeDemande')) {
                $backPath = $this->router->generateUri('Fournisseur.ModificationFournisseur.ModificationFournisseur', ['id' => $session->getSession('codeDemande'), 'mode' => 'modification', 'codeType' => 'CODE_DEMANDE']);
            } else {
                $backPath = $this->router->generateUri('Fournisseur.ModificationFournisseur.ModificationFournisseur', ['id' => $id]);
            }
        } else {
            if ($session->getSession('refuser')) {
                $backPath =
                    $this->router->generateUri('Fournisseur.CreationFournisseur.nouveauFournisseur', [
                        'id' => $session->getSession('CODE'),
                        'codeDemande' => $session->getSession('codeDemande')
                    ]);
            } else {
                $backPath = $this->router->generateUri('Fournisseur.CreationFournisseur.nouveauFournisseur');
            }
        }
        
        if ($action=='modification') {
            $continue_label = $trad->t('Modification fournisseur');
            if ($post['arrayEditJson']??[]) {
                $continue_path = $this->router->generateUri('Fournisseur.ModificationFournisseur.ModificationFournisseur', json_decode($post['arrayEditJson'], true));
            } elseif (($post['divLibelle']??'') != '') {
                $continue_path = $this->router->generateUri('Fournisseur.ModificationFournisseur.ModificationFournisseur', ['id' => $post['divCode'], 'mode' => $post['divLibelle']]);
            } else {
                $continue_path = $this->router->generateUri('Fournisseur.ModificationFournisseur.ModificationFournisseur', ['id' => $post['divCode']]);
            }
        } elseif ($action=='demRefuser') {
            $action = 'Creation';
            $continue_label = $trad->t('Nouveau fournisseur');
            $continue_path = $this->router->generateUri('Fournisseur.CreationFournisseur.nouveauFournisseur', ['codeDemande' => $post['divLibelle'],'id' => $post['divCode']]);
        } else {
            $continue_label = $trad->t('Nouveau fournisseur');
            $continue_path = $this->router->generateUri('Fournisseur.SearchImport.index');
        }
        
        if (Session::backToFrs()) {
            $mode = $session->getMode();
            $trad = $this->getTranslationService();
  
            $modeC = $mode == 'Creation' ? $trad->t('création') : $mode;

            return $this->renderer->render('@popup-erreur/AvertissementSession', [
                'mode' => $mode,
                'action' => $action,
                'backPath' => $backPath,
                'continue_path' => $continue_path,
                'module' => 'Fournisseur',
                'texte' => Trad::strBuild(
                    $trad->t("Un fournisseur est déjà en @1@, voulez-vous terminer votre @1@ ou poursuivre votre action ?"),
                    $modeC
                ),
                'texteBtnBack' => Trad::strBuild(
                    $trad->t("Revenir sur la @1@"),
                    $modeC
                ),
                'continue_label' => $continue_label,
            ]);
        }
        
        return '';
    }
}
