<?php

namespace App\Providers;

use App\Models\Categorie;
use App\Models\Domaine;
use App\Models\Famille;
use App\Models\Projet;
use App\Models\Segment;
use App\Notifications\Import\ImportNotification;
use Illuminate\Database\Schema\Builder;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\URL;
use Illuminate\Support\ServiceProvider;
use Maatwebsite\Excel\Events\AfterImport;
use Maatwebsite\Excel\Events\BeforeImport;
use Maatwebsite\Excel\Imports\HeadingRowExtractor;
use Maatwebsite\Excel\Reader;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        Reader::listen(BeforeImport::class, function (BeforeImport $event) {
            $concernable = $event->getConcernable();

            // Avant l'import on récupère les header du fichier
            $header = array_filter(HeadingRowExtractor::extract($event->getDelegate()->getDelegate()->getActiveSheet(), $concernable));

            $intersect = array_intersect($header, $concernable->headersRequired);
            // On check si le header répond au attente de l'import
            if (empty($intersect) || sort($intersect) != sort($header)) {
                $concernable->beforeImportSuccess = false;
            }
        });
        Reader::listen(AfterImport::class, function (AfterImport $event) {
            $concernable = $event->getConcernable();

            if ($concernable->beforeImportSuccess) {
                $concernable->importedBy->notify(new ImportNotification($concernable->getSuccessMessage()));
            } else {
                if ($concernable->contexte === 'nomenclature') {
                    // On supprime tous les éléments insérés
                    // Fait dans ce sens pour ne pas avoir des problème de foreign key
                    Segment::whereIn('id', $concernable->insertedSegment)->delete();
                    Categorie::whereIn('id', $concernable->insertedCategorie)->delete();
                    Domaine::whereIn('id', $concernable->insertedDomaine)->delete();
                    Famille::whereIn('id', $concernable->insertedFamille)->delete();
                }

                if ($concernable->contexte === 'projet') {
                    // On supprime tous les éléments insérés
                    Projet::whereIn('id', $concernable->insertedProjets)->delete();
                }

                $concernable->importedBy->notify(new ImportNotification($concernable->getErrorMessage()));
            }
        });
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        // Elements de configuration spécifique à l'environnement d'Ordiges
        if (env('APTIMAP_CONFIG_ORDIGES', false) && !app()->environment('local')) {
            Builder::defaultStringLength(191);
            URL::forceScheme('https');
        }
    }
}
