<?php

namespace Helpers\Outil;

use Helpers\Trad\ITrad;
use Modules\Ajax\Repository\Listes;
use Modules\Ajax\Repository\Signataires;
use Modules\EtatStatistiques\Repository\EtatStatDataRepo;
use Modules\EtatStatistiques\Repository\EtatStatTypeRepo;
use Modules\Parametrage\Facture\Repository\UblSchemaRepo;
use Psr\Container\ContainerInterface;
use Psr\SimpleCache\CacheInterface;

class ZoomHelper
{

    public static function getZoomTitle(string $path, ITrad $trad) :string
    {
        return match ($path) {
            'Ajax.liste.accadre' => $trad->t('Liste des accords-cadres'),
            'Ajax.liste.acheteur' => $trad->t('Liste des acheteurs'),
            'Ajax.liste.articles' => $trad->t('Liste des articles'),
            'Ajax.liste.articlesFraisPort' => $trad->t('Liste des articles frais de port'),
            'Ajax.liste.societe' => $trad->t('Liste des sociétés'),
            'Ajax.liste.ssItesto' => $trad->t('Liste des sites de stock'),
            'Ajax.liste.famille' => $trad->t('Liste des familles'),
            'Ajax.liste.fournisseur' => $trad->t('Liste des fournisseurs'),
            'Ajax.liste.fabricant' => $trad->t('Liste des fabricants'),
            'Ajax.liste.fonctionUser' => $trad->t('Liste fonctions'),
            'Ajax.liste.facture' => $trad->t('Liste des factures'),
            'Ajax.liste.grpfou' => $trad->t('Liste des groupements'),
            'Ajax.liste.si' => $trad->t('Liste des sections d\'imputation'),
            'Ajax.liste.centrana' => $trad->t('Liste des centres d\'analyse'),
            'Ajax.liste.cdc' => $trad->t('Liste des codes complémentaires'),
            'Ajax.liste.caEntet' => $trad->t('Liste des commandes'),
            'Ajax.liste.conditionPaiement' => $trad->t('Condition de paiement'),
            'Ajax.liste.contactFournisseur' => $trad->t('Contact fournisseur'),
            'Ajax.liste.demandeur' => $trad->t('Liste des demandeurs'),
            'Ajax.liste.delegatairePref' => $trad->t('Liste des délégataires'),
            'Ajax.liste.directio' => $trad->t('Liste des directions'),
            'Ajax.liste.domaineFonctionnel' => $trad->t('Liste des domaines fonctionnels'),
            'Ajax.liste.sca' => $trad->t('Liste des sous-comptes d\'analyse'),
            'Ajax.liste.hastutil' => $trad->t('Liste des utilisateurs'),
            'Ajax.liste.utilisateur' => $trad->t('Liste des utilisateurs'),
            'Ajax.liste.centreByType' => $trad->t('Liste des centres'),
            'Ajax.liste.centreEmetteur' => $trad->t('Liste des centres émetteurs'),
            'Ajax.liste.centreLivraison' => $trad->t('Liste des centres de livraison'),
            'Ajax.liste.domaineCompetence' => $trad->t('Liste des domaines de compétence'),
            'Ajax.liste.decoupage' => $trad->t('Liste des découpages'),
            'Ajax.liste.marches' => $trad->t('Liste des marchés'),
            'Ajax.liste.motClef' => $trad->t('Liste des mots clés'),
            'Ajax.liste.modelivraison' => $trad->t('Mode de livraison'),
            'Ajax.liste.modePaiement' => $trad->t('Mode de paiement'),
            'Ajax.liste.periodes' => $trad->t('Liste des périodes'),
            'Ajax.liste.pays' => $trad->t('Liste des pays'),
            'Ajax.liste.regroup' => $trad->t('Liste des regroupements fournisseurs'),
            'GlobalApplication.MultiSelect.afficher' => // TODO : entity should be specified in the route
                $trad->t('Liste des domaines fonctionnels'),
            'Ajax.liste.uo',
            'Ajax.Treeview.uoTreeview' => $trad->t('Liste des unités organisationnelles'),
            'Ajax.liste.typeAchat' => $trad->t('Liste des types d\'achat'),
            'Ajax.liste.typeDoc' => $trad->t('Type de document'),
            'Ajax.liste.sousFamille' => $trad->t('Liste des sous-familles'),
            'Ajax.liste.sitesto' => $trad->t('Liste des sites de stock'),
            'Ajax.liste.stockLocal' => $trad->t('Liste des articles'),
            // case \Entity\Model\Centre::class:
            //     return $trad->t('Liste des centres'),
            'Ajax.liste.devise' => $trad->t('Liste des devises'),
            'Ajax.liste.etatStat' => $trad->t('Liste des états statistiques'),
            'Ajax.liste.etatStatFiltreType' => $trad->t('Liste des types de filtres'),
            'Ajax.liste.etatGroupe' => $trad->t('Liste des groupes'),
            'Ajax.liste.etatStatTheme' => $trad->t('Liste des thèmes'),
            'EtatStatistique.Zoom.tableDw' => $trad->t('Liste des tables SQL'),
            'Facture.Zoom.zoomUblField' => $trad->t('Liste des champs UBL'),
            'Ajax.liste.siteStockAccessible' => $trad->t('Liste des sites'),
            default => (function () use ($path) {
                throw new \Exception('Invalid zoom path "'.$path.'"');
            })(),
        };
    }

