<?php declare(strict_types=1);

namespace App\Engine\UpcomingEvent;

class UpcomingEventController extends \App\Engine\Admin\Inertia\BaseInertiaAdminController
{

    public function getId(): string
    {
        return "UpcomingEvent";
    }

    public function list(
        UpcomingEventRepository                                                        $repository,
        \Symfony\Contracts\Translation\TranslatorInterface                             $translator,
        \App\Engine\Admin\Inertia\SystemConfiguration\AdminSystemConfigurationProvider $adminSystemConfigurationProvider,
    ): \Symfony\Component\HttpFoundation\Response {
        $adminSystemConfigurationProvider->getConfiguration()->pageMeta->title = $translator->trans("admin.menu.upcoming-event");
        return $this->createList($repository);
    }

    public function edit(
        UpcomingEventRepository                            $repository,
        \Twig\Environment                                  $twig,
        \Symfony\Component\HttpFoundation\Request          $request,
        \Symfony\Contracts\Translation\TranslatorInterface $translator,
        \Doctrine\ORM\EntityManagerInterface               $entityManager,
    ): \Symfony\Component\HttpFoundation\Response {
        $record = $repository->findOneBy(["id" => $request->attributes->get("id")]);
        $this->adminSystemConfigurationProvider->getConfiguration()->pageMeta->title = $translator->trans("admin.action.list.edit") . ": " . $record->getTitle();
        $edit = new \App\Engine\Inertia\Admin\ViewModels\EditViewModel(
            record: $record,
        );

        $form = $this->createEditForm($translator, $record);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $this->proccessRecordUrl(translator: $translator, upcomingEvent: $record);
            $this->processImageFile($form, fieldName: "coverImage", recordTitle: $record->getTitle(), setImage: fn(string $path) => $record->setCoverImage($path));
            $this->processImageFile($form, fieldName: "mainImage", recordTitle: $record->getTitle(), setImage: fn(string $path) => $record->setMainImage($path));

            $form = $this->createEditForm($translator, $record); // Pokud došlo ke změnám, vygenerujeme nový form s aktuálními daty
            $entityManager->flush();
            $this->addFlash("success", $translator->trans("admin.action.edit.successfully-updated"));
        }

