<?php

namespace App\Http\Controllers\Cartograhie;

use App\Http\Controllers\Cartograhie\ChartsData\AllResultsForController;
use App\Http\Controllers\Cartograhie\ChartsData\ChartsDataController;
use App\Http\Controllers\Cartograhie\DataChecker\DataCheckerController;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Parametres\Imports\ImportCSVClient;
use App\Http\Controllers\Cartograhie\Filters\FilterController;
use Exception;
use Illuminate\Http\Request;

class CartographieController extends Controller
{
    private $importCSVClient;
    private $dataCheckerController;
    private $allResultsForController;
    private $chartsDataController;
    private $filterController;

    public function __construct(ImportCSVClient $importCSVClient, DataCheckerController $dataCheckerController, AllResultsForController $allResultsForController, ChartsDataController $chartsDataController, FilterController $filterController)
    {
        $this->importCSVClient = $importCSVClient;
        $this->dataCheckerController = $dataCheckerController;
        $this->allResultsForController = $allResultsForController;
        $this->chartsDataController = $chartsDataController;
        $this->filterController = $filterController;
    }

    public function VerifyAllDataIsNotSend(): bool
    {
        $methodsToCheck = [
            $this->chartsDataController->retrieveDomainsPurchaseByAmount(),
            $this->chartsDataController->retrieveCoverageRate(),
            $this->chartsDataController->retrieveAllDomainsPurchase(),
            $this->chartsDataController->retrieveTopTenSuppliers(),
            $this->allResultsForController->retrieveSuppliersByDomain(),
            $this->allResultsForController->retrieveAverageAmountSuppliersByDomain(),
            $this->chartsDataController->retrieveSuppliersOffMarketByDomain()['allData'],
            $this->chartsDataController->retrieveExpensesPerDate(),
            $this->chartsDataController->retrieveDetailsOfExpenses()['allData'],
            $this->chartsDataController->retrieveTopTenFamilyPurchase(),
            $this->chartsDataController->retrievePurchaseCoverageRate(),
            $this->chartsDataController->retrieveMarketByAmount(),
            $this->chartsDataController->retrieveMarketByAmountTab()['allData'],
            $this->chartsDataController->retrieveRenewalMarket()['allData'],
        ];

        $verif = true;
        foreach ($methodsToCheck as $method) {
            if (!$this->dataCheckerController->checkIfOneDataIsNull($method)) {
                $verif = false;
            }
        }
        return $verif;
    }

    public function index()
    {
        $this->resetSessionFlash();
        return view('cartographie.index.index', $this->allResultsForController->getAllResultsFunctionInController(), ['verifyAllDataIsSend' => $this->VerifyAllDataIsNotSend()]);
    }

    public function check(Request $request)
    {
        $this->resetSessionFlash();
        try {
            $this->importCSVClient->ensureFileInRequest($request, 'cartography');
            $file = $request->file('cartography');

            $this->importCSVClient->validateFile($file);
            $this->importCSVClient->checkIfMatchingExists();
            $this->importCSVClient->checkIsAtLeastOneMatchingHeader($file);
            $this->importCSVClient->importData($file);

            session()->flash('loadingComplete');
            if ($this->importCSVClient->checkAllHeadersAreMatched($file)) {
                session()->flash('alert', "Tous les entêtes du fichier ne sont pas associés à ceux enregistrés par l'administrateur. Certains de vos graphiques et tableaux risquent de ne pas s'afficher.");
            } else {
                session()->flash('success', 'Import réussi. Voici les données pour votre fichier.');
            }
        } catch (Exception $e) {
            session()->flash('errors', $e->getMessage());
        }

        return view('cartographie.index.index', $this->allResultsForController->getAllResultsFunctionInController(), ['verifyAllDataIsSend' => $this->VerifyAllDataIsNotSend(), $this->getAllNameOfCharts()]);
    }

    public function resetSessionFlash()
    {
        $keys = ['success', 'error', 'alert'];
        foreach ($keys as $key) {
            session()->forget($key);
        }
    }

    public function getAllNameOfCharts(): array
    {
        return array_merge(
            [
                'domainsPurchaseByAmountName' => 'Domaines d\'achat par MONTANT HT',
                'coverageRateName' => 'Taux de couverture (Montant HT)',
                'allDomainsPurchaseName' => 'Domaine d\'achat en %',
                'topTenSuppliersName' => 'Top 10 des fournisseurs en MONTANT HT',
                'suppliersOffMarketByDomainName' => 'Fournisseurs hors marché',
                'expensesPerDateName' => 'Dépenses en MONTANT HT',
                'detailsOfExpensesName' => 'Détails des dépenses',
                'topTenFamilyPurchaseName' => 'Top 10 des familles d\'achat en MONTANT HT',
                'purchaseCoverageRateName' => 'Taux de couverture des achats sur marché et hors marché par famille d\'achat en MONTANT HT',
                'marketByAmountName' => 'Répartition des marchés',
                'marketByAmountTabName' => 'Liste des marchés',
                'renewalMarketName' => 'Renouvellement des marchés sur les 6 prochains mois',
            ]
        );
    }
}