    /**
     * @deprecated zoom path should deduce the entity and not the other way around
     * @param class-string<\Helpers\QueryBuilder\QueryBuilder> $entity
     */
    public static function getZoomPath(string $entity) :string
    {
        switch ($entity) {
            case \Entity\Model\Societe::class:
                return 'Ajax.liste.societe';
            case \Entity\Model\Sectimpu::class:
                return 'Ajax.liste.si';
            case \Entity\Model\Codecomp::class:
                return 'Ajax.liste.cdc';
            case \Entity\Model\Sscptana::class:
                return 'Ajax.liste.sca';
            case \Entity\Model\Hastutil::class:
                return 'Ajax.liste.utilisateur';
            case \Entity\Model\FoncUsr::class:
                return 'Ajax.liste.fonctionUser';
            case \Entity\Model\CentreEmetteur::class:
                return 'Ajax.liste.centreEmetteur';
            case \Entity\Model\CentreLivraison::class:
                return 'Ajax.liste.centreLivraison';
            case \Entity\Model\UO::class:
                return 'Ajax.Treeview.uoTreeview';
            case \Entity\Model\SSiteSto::class:
                return 'Ajax.liste.sitesto';
            case \Entity\Model\Devise::class:
                return 'Ajax.liste.devise';
        }
        throw new \Exception('Invalid entity "'.$entity.'"');
    }

