<?php

declare(strict_types=1);

namespace ABS\Controllers;

use ABS\Core\Controller;
use ABS\Services\AuthContextService;
use ABS\Services\CustomModuleService;
use ABS\Services\ModuleCategoryService;
use RuntimeException;

final class ModulesController extends Controller
{
    private function categoryService(): ModuleCategoryService
    {
        return new ModuleCategoryService();
    }

    private function auth(): AuthContextService
    {
        return new AuthContextService();
    }

    private function customModules(): array
    {
        $service = new CustomModuleService();

        return array_map(static function (array $module): array {
            return [
            'automation-studio' => ['name'=>'ABS Automation Studio','url'=>'/automation-studio','description'=>'Automatizări locale pentru SAGA, ANAF, furnizori și asigurări.','category'=>'Comunicare si automatizari','icon'=>'bi-robot','status'=>'Activ','goal'=>'Automatizarea operațiunilor repetitive.','access'=>'SuperAdmin și utilizatori autorizați','highlights'=>['Fără Node.js','PowerShell + Chrome','Rețete configurabile'],'metrics'=>['9 conectori','Joburi și documente','Execuție asistată'],'actions'=>['Rulează automatizare','Configurează rețete','Vezi documente']],
            'saga-accounting' => [
                'name' => 'SAGA Contabilitate',
                'url' => '/saga',
                'description' => 'Rapoarte programate, exporturi și arhivă pentru SAGA WEB.',
                'category' => 'Financiar si fiscal',
                'icon' => 'bi-calculator',
                'status' => 'Activ',
                'goal' => 'Centralizarea și arhivarea documentelor contabile.',
                'access' => 'Contabilitate, management și SuperAdmin',
                'highlights' => [
                    'Exporturi PDF/XLSX',
                    'Programări lunare',
                    'Arhivă pe perioade',
                ],
                'metrics' => [
                    '36 tipuri de raport',
                    'Conectare asistată',
                    'Istoric exporturi',
                ],
                'actions' => [
                    'Generează raport',
                    'Vezi arhiva',
                    'Configurează programări',
                ],
            ],
                'slug' => (string) $module['slug'],
                'name' => (string) $module['name'],
                'description' => (string) ($module['description'] ?? 'Modul personalizat creat din builder.'),
                'category' => 'Module personalizate',
                'icon' => 'bi-columns-gap',
                'status' => 'Creat de utilizator',
                'url' => '/custom-modules/' . (string) $module['slug'],
            ];
        }, $service->all());
    }

