<?php

namespace App\Exports;

use App\Models\Projet;
use App\Models\Structure;
use Illuminate\Support\Facades\Auth;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
use TYPE_ACHAT_INVESTISSEMENT;
use TYPE_CALCUL_GAINS;

class ProjetsExport implements FromCollection, WithHeadings, WithMapping
{
    private $_paat_id;
    private $_direction_id;
    private $_service_id;
    private $_famille_id;

    public function __construct($paat_id, $direction_id, $service_id, $famille_id)
    {
        $this->_paat_id = $paat_id;
        $this->_direction_id = $direction_id;
        $this->_service_id = $service_id;
        $this->_famille_id = $famille_id;
    }

    public function collection()
    {
        $projets = Projet::where('projets.structure_id', Auth::user()->structure_id);
        $projets = Projet::getByFiltresAndRole($projets, $this->_paat_id, $this->_direction_id, $this->_service_id, $this->_famille_id);
        return $projets->get();
    }

    public function map($row): array
    {
        return [
            $row->reference,
            $row->acheteur->nom_complet(),
            $row->structure->nom,
            $row->direction->nom,
            $row->service->nom  ?? '',
            $row->description,
            $row->objet,
            $row->niveau_mutualisation->nom,
            $row->operateur_mutualisation->nom,
            $row->impact_budgetaire,
            $row->imputation_budgetaire->nom,
            $row->programmation ? 'Action programmée' : 'Action non programmée',
            TYPE_CALCUL_GAINS::TYPE_CALCUL_GAINS_FORMATTED[$row->type_calcul_gains],
            $row->ondam ? 'ONDAM' : 'Non ONDAM',
            $row->referentiel,
            $row->famille->nom ?? '',
            $row->domaine->nom ?? '',
            $row->categorie->nom ?? '',
            $row->segment->nom ?? '',
            $row->libelle_marche_a_renouveler,
            $row->numero_marche_a_renouveler,
            $row->libelle_nouveau_marche,
            $row->numero_nouveau_marche,
            $row->date_debut,
            $row->date_fin,
            implode(', ', $row->leviers->map(function ($levier) {
                return $levier->nom;
            })->toArray()),
            implode(', ', $row->actions->map(function ($action) {
                return $action->thematique->nom . ' - ' . $action->nom;
            })->toArray()),
            $row->statut->first()->nom,
            implode(', ', $row->membres->map(function ($membre) {
                return $membre->nom_complet();
            })->toArray()),
            implode(', ', $row->taches->map(function ($tache) {
                return $tache->nom . ' (' . $tache->nb_jours . ' jours)';
            })->toArray()),
            $row->niveau_priorite,
            $row->montant_reference,
            $row->montant_notifie,
            $row->montant_realise,
            $row->pourcentage_gains_cible,
            $row->gains_cible,
            $row->gains_notifie,
            $row->gains_securise,
            TYPE_ACHAT_INVESTISSEMENT::TYPE_ACHAT_INVESTISSEMENT_FORMATTED[$row->type_achat_investissement],
            $row->moyenne_offre,
            $row->duree_mois,
            $row->commentaire,
            $row->prochaine_echeance,
            $row->prochaine_etape,
            $row->etat_avancement,
            $row->risque
        ];
    }

    public function headings(): array
    {
        $champ_referentiel = Structure::find(Auth::user()->structure_id)->champ_referentiel;
        return [
            'Référence', 'Acheteur', 'Structure', 'Etablissement', 'Service', 'Description', 'Objet',
            'Mutualisation', 'Centrale d\'achat', 'Impact budgétaire', 'Imputation budgétaire',
            'Programmation', 'Calcul des gains', 'Objectifs de l\'Assurance Maladie', $champ_referentiel,
            'Famille', 'Domaine', 'Catégorie', 'Segment', 'Ancien libellé marché', 'Ancien numéro marché',
            'Nouveau libellé marché', 'Nouveau numéro marché', 'Date de début', 'Date de fin', 'Leviers',
            'RSE', 'Statut', 'Membres', 'Tâches', 'Niveau priorité', 'Montant référence', 'Montant notifié', 'Montant réalisé',
            'Pourcentage gains cible', 'Gains cible', 'Gains notifié', 'Gains sécurisé', 'Type achat investissement', 'Moyenne offre',
            'Durée (en mois)', 'Commentaire', 'Prochaine échéance', 'Prochaine étape', 'Etat avancement', 'Risque'
        ];
    }
}
