<?php

declare(strict_types=1);

namespace App\DataFixtures;

use App\Entity\Ecole;
use App\Entity\TenantDomain;
use App\Entity\Theme;
use App\Entity\User;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;

class AppFixtures extends Fixture
{
    public function __construct(
        private readonly UserPasswordHasherInterface $passwordHasher,
    ) {
    }

    public function load(ObjectManager $manager): void
    {
        $themes = [];
        $themeRepository = $manager->getRepository(Theme::class);
        $ecoleRepository = $manager->getRepository(Ecole::class);
        $userRepository = $manager->getRepository(User::class);

        foreach ($this->themes() as $data) {
            $theme = $themeRepository->findOneBy(['code' => $data['code']]) ?? new Theme();
            $theme
                ->setNom($data['nom'])
                ->setCode($data['code'])
                ->setDescription($data['description'])
                ->setPreviewImage($data['previewImage'])
                ->setActif($data['actif']);

            $themes[$data['code']] = $theme;
            $manager->persist($theme);
        }

        $ecoles = [];

        foreach ($this->ecoles() as $data) {
            $ecole = $ecoleRepository->findOneBy(['slug' => $data['slug']])
                ?? $ecoleRepository->findOneBy(['sousDomaine' => $data['sousDomaine']])
                ?? new Ecole();

            $ecole
                ->setNom($data['nom'])
                ->setSlug($data['slug'])
                ->setSousDomaine($data['sousDomaine'])
                ->setPrefixeMatricule($data['prefixeMatricule'])
                ->setDescription($data['description'])
                ->setSlogan($data['slogan'])
                ->setTelephone1($data['telephone1'])
                ->setTelephone2($data['telephone2'])
                ->setWhatsapp($data['whatsapp'])
                ->setEmail($data['email'])
                ->setAdresse($data['adresse'])
                ->setVille($data['ville'])
                ->setPays($data['pays'])
                ->setCouleurPrincipale($data['couleurPrincipale'])
                ->setCouleurSecondaire($data['couleurSecondaire'])
                ->setCouleurAccent($data['couleurAccent'])
                ->setThemePublic($themes[$data['theme']])
                ->setHeroTitle($data['heroTitle'])
                ->setHeroSubtitle($data['heroSubtitle'])
                ->setAboutTitle($data['aboutTitle'])
                ->setAboutText($data['aboutText'])
                ->setCtaTitle($data['ctaTitle'])
                ->setCtaText($data['ctaText'])
                ->setReglementInterieur($data['reglementInterieur'])
                ->setActive($data['active']);

            if (!$ecole->getLogo() && isset($data['logo'])) {
                $ecole->setLogo($data['logo']);
            }

            if (!$ecole->getFavicon() && isset($data['favicon'])) {
                $ecole->setFavicon($data['favicon']);
            }

            if (!$ecole->getHeroImage() && isset($data['heroImage'])) {
                $ecole->setHeroImage($data['heroImage']);
            }

            if (!$ecole->getPresentationImage1() && isset($data['presentationImage1'])) {
                $ecole->setPresentationImage1($data['presentationImage1']);
            }

            if (!$ecole->getPresentationImage2() && isset($data['presentationImage2'])) {
                $ecole->setPresentationImage2($data['presentationImage2']);
            }

            if (!$ecole->getPresentationImage3() && isset($data['presentationImage3'])) {
                $ecole->setPresentationImage3($data['presentationImage3']);
            }

            $this->syncTenantDomains($ecole, $data['sousDomaine'], $data['domainAliases']);

            if ($ecole->getId() === null) {
                $ecole->setDernierNumeroMatricule(0);
            }

            $ecoles[$data['slug']] = $ecole;
            $manager->persist($ecole);
        }

        foreach ($this->users() as $data) {
            $user = $userRepository->findOneBy(['email' => $data['email']]) ?? new User();
            $user
                ->setNom($data['nom'])
                ->setEmail($data['email'])
                ->setTelephone($data['telephone'])
                ->setRoles($data['roles'])
                ->setActive(true);

            $user->setEcole($data['ecole'] !== null ? $ecoles[$data['ecole']] : null);

            if ($user->getPassword() === null) {
                $user->setPassword($this->passwordHasher->hashPassword($user, 'password'));
            }

            $manager->persist($user);
        }

        $manager->flush();
    }

    /**
     * @return list<array{nom: string, code: string, description: string, previewImage: ?string, actif: bool}>
     */
    private function themes(): array
    {
        return [
            [
                'nom' => 'Thème Qamar',
                'code' => 'qamar',
                'description' => 'Thème doux, lumineux et rassurant pour une madrassa en ligne orientée accompagnement des femmes.',
                'previewImage' => null,
                'actif' => true,
            ],
            [
                'nom' => 'Thème Daroul-Ilm',
                'code' => 'daroul_ilm',
                'description' => 'Thème institutionnel vert et doré pour une madrassa structurée avec cours en ligne et présentiel.',
                'previewImage' => null,
                'actif' => true,
            ],
            [
                'nom' => 'Thème Sahaba',
                'code' => 'sahaba',
                'description' => 'Thème institutionnel sobre pour une madrassa axée sur le Qur’an, la mémorisation et les Mutun Talibil Ilm.',
                'previewImage' => null,
                'actif' => true,
            ],
        ];
    }