    private function modules(): array
    {
        return [
            'automation-studio' => ['name'=>'ABS Automation Studio','url'=>'/automation-studio','description'=>'Automatizări locale pentru SAGA, ANAF, furnizori și asigurări.','category'=>'Comunicare si automatizari','icon'=>'bi-robot','status'=>'Activ','goal'=>'Automatizarea operațiunilor repetitive.','access'=>'SuperAdmin și utilizatori autorizați','highlights'=>['Fără Node.js','PowerShell + Chrome','Rețete configurabile'],'metrics'=>['9 conectori','Joburi și documente','Execuție asistată'],'actions'=>['Rulează automatizare','Configurează rețete','Vezi documente']],
            'saga-accounting' => [
                'name' => 'SAGA Contabilitate',
                'url' => '/saga',
                'description' => 'Rapoarte programate, exporturi și arhivă pentru SAGA WEB.',
                'category' => 'Financiar si fiscal',
                'icon' => 'bi-calculator',
                'status' => 'Activ',
                'goal' => 'Centralizarea și arhivarea documentelor contabile.',
                'access' => 'Contabilitate, management și SuperAdmin',
                'highlights' => [
                    'Exporturi PDF/XLSX',
                    'Programări lunare',
                    'Arhivă pe perioade',
                ],
                'metrics' => [
                    '36 tipuri de raport',
                    'Conectare asistată',
                    'Istoric exporturi',
                ],
                'actions' => [
                    'Generează raport',
                    'Vezi arhiva',
                    'Configurează programări',
                ],
            ],
            'banks' => [
                'name' => 'Bănci',
                'url' => '/banks',
                'description' => 'Administrare bănci, conturi bancare, extrase de cont și tranzacții.',
                'category' => 'Financiar si fiscal',
                'icon' => 'bi-bank',
                'status' => 'Activ',
                'goal' => 'Centralizarea conturilor bancare și a extraselor de cont.',
                'access' => 'Financiar, contabilitate, management și SuperAdmin',
                'highlights' => [
                    'Administrare bănci și logo-uri',
                    'Conturi bancare multiple',
                    'Import extrase PDF/CSV/XLSX',
                ],
                'metrics' => [
                    'Bănci configurabile',
                    'Extrase organizate lunar',
                    'Istoric tranzacții',
                ],
                'actions' => [
                    'Deschide modulul',
                    'Adaugă cont bancar',
                    'Încarcă extras',
                ],
            ],
            'parts-catalog' => [
                'name' => 'Catalog si identificare piese',
                'description' => 'Cautare dupa VIN, cod OE, producator si compatibilitati multi-brand.',
                'category' => 'Piese si operatiuni auto',
                'icon' => 'bi-box-seam',
                'status' => 'Pregatit pentru preview',
                'goal' => 'Identificare rapida a pieselor si eliminarea erorilor de selectie.',
                'access' => 'Backoffice si operatori vanzari',
                'highlights' => ['Cautare VIN', 'Mapare coduri OE', 'Compatibilitati auto'],
                'metrics' => ['32k repere indexate', '14 branduri active', '97% acuratete selectie'],
                'actions' => ['Import catalog furnizori', 'Verificare compatibilitate', 'Export selectie piese'],
            ],
            'parts-requests' => [
                'name' => 'Cereri piese auto',
                'url' => '/parts-requests',
                'description' => 'Flux complet pentru solicitari piese, aprobare oferte si conversie in comenzi.',
                'category' => 'Piese si operatiuni auto',
                'icon' => 'bi-car-front-fill',
                'status' => 'Pregatit pentru preview',
                'goal' => 'Centralizarea cererilor primite din call center, web si mobil.',
                'access' => 'Consultanti si echipa ofertare',
                'highlights' => ['Inbox cereri', 'Prioritizare urgenta', 'Conversie in oferta'],
                'metrics' => ['148 cereri deschise', '24 urgente', '6 minute timp mediu raspuns'],
                'actions' => ['Adauga cerere', 'Atribuie consultant', 'Genereaza oferta'],
            ],
            'opencart' => [
                'name' => 'Integrare OpenCart',
                'description' => 'Sincronizare produse, stocuri, clienti si comenzi cu magazinul online.',
                'category' => 'Comert si integrari',
                'icon' => 'bi-cart-check',
                'status' => 'Conectare disponibila',
                'goal' => 'Unificarea fluxului ecommerce cu operatiunile interne.',
                'access' => 'Administratori ecommerce',
                'highlights' => ['Sync stocuri', 'Push comenzi', 'Mapare categorii'],
                'metrics' => ['1 magazin conectat', '3 joburi sync', '12 erori in coada'],
                'actions' => ['Porneste sincronizare', 'Verifica loguri', 'Mapeaza categorii'],
            ],
            'gdpr-manager' => [
                'name' => 'GDPR Manager',
                'description' => 'Administrare consimtamant, cereri de stergere, export date si audit conformitate.',
                'category' => 'Conformitate si documente',
                'icon' => 'bi-shield-lock',
                'url' => '/gdpr/admin',
                'status' => 'Activ pentru preview',
                'goal' => 'Trasabilitate completa pentru procesele de conformitate.',
                'access' => 'DPO si management',
                'highlights' => ['Consimtamant', 'Cereri persoane vizate', 'Registru procesari'],
                'metrics' => ['56 consimtaminte noi', '4 cereri in asteptare', '100% jurnal audit'],
                'actions' => ['Inregistreaza cerere', 'Exporta date', 'Revizuieste politici'],
            ],
            'ssm-manager' => [
                'name' => 'SSM Manager',
                'url' => '/ssm',
                'description' => 'Management securitate și sănătate în muncă, riscuri, instruiri și fișe de post.',
                'category' => 'Conformitate si documente',
                'icon' => 'bi-shield-check',
                'status' => 'Activ',
                'goal' => 'Administrarea completă a obligațiilor SSM și a documentelor angajaților.',
                'access' => 'Responsabil SSM, management și SuperAdmin',
                'highlights' => [
                    'Registru riscuri',
                    'Fișe de post',
                    'Planuri de prevenire',
                    'Instruiri și semnături',
                ],
                'metrics' => [
                    'Evaluare automată a riscului',
                    'Documente și evidențe angajați',
                    'Rapoarte și istoric instruiri',
                ],
                'actions' => [
                    'Deschide modulul',
                    'Adaugă risc',
                    'Planifică instruire',
                ],
            ],

            'birthdays' => [
                'name' => 'Birthdays',
                'url' => '/birthdays',
                'description' => 'Calendar aniversări clienți, felicitări și istoric comunicări.',
                'category' => 'Asigurari si relatii clienti',
                'icon' => 'bi-cake2',
                'status' => 'Activ',
                'goal' => 'Identificarea aniversărilor clienților și gestionarea felicitărilor prin e-mail, WhatsApp și SMS.',
                'access' => 'Front office, relații clienți, management și SuperAdmin',
                'highlights' => [
                    'Data nașterii extrasă din CNP',
                    'Calendar lunar',
                    'Email, WhatsApp și SMS',
                    'Istoric pe client și an',
                ],
                'metrics' => [
                    'Astăzi și următoarele 30 zile',
                    'Șabloane configurabile',
                    'Verificare CNP și excepții',
                ],
                'actions' => [
                    'Deschide calendarul',
                    'Sincronizează CNP',
                    'Configurează mesaje',
                ],
            ],
            'broker-insurance' => [
                'name' => 'Broker Asigurari',
                'url' => '/broker',
                'description' => 'Gestionare polite, oferte RCA/CASCO, parteneri si reînnoiri.',
                'category' => 'Asigurari si relatii clienti',
                'icon' => 'bi-file-earmark-medical',
                'status' => 'Activ',
                'goal' => 'Control unificat pentru activitatea de brokeraj.',
                'access' => 'Brokeri si operatori front office',
                'highlights' => ['Portofoliu polite', 'Alerta expirari', 'Comparare oferte'],
                'metrics' => ['412 polite active', '37 reinnoiri saptamana', '9 asiguratori conectati'],
                'actions' => ['Emite polita', 'Solicita oferta', 'Planifica reinnoire'],
            ],
            'dashboard-management' => [
                'name' => 'Dashboard Management',
                'description' => 'KPIs executive, volum operational, performanta echipe si alerte de business.',
                'category' => 'Management si raportare',
                'icon' => 'bi-speedometer2',
                'status' => 'Disponibil in shell',
                'goal' => 'Vizibilitate rapida asupra performantei companiei.',
                'access' => 'Management si supervizori',
                'highlights' => ['KPIs in timp real', 'Comparatii perioade', 'Alerte tinta'],
                'metrics' => ['18 widgeturi active', '6 alerte critice', '92% obiective urmarite'],
                'actions' => ['Deschide dashboard', 'Configureaza widget', 'Trimite raport'],
            ],
            'notifications-email' => [
                'name' => 'Notificari si e-mail',
                'description' => 'Sabloane, cozi de trimitere, reminder-e automate si istoricul comunicarilor.',
                'category' => 'Comunicare si automatizari',
                'icon' => 'bi-envelope-paper',
                'status' => 'Pregatit pentru automatizari',
                'goal' => 'Comunicare coerenta cu clienti si echipe interne.',
                'access' => 'Marketing, suport si operatiuni',
                'highlights' => ['Template-uri email', 'SMS tranzactionale', 'Reguli automate'],
                'metrics' => ['27 sabloane', '1.2k emailuri azi', '98.4% rata livrare'],
                'actions' => ['Creeaza campanie', 'Verifica livrari', 'Ruleaza reminder'],
            ],
            'mobile-api' => [
                'name' => 'API pentru aplicatia mobila',
                'description' => 'Endpoint-uri securizate pentru autentificare, catalog, cereri si notificari push.',
                'category' => 'Comert si integrari',
                'icon' => 'bi-phone',
                'status' => 'Ready pentru integrare',
                'goal' => 'Suport complet pentru experienta mobila a clientilor si agentilor.',
                'access' => 'Integratori si echipa mobile',
                'highlights' => ['JWT auth', 'Rate limiting', 'Versiuni endpoint'],
                'metrics' => ['14 endpoint-uri planificate', '2 versiuni API', '0 incidente securitate'],
                'actions' => ['Vezi endpoint-uri', 'Testeaza token', 'Genereaza cheie client'],
            ],
            'document-management' => [
                'name' => 'Management documente',
                'description' => 'Dosare clienti, contracte, anexe, scanari si politici de retentie.',
                'category' => 'Conformitate si documente',
                'icon' => 'bi-folder2-open',
                'url' => '/documents',
                'status' => 'Disponibil in preview',
                'goal' => 'Arhivare centralizata si acces controlat la documente.',
                'access' => 'Backoffice, juridic si brokeri',
                'highlights' => ['Dosare electronice', 'Versionare', 'Retentie documente'],
                'metrics' => ['8.4k fisiere indexate', '19 dosare azi', '3 politici retentie'],
                'actions' => ['Incarca document', 'Cauta dosar', 'Partajeaza fisier'],
            ],
            'reports-statistics' => [
                'name' => 'Rapoarte si statistici',
                'url' => '/reports',
                'description' => 'Exporturi operationale, indicatori comerciali si analize pe perioade, echipe si surse.',
                'category' => 'Management si raportare',
                'icon' => 'bi-graph-up-arrow',
                'status' => 'Disponibil in preview',
                'goal' => 'Masurare clara a performantelor si suport pentru decizii.',
                'access' => 'Management, financiar si operatiuni',
                'highlights' => ['Export Excel/PDF', 'Filtre pe perioade', 'Comparatii YoY'],
                'metrics' => ['42 rapoarte salvate', '7 tablouri executive', '11 filtre standard'],
                'actions' => ['Genereaza raport', 'Salveaza filtru', 'Trimite catre management'],
            ],
            'spv-einvoices' => [
                'name' => 'Facturi electronice SPV',
                'description' => 'Modul separat pentru conectare API, sincronizare si descarcare facturi electronice din SPV.',
                'category' => 'Financiar si fiscal',
                'icon' => 'bi-receipt-cutoff',
                'url' => '/spv-invoices',
                'status' => 'Disponibil pentru configurare',
                'goal' => 'Automatizarea preluarii facturilor electronice si arhivarea lor locala.',
                'access' => 'Financiar, contabilitate si administratori',
                'highlights' => ['Configurare API SPV', 'Descarcare automata', 'Arhiva locala XML/PDF/ZIP'],
                'metrics' => ['0 sincronizari initiale', '1 pipeline API configurabil', 'Fallback demo inclus'],
                'actions' => ['Configureaza API', 'Ruleaza sincronizare', 'Descarca factura'],
            ],
            'auto-acts' => [
                'name' => 'Acte auto',
                'description' => 'Gestionare inmatriculari, transcrieri, contracte vanzare-cumparare si alte dosare de acte auto.',
                'category' => 'Conformitate si documente',
                'icon' => 'bi-card-checklist',
                'url' => '/acte-auto',
                'status' => 'Disponibil in preview',
                'goal' => 'Urmarire clara pentru toate etapele documentatiei auto.',
                'access' => 'Operatiuni, brokeri si backoffice',
                'highlights' => ['Dosare acte auto', 'Statusuri pe etape', 'Atasamente pentru fiecare dosar'],
                'metrics' => ['0 dosare initiale', '6 tipuri acte auto', 'CRUD complet disponibil'],
                'actions' => ['Adauga dosar', 'Actualizeaza status', 'Deschide atasament'],
            ],
            'appointments' => [
                'name' => 'Programari clienti',
                'description' => 'Planificare servicii clienti: freon, diagnoza, asigurari, contracte si alte interventii programate.',
                'category' => 'Piese si operatiuni auto',
                'icon' => 'bi-calendar2-check',
                'url' => '/programari',
                'status' => 'Disponibil in preview',
                'goal' => 'Organizarea eficienta a fluxului de programari pe zile si saptamani.',
                'access' => 'Front office, service si backoffice',
                'highlights' => ['Programari rapide', 'Integrare agenda', 'Statusuri operationale'],
                'metrics' => ['0 programari initiale', '6 subtipuri predefinite', 'Sincronizare cu agenda activa'],
                'actions' => ['Adauga programare', 'Vizualizeaza calendar', 'Actualizeaza status'],
            ],
            'salvage-center' => [
                'name' => 'Dezmembrări auto',
                'url' => '/dezmembrari',
                'description' => 'Evaluare vehicule donor, inventariere piese SH și calculul rentabilității dezmembrării.',
                'category' => 'Piese si operatiuni auto',
                'icon' => 'bi-car-front-fill',
                'status' => 'Activ',
                'goal' => 'Evaluarea profitabilității și urmărirea pieselor provenite din vehicule donor.',
                'access' => 'Management, piese auto și SuperAdmin',
                'highlights' => ['Evaluare înainte de cumpărare', 'Inventar piese donor', 'Profit estimat și realizat'],
                'metrics' => ['Vehicule în evaluare', 'Piese disponibile', 'Valoare stoc SH'],
                'actions' => ['Evaluează vehicul', 'Începe dezmembrarea', 'Vezi stoc piese'],
            ],

            'custom-builder' => [
                'name' => 'Builder module personalizate',
                'description' => 'Creare module dinamice cu campuri, functionalitati si import de date CSV/XLSX.',
                'category' => 'Administrare platforma',
                'icon' => 'bi-tools',
                'url' => '/custom-modules/manage',
                'status' => 'Disponibil pentru Admin si SuperAdmin',
                'goal' => 'Extinderea platformei fara cod nou in fiecare caz.',
                'access' => 'Admin si SuperAdmin',
                'highlights' => ['Campuri personalizate', 'Import CSV/XLSX', 'Vizualizare date in modul'],
                'metrics' => ['0 module create', '6 functionalitati disponibile', '2 roluri cu acces'],
                'actions' => ['Creeaza modul', 'Importa date', 'Deschide builder'],
            ],
        ];
    }