    /**
     * @return class-string<\Helpers\QueryBuilder\QueryBuilder>|null
     */
    public static function getEntityFromPath(string $path) :?string
    {
        switch ($path) {
            case 'Ajax.liste.accadre':
                return \Entity\Model\Acccadre::class;
            case 'Ajax.liste.articlesFraisPort':
            case 'Ajax.liste.articles':
                return \Entity\Model\Articles::class;
            case 'Ajax.liste.centrana':
                return \Entity\Model\Centrana::class;
            case 'Ajax.liste.ssItesto':
                return \Entity\Model\SSiteSto::class;
            case 'Ajax.liste.societe':
                return \Entity\Model\Societe::class;
            case 'Ajax.liste.si':
                return \Entity\Model\Sectimpu::class;
            case 'Ajax.liste.caEntet':
                return \Entity\Model\CaEntet::class;
            case 'Ajax.liste.cdc':
                return \Entity\Model\Codecomp::class;
            case 'Ajax.liste.conditionPaiement':
                return \Entity\Model\CondPaie::class;
            case 'Ajax.liste.contactFournisseur':
                return \Entity\Model\Contfour::class;
            case 'Ajax.liste.centreByType':
                return \Entity\Model\Centre::class;
            case 'Ajax.liste.delegatairePref':
                return \Entity\Model\Hastutil::class;
            case 'Ajax.liste.domaineFonctionnel':
                return \Entity\Model\DomaineFonctionnel::class;
            case 'Ajax.liste.domaineCompetence':
                return \Entity\Model\DomaineCompetence::class;
            case 'Ajax.liste.directio':
                return \Entity\Model\Directio::class;
            case 'Ajax.liste.demandeur':
                return \Entity\Model\Hastutil::class;
            case 'Ajax.liste.decoupage':
                return \Entity\Model\Decoupage::class;
            case 'Ajax.liste.sca':
                return \Entity\Model\Sscptana::class;
            case 'Ajax.liste.hastutil':
            case 'Ajax.liste.utilisateur':
            case 'Ajax.liste.acheteur':
                return \Entity\Model\Hastutil::class;
            case 'Ajax.liste.famille':
                return \Entity\Model\Famille::class;
            case 'Ajax.liste.fournisseur':
                return \Entity\Model\Fourniss::class;
            case 'Ajax.liste.fabricant':
                return \Entity\Model\Fabricant::class;
            case 'Ajax.liste.fonctionUser':
                return \Entity\Model\FoncUsr::class;
            case 'Ajax.liste.facture':
                return \Entity\Model\FactEnt::class;
            case 'Ajax.liste.grpfou':
                return \Entity\Model\Grpfou::class;
            case 'Ajax.liste.centreEmetteur':
                return \Entity\Model\Centre::class;
            case 'Ajax.liste.centreLivraison':
                return \Entity\Model\Centre::class;
            case 'Ajax.liste.marches':
                return \Entity\Model\Marches::class;
            case 'Ajax.liste.motClef':
                return \Entity\Model\MotClef::class;
            case 'Ajax.liste.modelivraison':
                return \Entity\Model\Modelivr::class;
            case 'Ajax.liste.modePaiement':
                return \Entity\Model\Modepaie::class;
            case 'Ajax.liste.periodes':
                return \Entity\Model\Periodes::class;
            case 'Ajax.liste.pays':
                return \Entity\Model\Country::class;
            case 'Ajax.liste.regroup':
                return \Entity\Model\Regroupement::class;
            case 'Ajax.Treeview.uoTreeview':
                return \Entity\Model\UO::class;
            case 'Ajax.liste.typeAchat':
                return \Entity\Model\TypeAchat::class;
            case 'Ajax.liste.typeDoc':
                return \Entity\Model\TypeDoc::class;
            case 'Ajax.liste.sousFamille':
                return \Entity\Model\SousFamille::class;
            case 'Ajax.liste.sitesto':
                return \Entity\Model\SSiteSto::class;
            case 'Ajax.liste.stockLocal':
                return \Entity\Model\Sstocklo::class;
            case 'Ajax.liste.devise':
                return \Entity\Model\Devise::class;
            case 'Ajax.liste.etatStat':
                return \Entity\Model\EtatStat::class;
            case 'Facture.Zoom.zoomUblField': // no entity
            case 'EtatStatistique.Zoom.tableDw': // no entity
            case 'Ajax.liste.etatStatFiltreType': // etatStatFiltreType is an union of multiple table
                return null;
            case 'Ajax.liste.etatGroupe':
                return \Entity\Model\EtatGrp::class;
            case 'Ajax.liste.etatStatTheme':
                return \Entity\Model\EtatThem::class;
            case 'Ajax.liste.siteStockAccessible':
                return \Entity\Model\SSiteSto::class;
        }
        throw new \Exception('Invalid zoom path "'.$path.'"');
    }
    

