<?php

namespace Modules\Reception\Controller;

use Entity\Model\BrRecep;
use Entity\Model\Parametr;
use Entity\Model\Paravrac;
use Helpers\Ariane\Ariane;
use Helpers\Outil\Roles;
use Helpers\Outil\Sql;
use Modules\Reception\Repository\WorkflowBonRecepRepo;
use Modules\Commande\Controller\WorkflowController as WorflowCommandeController;

class WorkflowController extends WorflowCommandeController
{

    public function summaryAction(): string
    {
        $bonRecepId = $this->request->getAttribute('bonRecepId');

        Ariane::generate(2, $this->getTranslationService()->t('Visualisation du workflow'));
        Ariane::setFocus($bonRecepId);

        $state =
            (new WorkflowBonRecepRepo($this->pdo))
            ->getWorkflowState($bonRecepId);
        $paramtr = new Parametr($this->pdo);
        $paravrac = new Paravrac($this->pdo);
        $listItem = [
            ['id' => 'DEBUT', 'status' => 'T'],
        ];

        if ($state['hasDemAchat']) {
            $listItem[] = [
                'id' => 'DA',
                'status' => ($state['hasDemAchatInvalid'] ? 'C' : 'T')
            ];

            if ($paramtr->isSignDemAchatActive()
                //si la DA est du type "exécution" ou bien que la signature sur les DA chiffrages est activé
                && ($state['hasDemAchatExec']
                    || Sql::toBool($paravrac->getForSig('NOTSIGDACHIF'))
                )
            ) {
                $status = 'N'; // statut est "non commencé"
                // Si une DA au moins a été refusé, le statut de l'objet Signature DA est refusé
                if ($state['hasDemAchatRefus']) {
                    $status = 'R';
                    // Si toutes les DA sont traité alors le statut de l'objet Signature DA est traité
                } elseif (! $state['hasDemAchatUnsigned']) {
                    $status = 'T';
                    // Si toutes les DA ont été validée alors le statut est "commencé"
                } elseif (! $state['hasDemAchatInvalid']) {
                    $status = 'C';
                }

                $listItem[] = [
                    'id' => 'DA_APPRO',
                    'status' => $status,
                ];
            }
        }

        $listItem[] = [
            'id' => 'CDE',
            'status' => ($state['Commande_DTE_VALID'] == '00000000' ? 'C' : 'T')
        ];

        if ($paramtr->isSignCommandeActive()) {
            $status = 'T';
            // Si la commande a été refusée
            if (Sql::toBool($state['Commande_REFUSEE'])) {
                $status = 'R';
                // Sinon, si la commande n'a pas été validée
            } elseif ('00000000' == $state['Commande_DTE_VALID']) {
                $status = 'N';
                // Sinon, si la commande n'est pas encore signée
            } elseif (! Sql::toBool($state['Commande_SIGNEE'])) {
                $status = 'C';
            }
            $listItem[] = [
                'id' => 'CDE_APPRO',
                'status' => $status,
            ];
        }

        $statusCdeEnvoie = 'N';
        if (in_array($state['Commande_ETAT_CDE'], ['E', 'S'])) {
            $statusCdeEnvoie =
                $state['Commande_DTE_VALID'] != '00000000' ? 'T' : 'C';
        } elseif ($state['ETAT_CDE'] == 'Z') { // Gestion des commandes annulées
            if ($state['hasEventIMA']) {
                $statusCdeEnvoie = 'T';
            } elseif ($state['hasEventEnvoi']) {
                $statusCdeEnvoie = 'C';
            }
        }
        $listItem[] = [
            'id' => 'CDE_ENVOIE',
            'status' => $statusCdeEnvoie
        ];

        $status = 'C';
        if ($state['Commande_ETAT_CDE'] == 'S') {
            $status = 'T';
        }
        $listItem[] = [
            'id' => 'BR',
            'status' => $status,
        ];

        $statusExp = null;
        if (roles::droitsUtilisateur($this->pdo, 'HA_EXP_VIS') && Sql::toBool($state['Commande_CDE_EXP'])) {
            $statusExp = 'T';
            if (! $state['hasExp']) {
                $statusExp = 'N';
            } elseif ($state['hasExpNonArrive']) {
                $statusExp = 'C';
            }
            $listItem[] = [
                'id' => 'EXP',
                'status' => $statusExp,
            ];
        }

        if (Roles::droitsUtilisateur($this->pdo, 'HA_FA_VISU')) {
            $statusFacture = 'T';
            // Si aucune facture n'existe alors le statut est "non commencé"
            if (! $state['hasFacture']) {
                $statusFacture = 'N';
                // S'il existe au moins une facture et (une commande non soldée financièrement ou une expédition non soldée)
                // ou bien si la commande n'a pas été envoyée alors le statut est commencé
            } elseif ($state['hasExpNonSold']
                || empty(trim($state['ETAT_FIN']))
                || $statusCdeEnvoie != 'T'
                || !in_array($statusExp, [null, 'T'])
            ) {
                $statusFacture = 'C';
            }

            $listItem[] = [
                'id' => 'FAC',
                'status' => $statusFacture,
            ];

            // APPRO BAP
            if ($paravrac->isSignBapActive()) {
                $status = 'T';
                if (! $state['hasBap']) {
                    $status = 'N';
                } elseif ($state['hasBapNonValide'] || $statusFacture != 'T') {
                    $status = 'C';
                }

                $listItem[] = [
                    'id' => 'FAC_APPRO',
                    'status' => $status,
                ];

                if ($status == 'T') {
                    $listItem[] = [
                        'id' => 'FIN',
                        'status' => 'T',
                    ];
                }
            } else {
                if ($statusFacture == 'T') {
                    $listItem[] = [
                        'id' => 'FIN',
                        'status' => $status,
                    ];
                }
            }
        }

        return $this->renderer->render('@Reception/Workflow/workflowDetail', [
            'bonRecep' => $state,
            'listWorfowItem' => $listItem,
        ]);
    }

    public function detailAction(): string
    {
        $bonRecepId = $this->request->getAttribute('bonRecepId');
        $workflowId = $this->request->getAttribute('workflowId');

        if ($workflowId == 'BR') {
            return $this->renderer->render('@GlobalApplication/WorkflowEvent/workflowDetailBonRecep', [
                'listItem' => [
                    (new WorkflowBonRecepRepo($this->pdo))
                        ->getBonRecepWithListEvent($bonRecepId),
                ],
                'hasImprBr' => roles::droitsUtilisateur($this->pdo, 'HA_BR_IMP'),
                'hasImprNonValoBr' => Roles::droitsUtilisateur($this->pdo, 'HA_BR_IMPV'),
            ]);
        }

        $commandeId = (new BrRecep($this->pdo))->find($bonRecepId)['NUM_CDE'];
        return $this->detailActionProcess(
            $commandeId,
            $workflowId
        );
    }
}