    public function index(): never
    {
        $modules = [];
        $categories = [];
        $allModules = $this->modules();

        foreach ($this->customModules() as $customModule) {
            $allModules['custom-' . $customModule['slug']] = $customModule;
        }

        foreach ($allModules as $slug => $module) {
            $item = [
                'slug' => $slug,
                'name' => $module['name'],
                'description' => $module['description'],
                'category' => $this->categoryService()->categoryFor($slug, (string) ($module['category'] ?? 'Altele')),
                'icon' => $module['icon'] ?? 'bi-grid',
                'status' => $module['status'],
                'url' => $module['url'] ?? ('/modules/' . $slug),
            ];

            $modules[] = $item;
            $categories[$item['category']][] = $item;
        }

        $selectedCategory = trim((string) ($_GET['category'] ?? ''));
        $filteredModules = $selectedCategory === ''
            ? $modules
            : array_values(array_filter($modules, static fn(array $module): bool => (string) ($module['category'] ?? '') === $selectedCategory));

        $this->view('modules/index', [
            'title' => 'Module ABS',
            'modules' => $filteredModules,
            'categories' => $categories,
            'selectedCategory' => $selectedCategory,
            'canManageCustomModules' => $this->auth()->canManageCustomModules(),
            'canManageModuleCategories' => $this->auth()->canManageModuleCategories(),
        ]);
    }