    /**
     *
     * @return \stdClass{
     *     callable:callable,
     *     ?mainId:string,
     *     ?entity:class-string<QueryBuilder>
     * }
     */
    public static function getListeCallback(string $path, ContainerInterface $container) :object
    {
        $pdo = $container->get(\PDO::class);
        $repo = new \Modules\Ajax\Repository\Listes($pdo);
        $soc = new \Modules\GlobalApplication\Repository\Societe($pdo);
        // TODO : factorize simpleEntityFetch using getEntityFromPath and turn this map into "match"
        $callable = [
            'Ajax.liste.accadre' => (object) [
                'callable' => [$repo, 'AccordCadre'],
            ],
            'Ajax.liste.acheteur' => (object) [
                'callable' => [$repo, 'acheteur'],
            ],
            'Ajax.liste.aoFormatExcel' =>
                self::simpleEntityFetch(\Entity\Model\AoExCentre::class, $pdo),
            'Ajax.liste.regroup' =>
                self::simpleEntityFetch(\Entity\Model\Regroupement::class, $pdo),
            'Ajax.liste.articles' => (object) [
                'callable' => function ($post) use ($pdo) {
 // TODO : split into 3 and factorize with ListeController
           
                    // Case : ???
                    if (empty($post['filter_CODE_ART']) && ($post['filter_CODE_ART'] ?? null) !== '') {
                        $post['valide'] = 1;
                    } else {
                        Outils::isCheck($post['valide']);
                    }
            
                    $liste = new \Modules\Ajax\Repository\Listes($pdo);
                    if (!empty($post['art_acd'])) {
                        return $liste->getFrameworkItems($post);
                    }
                    if (!empty($post['art_fou'])) {
                        // si un fournisseur est renseigné on cherche uniquement les articles liés au fournisseur
                        return $liste->getSupplierItems($post);
                    }
                    return $liste->listeArticles($post);
                },
            ],
            'Ajax.liste.articlesFraisPort' => (object) [
                'callable' => function ($post) use ($pdo) {
                    $post['filter_egal_ARTFRAISPORT'] = 'T';
                    return (new Listes($pdo))->listeArticles($post);
                },
            ],
            'Ajax.liste.articlesFrsFaSfa' => (object) [
                'callable' => [$repo, 'listeArticlesFrsFaSfa'],
            ],
            'Ajax.liste.articlesSiCdcSca' => (object) [
                'callable' => [$repo, 'listeArticlesSiCdcSca'],
            ],
            //TODO 'Ajax.liste.br' => (object) [
            //     'callable' => [$repo, ''],
            //     'entity' => \Entity\Model\::class,
            // ],
            'Ajax.liste.caEntet' => (object) [
                'callable' => [$repo, 'CaEntet'],
            ],
            'Ajax.liste.campNotEx' => (object) [
                'callable' => [$repo, 'listeCampNotex'],
            ],
            'Ajax.liste.cdc' => (object) [
                'callable' => [$repo, 'Cdc'],
                // 'primaryKey' => 'CODE_SI', // Assume CODE_STE is passed as zoomFilter
            ],
            'Ajax.liste.centrana' => (object) [
                'callable' => [$repo, 'Centrana'],
            ],
            'Ajax.liste.centre' =>
                self::simpleEntityFetch(\Entity\Model\Centre::class, $pdo),
            'Ajax.liste.centreAnalyseUtilisateurAutorise' => (object) [
                'callable' => [$repo, 'centreAnalyseUtilisateur'],
            ],
            'Ajax.liste.centreByType' => (object) [
                'callable' => [$repo, 'centreByType'],
            ],
            'Ajax.liste.centreEmetteur' => (object) [
                'callable' => [$repo, 'centreEmetteur'],
                'mainId' => 'filter_egal_cen.CODE_CTR',// TODO: get rid of the table alias
            ],
            'Ajax.liste.centreLivraison' => (object) [
                'callable' => [$repo, 'centreLivraison'],
                'mainId' => 'filter_egal_cen.CODE_CTR',// TODO: get rid of the table alias
            ],
            'Ajax.liste.commandeModele' => (object) [
                'callable' => [$repo, 'getListeModeleCommande'],
            ],
            'Ajax.liste.conditionPaiement' => (object) [
                'callable' => [$repo, 'ConditionPaiement'],
            ],
            'Ajax.liste.contactFournisseur' => (object) [
                'callable' => [$repo, 'contactsFournisseur'],
                // 'entity' => \Entity\Model\Contfour::class,
                'mainId' => 'filter_egal_IND_FOU',//!\\ Assuming that there is a CODE_FOU in the filter
            ],
            'Ajax.liste.cqualite' =>
                self::simpleEntityFetch(\Entity\Model\Cqualite::class, $pdo),
            'Ajax.liste.dccEntet' =>
                self::simpleEntityFetch(\Entity\Model\DccEntet::class, $pdo),
            'Ajax.liste.delegatairePref' => (object) [
                'callable' => [$repo, 'listDeleg'],
            ],
            'Ajax.liste.demandeur' => (object) [
                'callable' => function ($post) use ($repo) {
 // TODO : factorize
                    return $repo->utilisateurListe([
                        'DEMAND' => true,
                        'CODE_STE' => $post['filter_egal_CODE_STE'],
                    ] + $post);
                },
            ],
            'Ajax.liste.decoupage' =>
                self::simpleEntityFetch(\Entity\Model\Decoupage::class, $pdo),
            'Ajax.liste.devise' => (object) [
                'callable' => [$repo, 'Devise'],
            ],
            'Ajax.liste.directio' => (object) [
                'callable' => [$repo, 'Directio'],
            ],
            'Ajax.liste.doa' =>
                self::simpleEntityFetch(\Entity\Model\Doa::class, $pdo),
            'Ajax.liste.domaineFonctionnel' =>
                self::simpleEntityFetch(\Entity\Model\DomaineFonctionnel::class, $pdo),
            'Ajax.liste.domaineCompetence' =>
                self::simpleEntityFetch(\Entity\Model\DomaineCompetence::class, $pdo),
            'Ajax.liste.douanes' =>
                self::simpleEntityFetch(\Entity\Model\Douanes::class, $pdo),
            // TODO : restrict 'Ajax.liste.entityList' =>
            'Ajax.liste.etatStat' => (object) [
                'callable' => [$repo, 'etatStat'],
            ],
            'Ajax.liste.fabricant' =>
                self::simpleEntityFetch(\Entity\Model\Fabricant::class, $pdo),
            'Ajax.liste.famille' => (object) [
                'callable' => [$repo, 'famille'],
            ],
            'Ajax.liste.fonction' =>
                self::simpleEntityFetch(\Entity\Model\Fcontfrn::class, $pdo),
            'Ajax.liste.fonctionUser' =>
                self::simpleEntityFetch(\Entity\Model\FoncUsr::class, $pdo),
            'Ajax.liste.Ajax.liste.facture' =>
                self::simpleEntityFetch(\Entity\Model\FactEnt::class, $pdo),
            'Ajax.liste.fournisseur' => (object) [
                'callable' => [$repo, 'Fournisseur'],
                'mainId' => 'CODE', // Note : Fournisseur use table alias
            ],
            // TODO 'Ajax.liste.fournisseurSansArticlesSansCommande' =>
            'Ajax.liste.gamme' =>
                self::simpleEntityFetch(\Entity\Model\Gamme::class, $pdo),
            'Ajax.liste.groupeSignataire' => (object) [
                'callable' => [(new Signataires($pdo)), 'signataireREFGroupe'],
            ],
            'Ajax.liste.grpfou' =>
                self::simpleEntityFetch(\Entity\Model\Grpfou::class, $pdo),
            'Ajax.liste.grpSociete' => (object) [
                'callable' => [$repo, 'findGroupedCompanies'],
            ],
            'Ajax.liste.marches' => (object) [
                'callable' => [$repo, 'marches'],
            ],
            'Ajax.liste.messstan' =>
                self::simpleEntityFetch(\Entity\Model\Messstan::class, $pdo),
            'Ajax.liste.modelivraison' => (object) [
                'callable' => [$repo, 'modeLivraison'],
            ],
            'Ajax.liste.modePaiement' => (object) [
                'callable' => [$repo, 'modePaiement'],
            ],
            'Ajax.liste.motClef' =>
                self::simpleEntityFetch(\Entity\Model\MotClef::class, $pdo),
            'Ajax.liste.natana' => (object) [
                'callable' => [$repo, 'Natana'],
            ],
            'Ajax.liste.ordonance' =>
                self::simpleEntityFetch(\Entity\Model\Ordonanc::class, $pdo),
            'Ajax.liste.pays' =>
                self::simpleEntityFetch(\Entity\Model\Country::class, $pdo),
            'Ajax.liste.periodes' =>
                self::simpleEntityFetch(\Entity\Model\Periodes::class, $pdo),
            'Ajax.liste.sca' => (object) [
                'callable' => [$repo, 'Sca'],
                // 'primaryKey' => 'CODE_SCA', // Assume CODE_STE is passed as zoomFilter
            ],
            'Ajax.liste.si' => (object) [
                'callable' => [$repo, 'SectionImputation'],// TODO : handle $post['panier']
                // 'mainId' => 'CODE_SI',
                //'primaryKey' => 'CODE_SI', // Assume CODE_STE is passed as zoomFilter
            ],
            'Ajax.liste.sitesto' => (object) [
                'callable' => [$repo, 'siteStockAlone'],
            ],
            'Ajax.liste.societe' => (object) [
                'callable' => [$soc, 'listUserSociete'],
                'mainId' => 'filter_CODE_STE',
            ],
            // TODO: add FilterTable to listeSocieteCommuneSignataireDelegataire
            // 'Ajax.liste.societeCommune' => (object) [
            //     'callable' => [$soc, 'listeSocieteCommuneSignataireDelegataire'],
            //     'mainId' => 'filter_CODE_STE',
            // ],
            'Ajax.liste.sousFamille' => (object) [
                'callable' => [$repo, 'sousFamille'],
                'mainId' => 'filter_egal_SousFam.CODE_SFA',
            ],
            // TODO: 'Ajax.liste.sscptana' =>
                // TODO : remove  if (!$scaSecto) unset($post['CODE_STE']);


            'Ajax.liste.ssItesto' => (object) [
                'callable' => [$repo, 'siteStock'],
            ],
            'Ajax.liste.stockLocal' => (object) [
                'callable' => [$repo, 'listeStocksLocaux'],
                'mainId' => 'filter_egal_STO.CODE_ART',
            ],
            // TODO : 'Ajax.liste.tsDon' =>
            'Ajax.liste.TVA' =>
                self::simpleEntityFetch(\Entity\Model\TVA::class, $pdo),
            'Ajax.liste.typeAchat' => (object) [
                'callable' => [$repo, 'typeAchat'],
            ],
            'Ajax.liste.typeAchatFournis' => (object) [
                'callable' => [$repo, 'typeAchatFournisseur'],
            ],
            'Ajax.liste.typeDeMarche' =>
                self::simpleEntityFetch(\Entity\Model\TypeDeMarche::class, $pdo),
            'Ajax.liste.typeDoc' => (object) [
                'callable' => [$repo, 'listeTypeDoc'],
            ],
            'Ajax.liste.unites' => (object) [
                'callable' => [$repo, 'listeUnite'],
            ],
            'Ajax.liste.hastutil' =>
                self::simpleEntityFetch(\Entity\Model\Hastutil::class, $pdo),
            'Ajax.liste.uo' =>
                self::simpleEntityFetch(\Entity\Model\UO::class, $pdo),
            'Ajax.liste.utilisateur' => (object) [
                'callable' => [$repo, 'utilisateurListe'],
            ],
            
            'Ajax.Treeview.uoTreeview' => (object) [
                // TODO : get rid of HASSTD_ListeUO_PerimetreUser
                // 'callable' => [$treeview, 'UO'],
                'callable' => function ($post) use ($pdo) {
                    return (new \Entity\Model\UO($pdo))->fetchAll([], $post);
                },
            ],
            'Ajax.liste.etatStatFiltreType' => (object) [
                'callable' => function ($post) use ($pdo) {
                    return (new EtatStatTypeRepo($pdo))->listFiltreType($post);
                },
                'mainId' => 'filter_egal_CODE_FILTRE',
                'primaryKey' => 'CODE_FILTRE',
                'libelle' => 'LIBELLE',
            ],
            'Ajax.liste.etatGroupe' =>
                self::simpleEntityFetch(\Entity\Model\EtatGrp::class, $pdo),
            'Ajax.liste.etatStatTheme' =>
                self::simpleEntityFetch(\Entity\Model\EtatThem::class, $pdo),
            'Ajax.liste.siteStockAccessible' => (object) [
                'callable' => [$repo, 'listeSiteStockAccessible'],
            ],

            /**
             * TODO
Commande.GareDeTriage.popupCritereRegroup
Commande.popupCreationCde.popupListeAO
Commande.popupCreationCde.popupListeDA
Commande.popupCreationCde.popupListeligneDA
Evaluation.BibliothequeDeQuestions.popupNoteur', {'origine_noteur' : origine_noteur, 'entity' : entity}),
Evaluation.Question.parentQuestionList
Evaluation.Question.parentQuestionList', {mode: mode, id: idMode, theme: idTheme, questionId: idQuestion}),
GlobalApplication.MultiSelect.afficher
Panier.ImportLigne.listeFormat
ProjetAchat.BibliothequeDonnee.popupFormatDocument
Reception.Lot.listeLots
Specifique118.TableauReporting.listeAcheteurs
Specifique118.TableauReporting.listeFamilles
Specifique118.TableauReporting.listeFournisseurs
Specifique118.TableauReporting.listeNature
Specifique118.TableauReporting.listePole
Specifique118.TableauReporting.listePrestation
Specifique118.TableauReporting.listeSI
Specifique118.TableauReporting.listeSignataire
Specifique118.TableauReporting.listeSousFamilles
Specifique95.EtatStatistique.liste', {'type' : 'centre'}),
Specifique95.EtatStatistique.liste', {'type' : 'compte'}),
Utilisateur.MesBackup.listeBackup
             */
            'EtatStatistique.Zoom.tableDw' => (object) [
                'callable' => function ($post) use ($container) {
                    return (new EtatStatDataRepo($container->get('PDO.oxadw')))
                        ->listTable($post, $container->get(CacheInterface::class));
                },
                'mainId' => 'filter_egal_name',
                'primaryKey' => 'name',
            ],
            'Facture.Zoom.zoomUblField' => (object) [
                'callable' => function ($post) use ($pdo) {
                    return (new UblSchemaRepo($pdo))->listField($post);
                },
                'mainId' => 'filter_egal_code',
                'primaryKey' => 'code',
            ],
        ][ $path ] ?? null;
        if ($callable == null) {
            throw new \Exception('Invalid path "'.$path.'"');
        }
        return $callable;
    }