    /**
     * @return list<array<string, mixed>>
     */
    private function ecoles(): array
    {
        return [
            [
                'nom' => 'Madrassatoul Qamar',
                'slug' => 'qamar',
                'sousDomaine' => 'alqamar',
                'domainAliases' => [],
                'prefixeMatricule' => 'MQO',
                'description' => 'Madrassatoul Qamar est une madrassa en ligne dédiée aux femmes, avec un suivi sérieux et progressif.',
                'slogan' => 'Même en ligne, j’améliore mon QUR’AN',
                'telephone1' => '697337855',
                'telephone2' => '699342670',
                'whatsapp' => null,
                'logo' => 'assets/demo-schools/logo_qamar.png',
                'favicon' => 'assets/demo-schools/favicon_qamar.png',
                'email' => null,
                'adresse' => null,
                'ville' => 'Yaoundé',
                'pays' => 'Cameroun',
                'theme' => 'qamar',
                'couleurPrincipale' => '#5B3A70',
                'couleurSecondaire' => '#E9C7D8',
                'couleurAccent' => '#C9A24D',
                'active' => true,
                'heroTitle' => 'Même en ligne, j’améliore mon Qur’an',
                'heroSubtitle' => 'Une madrassa en ligne dédiée aux femmes, avec un suivi sérieux et progressif.',
                'aboutTitle' => 'Une formation accessible et suivie',
                'aboutText' => 'Madrassatoul Qamar accompagne les étudiantes dans l’apprentissage de la Qaida Nouraniyya, l’amélioration de la lecture du Qur’an et la mémorisation.',
                'ctaTitle' => 'Rejoindre Madrassatoul Qamar',
                'ctaText' => 'Inscrivez-vous et commencez votre parcours d’apprentissage avec un encadrement sérieux.',
                'reglementInterieur' => "1. L’étudiante s’engage à respecter les horaires de cours et à prévenir l’administration en cas d’absence.\n2. Le respect des enseignantes, des autres étudiantes et des consignes pédagogiques est obligatoire.\n3. Les informations transmises lors de l’inscription doivent être exactes et mises à jour en cas de changement.\n4. Les groupes WhatsApp sont réservés aux échanges liés aux cours et à l’administration.",
            ],
            [
                'nom' => 'Madrassa Daroul-Ilm',
                'slug' => 'daroul-ilm',
                'sousDomaine' => 'darulilm',
                'domainAliases' => ['daroulilm.salsabil.cm'],
                'prefixeMatricule' => 'DI',
                'description' => 'Daroul-Ilm propose des cours en ligne via WhatsApp et un accompagnement présentiel personnalisé.',
                'slogan' => 'Apprentissage du Coran et des sciences islamiques',
                'telephone1' => '691 29 04 96',
                'telephone2' => null,
                'whatsapp' => '673 09 39 27',
                'logo' => 'assets/demo-schools/logo_darilm.png',
                'favicon' => 'assets/demo-schools/favicon_dar.png',
                'email' => null,
                'adresse' => 'Etoudi',
                'ville' => 'Yaoundé',
                'pays' => 'Cameroun',
                'theme' => 'daroul_ilm',
                'couleurPrincipale' => '#0F5C45',
                'couleurSecondaire' => '#DDEFE7',
                'couleurAccent' => '#C79A3B',
                'active' => true,
                'heroTitle' => 'Apprentissage du Coran et des sciences islamiques',
                'heroSubtitle' => 'Des cours accessibles en ligne et en présentiel, en français, haoussa et foulfouldé.',
                'aboutTitle' => 'Une madrassa structurée pour apprendre avec méthode',
                'aboutText' => 'Daroul-Ilm propose des cours en ligne via WhatsApp et un accompagnement présentiel personnalisé pour l’apprentissage du Coran et des sciences islamiques.',
                'ctaTitle' => 'Rejoindre Daroul-Ilm',
                'ctaText' => 'Choisissez votre programme, votre langue et commencez votre parcours d’apprentissage.',
                'reglementInterieur' => "1. L’apprenant respecte les horaires, le programme choisi et les consignes de l’enseignant.\n2. Toute absence ou difficulté doit être signalée à l’administration dès que possible.\n3. Les paiements et engagements administratifs doivent être respectés selon les modalités communiquées.\n4. Les groupes WhatsApp servent uniquement au suivi pédagogique et administratif.",
            ],
            [
                'nom' => 'Madrassa Sahaba',
                'slug' => 'sahaba',
                'sousDomaine' => 'sahaba',
                'domainAliases' => [],
                'prefixeMatricule' => 'SAH',
                'description' => 'Madrassa Sahaba accompagne les apprenants dans la lecture correcte du Qur’an, sa mémorisation progressive et l’apprentissage des textes religieux, notamment les Mutun Talibil Ilm.',
                'slogan' => 'Lecture, mémorisation du Qur’an et apprentissage des textes religieux',
                'telephone1' => '694137081',
                'telephone2' => '696946642',
                'whatsapp' => '655998725',
                'logo' => 'assets/demo-schools/logo_sahaba.png',
                'favicon' => 'assets/demo-schools/favicon_sahaba.png',
                'heroImage' => 'assets/demo-schools/hero_sahaba.webp',
                'presentationImage1' => 'assets/demo-schools/sahaba_presentation_1.webp',
                'presentationImage2' => 'assets/demo-schools/sahaba_presentation_2.webp',
                'email' => null,
                'adresse' => null,
                'ville' => 'Yaoundé',
                'pays' => 'Cameroun',
                'theme' => 'sahaba',
                'couleurPrincipale' => '#123D2E',
                'couleurSecondaire' => '#F3E8D0',
                'couleurAccent' => '#C89B3C',
                'active' => true,
                'heroTitle' => 'Madrassa Sahaba',
                'heroSubtitle' => 'Lecture du Qur’an, mémorisation et apprentissage des Mutun Talibil Ilm, avec attestation de fin de parcours.',
                'aboutTitle' => 'Une madrassa structurée pour progresser avec sérieux',
                'aboutText' => 'Le programme de Madrassa Sahaba vise à accompagner les apprenants dans la lecture du Qur’an, la mémorisation progressive, le perfectionnement du tajwid et l’apprentissage des textes religieux, notamment les Mutun Talibil Ilm.',
                'ctaTitle' => 'S’inscrire à Madrassa Sahaba',
                'ctaText' => 'Les inscriptions sont ouvertes du dimanche 10 mai 2026 au samedi 06 juin 2026. Les cours débutent le samedi 13 juin 2026, avec un premier week-end dédié à l’évaluation des niveaux.',
                'reglementInterieur' => "1. L’apprenant respecte les horaires de cours, les convocations administratives et l’évaluation initiale organisée au début du parcours.\n2. L’assiduité, la ponctualité et la régularité dans les révisions sont attendues pour progresser sérieusement.\n3. Le respect des enseignants, des responsables et des autres apprenants est obligatoire.\n4. Toute absence ou difficulté doit être signalée rapidement à l’administration.\n5. L’affectation finale dépend du niveau observé lors de l’évaluation initiale.",
            ],
        ];
    }