    public function show(string $slug): never
    {
        /*
         * Compatibilitate cu adresa veche din catalogul Module ABS.
         * Modulul funcțional Broker Asigurări este disponibil la /broker.
         */
        if (in_array($slug, ['broker-insurance', 'broker'], true)) {
            $this->redirect('/broker');
        }

        if ($slug === 'parts-catalog') {
            $this->redirect('/revision-hub');
        }

        $aliases = [
            'gdpr' => 'gdpr-manager',
            'broker' => 'broker-insurance',
            'notifications' => 'notifications-email',
            'api' => 'mobile-api',
            'reports' => 'reports-statistics',
        ];

        $resolvedSlug = $aliases[$slug] ?? $slug;

        $module = $this->modules()[$resolvedSlug] ?? [
            'name' => ucfirst(str_replace('-', ' ', $slug)),
            'description' => 'Modul in dezvoltare',
            'status' => 'Planificat',
            'goal' => 'Urmeaza sa fie definit.',
            'access' => 'Nedefinit',
            'highlights' => ['Preview initial'],
            'metrics' => ['Fara date'],
            'actions' => ['Deschide modul'],
        ];

        $this->view('modules/show', [
            'title' => $module['name'],
            'module' => $module,
            'slug' => $resolvedSlug,
        ]);
    }

    public function updateCategory(string $slug): never
    {
        if (!$this->auth()->canManageModuleCategories()) {
            throw new RuntimeException('Doar rolurile SuperAdmin si Admin pot modifica categoriile modulelor.');
        }

        $category = trim((string) ($_POST['category'] ?? ''));
        $this->categoryService()->save($slug, $category);

        $query = trim((string) ($_POST['redirect_category'] ?? ''));
        $suffix = $query !== '' ? '?category=' . rawurlencode($query) : '';

        $this->redirect('/modules' . $suffix);
    }
}