    /**
     * @param class-string<\Helpers\QueryBuilder\QueryBuilder> $entityClass
     * @return \stdClass
     */
    private static function simpleEntityFetch(string $entityClass, \PDO $pdo) :object
    {
        return (object) [
            'callable' => function ($post) use ($pdo, $entityClass) {
                return (new $entityClass($pdo))->findAll(null, [], $post);
            },
            'entity' => $entityClass,
        ];
    }

    /**
     * @return \stdClass{
     *     listField: array{
     *         key:string,
     *         label:string
     *     }[]
     * }[]
     */
    public static function getDisplayConfig(ITrad $trad, \PDO $pdo, string $zoomPath) :object
    {
        switch ($zoomPath) {
            case 'Ajax.liste.fournisseur':
                return (object) [
                    'listField' => [
                        ['label' => $trad->t('Code'), 'key' => 'CODE'],
                        ['label' => $trad->t('Raison sociale'), 'key' => 'RS'],
                        ['label' => $trad->t('Code postal'), 'key' => 'CPOSTAL'],
                        ['label' => $trad->t('Ville'), 'key' => 'VILLE'],
                    ],
                ];
            case 'EtatStatistique.Zoom.tableDw':
                return (object) [
                    'listField' => [['label' => $trad->t('Code'), 'key' => 'tableName']],
                ];
            case 'Ajax.liste.etatStatFiltreType':
                return (object) [
                    'listField' => [
                        ['label' => $trad->t('Type'), 'key' => 'TYPE_FILTRE'],
                        ['label' => $trad->t('Code'), 'key' => 'CODE_FILTRE'],
                        ['label' => $trad->t('Libellé'), 'key' => 'LIBELLE'],
                    ],
                ];
        }

        //______________________
        // Default

        $qbClass = ZoomHelper::getEntityFromPath($zoomPath);
        if ($qbClass == null) {
            throw new \Exception('An entity is required for path "'.$zoomPath.'"');
        }
        $qb = new $qbClass($pdo);
        $primaryKey = $qb->getPrimaryKey();
        if (empty($primaryKey)) {
            throw new \Exception('A primary key is required for path "'.$zoomPath.'"');
        }
        $labelKey = $qb->getLibelle();
        if (empty($labelKey)) {
            throw new \Exception('A label key is required for path "'.$zoomPath.'"');
        }

        return (object) [
            'listField' => [
                ['label' => $trad->t('Code'), 'key' => $primaryKey],
                ['label' => $trad->t('Libellé'), 'key' => $labelKey],
            ],
        ];
    }
}
