<?php

namespace Modules\ProjetAchat\Service;

use Entity\Model\DoaData;
use Helpers\Outil\Sql;

class HeritageService
{
  
    private $pdo;
    protected $champRepository;
    protected $dataActionRepository;


    public function __construct($pdo)
    {
        $this->pdo = $pdo;
        $this->champRepository = new \Modules\ProjetAchat\Repository\Champ($this->pdo);
        $this->dataActionRepository = new \Modules\ProjetAchat\Repository\DataAction($this->pdo);
    }
    
    public function supprimeHeritage(string $typeObjet, int $idObjet, int $idDonnee, int $idData, int $postHeritage) : void
    {
        $champService = new ChampService($this->pdo);
        
        if ($dataDoa = $this->champRepository->getInfoData($idData, $typeObjet, $idObjet, $idDonnee)) {
            if ($typeObjet != 'D' || ($dataDoa['STATUT'] == 'P' || $dataDoa['STATUT'] == 'I')) {
                if ($this->dataActionRepository->getDataAction($typeObjet, $idObjet, $idData)) {
                    switch ($typeObjet) {
                        case 'M':
                            if ($postHeritage == 2) {
                                $this->dataActionRepository->supprimerDataAction($typeObjet, $idObjet, $idDonnee, $idData);
                            }
                            break;
                        case 'D':
                            if ($dataDoa['STATUT'] == 'P') {
                                if ($postHeritage == 2) {
                                    $this->dataActionRepository->supprimerDataAction($typeObjet, $idObjet, $idDonnee, $idData);
                                }
                            }


                            break;
                    }
                }
            }

            $this->champRepository->supprimeData($typeObjet, $idObjet, $idDonnee, $idData);
            $champService->setErreurExpCalcul($typeObjet, $idObjet, $idDonnee, $idData);
            
            if ($listeData = $this->champRepository->getListData($idData)) {
                foreach ($listeData as & $ligne) {
                    if (($ligne['TYPE_OBJET'] == 'D' && ($ligne['STATUT'] != 'P' && $ligne['STATUT'] != 'I')) || ($ligne['TYPE_OBJET'] == 'D' && $postHeritage == 1) ||$postHeritage == 2) {
                        $this->champRepository->modifierData($ligne['TYPE_OBJET'], $ligne['ID_OBJET'], $ligne['ID_DONNEE'], 0, 0);
                    } else {
                        $this->champRepository->supprimeData($ligne['TYPE_OBJET'], $ligne['ID_OBJET'], $ligne['ID_DONNEE'], $ligne['ID_DATA']);
                        $champService->setErreurExpCalcul($ligne['TYPE_OBJET'], $ligne['ID_OBJET'], $ligne['ID_DONNEE'], $ligne['ID_DATA']);
                        
                        $this->dataActionRepository->supprimerDataAction($typeObjet, $idObjet, $idDonnee, $idData);
                    }
                }
            }
        }
    }
    
    /**
     * @param array<string> $fields
    */
    public function convertCalculatedFields(string $typeObjet, int $idObjet, int $idDonnee, array &$fields) :void
    {
        /** Bloc update heritage des champs calculé **/
        $fields['ERREUR_CALCUL'] = Sql::setBoolSql(0);
        $listInput = $this->champRepository->listInputCalculatedData($typeObjet, $idObjet, $idDonnee);
        
        $ArrayConvert = [];
        foreach ($listInput as $input) {
            $ArrayConvert['[CHP_'.$input['ID_STRUCT'].']'] = '[CHP_'.$input['ID_DATA'].']';
        }
        
        $body = (string) $fields['EXP_CALCUL'];
        
        $arrayChpsFind = [];
        while (1==1) {
            $start = strpos($body, '[');
            $end = strpos($body, ']');
            
            if ($start===false || $end===false) {
                break;
            }
            
            $arrayChpsFind[] = substr($body, $start, $end-$start+1);
            $body = substr_replace($body, '', $start, $end-$start+1);
        }
        
        foreach ($arrayChpsFind as $chpsFind) {
            if (isset($ArrayConvert[$chpsFind])) {
                $fields['EXP_CALCUL'] = str_replace($chpsFind, $ArrayConvert[$chpsFind], $fields['EXP_CALCUL']);
            } elseif (strpos($chpsFind, '[CHP_')===0) {
                $fields['EXP_CALCUL'] = str_replace($chpsFind, '', $fields['EXP_CALCUL']);
                $fields['ERREUR_CALCUL'] = Sql::setBoolSql(1);
            }
        }
    }
    
    /**
     * @param array<string> $arrayUpdate
    */
    public function editionHeritage(string $typeObjet, int $idObjet, int $idDonnee, int $idData, array $arrayUpdate, int $postHeritage):void
    {
        $expCalculSave = $arrayUpdate['EXP_CALCUL']??'';
        if ($listeData = $this->champRepository->getListData($idData)) {
            foreach ($listeData as & $ligne) {
                if ($ligne['TYPE_DATA'] == 'C') {
                    $arrayUpdate['EXP_CALCUL'] = $expCalculSave;
                    $this->convertCalculatedFields($ligne['TYPE_OBJET'], $ligne['ID_OBJET'], $ligne['ID_DONNEE'], $arrayUpdate);
                    
                    $arrayUpdate['numerique_ERREUR_CALCUL']  = sql::toBool($arrayUpdate['ERREUR_CALCUL'])? '0x54':'0x46';
                    unset($arrayUpdate['ERREUR_CALCUL']);
                }
                /** @phpstan-ignore-next-line */
                if (($ligne['TYPE_OBJET'] == 'D' && ($ligne['STATUT'] != 'P' && $ligne['STATUT'] != 'I')) || ($ligne['TYPE_OBJET'] == 'B' && $postHeritage == 1) ||$postHeritage == 2) {
                    $this->champRepository->modifierData($ligne['TYPE_OBJET'], $ligne['ID_OBJET'], $ligne['ID_DONNEE'], 0, 0);
                } else {
                    $doaData = new DoaData($this->pdo);
                    $doaData->update($arrayUpdate, $ligne['ID_DATA']);
                }
            }
        }
    }
}