        return $this->createEditResponse($twig, $form, $edit);
    }

    public function new(
        \Twig\Environment                                  $twig,
        \Symfony\Component\HttpFoundation\Request          $request,
        \Symfony\Contracts\Translation\TranslatorInterface $translator,
        \Doctrine\ORM\EntityManagerInterface               $entityManager,
    ): \Symfony\Component\HttpFoundation\Response {
        $record = new UpcomingEvent();
        $this->adminSystemConfigurationProvider->getConfiguration()->pageMeta->title = $translator->trans("admin.action.list.new");
        $edit = new \App\Engine\Inertia\Admin\ViewModels\EditViewModel(
            record: $record,
        );

        $form = $this->createEditForm($translator, $record)
            ->remove("id")
            ->remove("submit")
            ->add("submit", \Symfony\Component\Form\Extension\Core\Type\SubmitType::class, [
                "label" => $translator->trans("admin.action.edit.create"),
            ]);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $this->proccessRecordUrl(translator: $translator, upcomingEvent: $record);
            $this->processImageFile($form, fieldName: "coverImage", recordTitle: $record->getTitle(), setImage: fn(string $path) => $record->setCoverImage($path));
            $this->processImageFile($form, fieldName: "mainImage", recordTitle: $record->getTitle(), setImage: fn(string $path) => $record->setMainImage($path));

            $entityManager->persist($record);
            $entityManager->flush();
            $this->addFlash("success", $translator->trans("admin.action.new.successfully-created"));
            return $this->redirectToRoute("AdminUpcomingEventList");
        }

        return $this->createEditResponse($twig, $form, $edit);
    }

    public function delete(
        UpcomingEventRepository                            $repository,
        \Doctrine\ORM\EntityManagerInterface               $entityManager,
        \Symfony\Contracts\Translation\TranslatorInterface $translator,
        \Symfony\Component\HttpFoundation\Request          $request,
    ): \Symfony\Component\HttpFoundation\RedirectResponse {
        $redirectRoute = "AdminUpcomingEventList";
        $recordId = $request->attributes->get("id");
        $entity = $repository->findOneBy(["id" => $recordId]);
        if (!$entity) {
            $this->addFlash("danger", $translator->trans("admin.action.delete.unable-to-delete-record"));
            return $this->redirectToRoute($redirectRoute);
        }

        return $this->createDelete(
            entity: $entity,
            redirectRoute: $redirectRoute,
            entityManager: $entityManager,
            translator: $translator
        );
    }

    private function createEditForm(\Symfony\Contracts\Translation\TranslatorInterface $translator, ?UpcomingEvent $upcomingEvent = null): \Symfony\Component\Form\FormInterface
    {
        return $this->createFormBuilder($upcomingEvent, ["attr" => ["class" => "row"]])
            ->add("id", \Symfony\Component\Form\Extension\Core\Type\TextType::class, [
                "label" => $translator->trans("admin.upcoming-event.id"),
                "disabled" => true,
            ])
            ->add("type", \Symfony\Component\Form\Extension\Core\Type\EnumType::class, [
                "class" => UpcomingEventType::class,
                "row_attr" => ["class" => "col-md-12 mb-3"],
                "label" => $translator->trans("admin.upcoming-event.type"),
                "choice_label" => fn(?UpcomingEventType $choice) => $translator->trans("admin.upcoming-event.type-values.$choice->value"),
                "required" => true,
            ])
            ->add("title", \Symfony\Component\Form\Extension\Core\Type\TextType::class, [
                "row_attr" => ["class" => "col-md-6 mb-3"],
                "label" => $translator->trans("admin.upcoming-event.title"),
                "required" => true,
            ])
            ->add("urlPart", \Symfony\Component\Form\Extension\Core\Type\TextType::class, [
                "row_attr" => ["class" => "col-md-6 mb-3"],
                "label" => $translator->trans("admin.upcoming-event.url-part"),
                "help" => $translator->trans("admin.upcoming-event.url-part-help"),
                "required" => false,
            ])
            ->add("coverImage", \App\Engine\Form\Type\ImageFileType::class, [
                "row_attr" => ["class" => "col-md-6 mb-3"],
                "label" => $translator->trans("admin.upcoming-event.cover-image"),
                "help" => $translator->trans("admin.upcoming-event.cover-image-help"),
                "uploaded_file_path" => $upcomingEvent->getCoverImage(),
                "required" => true,
            ])
            ->add("mainImage", \App\Engine\Form\Type\ImageFileType::class, [
                "row_attr" => ["class" => "col-md-6 mb-3"],
                "label" => $translator->trans("admin.upcoming-event.main-image"),
                "help" => $translator->trans("admin.upcoming-event.main-image-help"),
                "uploaded_file_path" => $upcomingEvent->getMainImage(),
                "required" => false,
            ])
            ->add("summary", \Symfony\Component\Form\Extension\Core\Type\TextareaType::class, [
                "row_attr" => ["class" => "mb-3"],
                "label" => $translator->trans("admin.upcoming-event.summary"),
                "attr" => ["rows" => 3],
                "required" => true,
            ])
            ->add("rowSummary", \Symfony\Component\Form\Extension\Core\Type\TextareaType::class, [
                "row_attr" => ["class" => "mb-3"],
                "label" => $translator->trans("admin.upcoming-event.row-summary"),
                "attr" => ["rows" => 3],
                "required" => true,
            ])
            ->add("text", \Symfony\Component\Form\Extension\Core\Type\TextareaType::class, [
                "row_attr" => ["class" => "mb-3"],
                "attr" => ["data-wysiwyg" => true],
                "label" => $translator->trans("admin.upcoming-event.text"),
                "required" => true,
            ])
            ->add("display_section_title", \Symfony\Component\Form\Extension\Core\Type\FormType::class, [
                "label" => $translator->trans("admin.upcoming-event.display.section-title"),
                "help" => $translator->trans("admin.upcoming-event.display.section-description"),
                "mapped" => false,
                "row_attr" => ["class" => "FormSectionTitle"],
            ])
            ->add("showOnHp", \Symfony\Component\Form\Extension\Core\Type\CheckboxType::class, [
                "row_attr" => ["class" => "col-md-6 mb-3"],
                "label" => $translator->trans("admin.upcoming-event.display.show-on-hp"),
                "required" => false,
            ])
            ->add("enabled", \Symfony\Component\Form\Extension\Core\Type\CheckboxType::class, [
                "row_attr" => ["class" => "col-md-6 mb-3"],
                "label" => $translator->trans("admin.upcoming-event.display.enabled"),
                "required" => false,
            ])
            ->add("withDetail", \Symfony\Component\Form\Extension\Core\Type\CheckboxType::class, [
                "row_attr" => ["class" => "col-md-6 mb-3"],
                "label" => $translator->trans("admin.upcoming-event.display.with-detail"),
                "required" => false,
            ])
            ->add("publishFrom", \Symfony\Component\Form\Extension\Core\Type\DateTimeType::class, [
                "row_attr" => ["class" => "col-md-6 mb-3"],
                "label" => $translator->trans("admin.upcoming-event.display.publish-from"),
                "help" => $translator->trans("admin.upcoming-event.display.publish-from-help"),
                "required" => false,
            ])
            ->add("publishTo", \Symfony\Component\Form\Extension\Core\Type\DateTimeType::class, [
                "row_attr" => ["class" => "col-md-6 mb-3"],
                "label" => $translator->trans("admin.upcoming-event.display.publish-to"),
                "help" => $translator->trans("admin.upcoming-event.display.publish-to-help"),
                "required" => false,
            ])
            ->add("archiveTo", \Symfony\Component\Form\Extension\Core\Type\DateTimeType::class, [
                "row_attr" => ["class" => "col-md-6 mb-3"],
                "label" => $translator->trans("admin.upcoming-event.display.archive-to"),
                "help" => $translator->trans("admin.upcoming-event.display.archive-to-help"),
                "required" => false,
            ])
            ->add("submit", \Symfony\Component\Form\Extension\Core\Type\SubmitType::class, [
                "label" => $translator->trans("admin.action.edit.save"),
            ])
            ->getForm();
    }

    /**
     * Pokud došlo ke změnám, vrací se true, v opačném případě false.
     */
    private function proccessRecordUrl(\Symfony\Contracts\Translation\TranslatorInterface $translator, UpcomingEvent $upcomingEvent): bool
    {
        if ($upcomingEvent->getUrlPart()) {
            return false; // URL je nastavená, takže neaktualizujeme
        }

        $newUrlPart = \App\Engine\Utills\StringHelpers::sanitizeUrlAsAbsoulutePath($upcomingEvent->getTitle());
        $upcomingEvent->setUrlPart($newUrlPart);
        return true;
    }

}
