<?php declare(strict_types=1);

namespace App\Engine\Settings;

readonly class SettingsManager
{

    public function __construct(
        private \App\Engine\Settings\Sections\Contact\GeneralContactsSettingsSection   $generalContactsSettingsSection,
        private \App\Engine\Settings\Sections\Content\HomeHeroSettingsSection          $homeHeroSettingsSection,
        private \App\Engine\Settings\Sections\Content\HomeStatisticsSettingsSection    $homeStatisticsSettingsSection,
        private \App\Engine\Settings\Sections\Content\HomeAboutUsSettingsSection       $aboutUsSettingsSection,
        private \App\Engine\Settings\Sections\Content\HomeStaticBannersSettingsSection $staticBannersSettingsSection,
        private \App\Engine\Settings\Sections\SEO\GeneralMetadataSettingsSection       $generalMetadataSettingsSection,
        private \Symfony\Contracts\Translation\TranslatorInterface                     $translator,
    ) {
    }

    /**
     * @return \App\Engine\Inertia\Admin\ViewModels\SettingsSectionViewModel[]
     */
    public function createAndHandleSections(): array
    {
        $sections = [
            $this->createSection($this->generalContactsSettingsSection),
            $this->createSection($this->homeHeroSettingsSection),
            $this->createSection($this->homeStatisticsSettingsSection),
            $this->createSection($this->aboutUsSettingsSection),
            $this->createSection($this->staticBannersSettingsSection),
            $this->createSection($this->generalMetadataSettingsSection),
        ];

        usort($sections, fn(\App\Engine\Inertia\Admin\ViewModels\SettingsSectionViewModel $a, \App\Engine\Inertia\Admin\ViewModels\SettingsSectionViewModel $b) => $a->priority <=> $b->priority);
        return $sections;
    }

    /**
     * @return array<string, string>
     */
    public function getGroups(): array
    {
        $groups = [];
        $isFirst = true;
        foreach (Groups::cases() as $case) {
            $group = new \App\Engine\Inertia\Admin\ViewModels\SettingsGroupViewModel();
            $group->name = $this->translator->trans("admin.settings.groups." . $case->value);
            $group->key = $case->value;
            $group->isActive = $isFirst;
            $groups[] = $group;
            $isFirst = false;
        }


        return $groups;
    }

    private function createSection(\App\Engine\Settings\Sections\SettingsSection $settingsSection): \App\Engine\Inertia\Admin\ViewModels\SettingsSectionViewModel
    {
        $section = new \App\Engine\Inertia\Admin\ViewModels\SettingsSectionViewModel();
        $section->title = $settingsSection->getTitle();
        $section->group = $settingsSection->getGroup()->value;
        $section->priority = $settingsSection->getPriority();
        $section->form = $settingsSection->handleForm();

        return $section;
    }


}