<?php

namespace App\Imports;

use App\Models\Categorie;
use App\Models\Domaine;
use App\Models\Famille;
use App\Models\Segment;
use App\Models\User;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;

class NomenclaturesImport implements ToCollection, WithHeadingRow
{
    public $importedBy;
    public $contexte = 'nomenclature';
    public $insertedFamille = array();
    public $insertedDomaine = array();
    public $insertedCategorie = array();
    public $insertedSegment = array();
    public $headersRequired = ['nomenclature_achat', 'famille_dachat_n_0', 'domaines_dachat_n_1', 'categories_dachat_n_2', 'segments_dachat_n_3' ];
    public $beforeImportSuccess = true;

    public function __construct(User $importedBy)
    {
        $this->importedBy = $importedBy;
    }

    /**
    * @param Collection $rows
    */
    public function collection(Collection $rows)
    {
        // On importe pas les element si le header ne correspond pas
        if ($this->beforeImportSuccess) {
            foreach ($rows as $row) {
                if (isset($row['famille_dachat_n_0']) && $row['famille_dachat_n_0'] != null) {
                    $famille_inserted = Famille::firstOrCreate([
                        'nom' => $row['famille_dachat_n_0'],
                        'description' => 'Famille',
                        'structure_id' => $this->importedBy->structure_id
                    ]);

                    if ($famille_inserted && isset($row['domaines_dachat_n_1']) && $row['domaines_dachat_n_1'] != null) {
                        // On sauvegarde la famille insérée pour rollback si besoin
                        array_push($this->insertedFamille, $famille_inserted->id);

                        $domaine_inserted = Domaine::firstOrCreate([
                            'nom' => $row['domaines_dachat_n_1'],
                            'description' => 'Domaine',
                            'famille_id' => $famille_inserted->id
                        ]);

                        if ($domaine_inserted && isset($row['categories_dachat_n_2']) && $row['categories_dachat_n_2'] != null) {
                            // On sauvegarde le domaine inséré pour rollback si besoin
                            array_push($this->insertedDomaine, $domaine_inserted->id);

                            $categorie_inserted = Categorie::firstOrCreate([
                                'nom' => $row['categories_dachat_n_2'],
                                'description' => 'Categorie',
                                'domaine_id' => $domaine_inserted->id
                            ]);

                            if ($categorie_inserted && isset($row['segments_dachat_n_3']) && $row['segments_dachat_n_3'] != null) {
                                // On sauvegarde la categorie insérée pour rollback si besoin
                                array_push($this->insertedCategorie, $categorie_inserted->id);

                                $segment_inserted = Segment::firstOrCreate([
                                    'nom' => $row['segments_dachat_n_3'],
                                    'description' => 'Segment',
                                    'categorie_id' => $categorie_inserted->id
                                ]);

                                // On sauvegarde le segment inséré pour rollback si besoin
                                if ($segment_inserted) {
                                    array_push($this->insertedSegment, $segment_inserted->id);
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    public function getSuccessMessage()
    {
        return 'La nomenclature achat a bien été importée.';
    }

    public function getErrorMessage()
    {
        return 'L\'import de la nomenclature achat a échoué. Veuillez réessayer en vous assurant que le fichier est pris en charge par l\'application.';
    }
}