    /**
     * @return list<array{nom: string, email: string, telephone: string, roles: list<string>, ecole: ?string}>
     */
    private function users(): array
    {
        return [
            [
                'nom' => 'Super Admin SALSABIL',
                'email' => 'superadmin@salsabilmadrassas.local',
                'telephone' => '690000001',
                'roles' => ['ROLE_SUPER_ADMIN'],
                'ecole' => null,
            ],
            [
                'nom' => 'Admin Qamar',
                'email' => 'adminqamar@salsabilmadrassas.local',
                'telephone' => '690000002',
                'roles' => ['ROLE_ECOLE_ADMIN'],
                'ecole' => 'qamar',
            ],
            [
                'nom' => 'Admin Daroul-Ilm',
                'email' => 'admindaroulilm@salsabilmadrassas.local',
                'telephone' => '690000003',
                'roles' => ['ROLE_ECOLE_ADMIN'],
                'ecole' => 'daroul-ilm',
            ],
            [
                'nom' => 'Admin Sahaba',
                'email' => 'adminsahaba@salsabilmadrassas.local',
                'telephone' => '690000004',
                'roles' => ['ROLE_ECOLE_ADMIN'],
                'ecole' => 'sahaba',
            ],
        ];
    }

    /**
     * @param list<string> $aliases
     */
    private function syncTenantDomains(Ecole $ecole, string $subdomain, array $aliases): void
    {
        $canonicalHost = TenantDomain::normalizeHost(sprintf('%s.salsabil.cm', $subdomain));
        $wantedAliases = [];

        foreach ($aliases as $alias) {
            $host = TenantDomain::normalizeHost($alias);
            if ($host !== '' && $host !== $canonicalHost) {
                $wantedAliases[$host] = $host;
            }
        }

        $canonicalDomain = null;
        $existingAliases = [];

        foreach ($ecole->getTenantDomains() as $tenantDomain) {
            if ($tenantDomain->isCanonical()) {
                $tenantDomain->setCanonical(false);
                $canonicalDomain ??= $tenantDomain;
            }

            $host = $tenantDomain->getHost();
            if ($host !== null) {
                $existingAliases[$host] = $tenantDomain;
            }
        }

        $canonicalDomain = $existingAliases[$canonicalHost] ?? $canonicalDomain ?? new TenantDomain();
        $canonicalDomain
            ->setHost($canonicalHost)
            ->setCanonical(true)
            ->setActive(true);
        $ecole->addTenantDomain($canonicalDomain);

        foreach ($wantedAliases as $alias) {
            $tenantDomain = $existingAliases[$alias] ?? new TenantDomain();
            $tenantDomain
                ->setHost($alias)
                ->setCanonical(false)
                ->setActive(true);
            $ecole->addTenantDomain($tenantDomain);
        }
    }
}
