<?php declare(strict_types=1);

namespace App\Engine\VisitorsNotification;

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

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

    public function list(
        VisitorsNotificationRepository                                                 $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.visitors-notification");
        return $this->createList($repository);
    }

    public function edit(
        VisitorsNotificationRepository                     $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()) {
            $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 VisitorsNotification();
        $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()) {
            $entityManager->persist($record);
            $entityManager->flush();
            $this->addFlash("success", $translator->trans("admin.action.new.successfully-created"));
            return $this->redirectToRoute("AdminVisitorsNotificationList");
        }

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

    public function delete(
        VisitorsNotificationRepository                     $repository,
        \Doctrine\ORM\EntityManagerInterface               $entityManager,
        \Symfony\Contracts\Translation\TranslatorInterface $translator,
        \Symfony\Component\HttpFoundation\Request          $request,
    ) {
        $redirectRoute = "AdminVisitorsNotificationList";
        $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, ?VisitorsNotification $visitorsNotification = null): \Symfony\Component\Form\FormInterface
    {
        return $this->createFormBuilder($visitorsNotification, ["attr" => ["class" => "row"]])
            ->add("id", \Symfony\Component\Form\Extension\Core\Type\TextType::class, [
                "label" => $translator->trans("admin.visitors-notification.id"),
                "disabled" => true,
            ])
            ->add("title", \Symfony\Component\Form\Extension\Core\Type\TextType::class, [
                "row_attr" => ["class" => "col-md-12 mb-3"],
                "label" => $translator->trans("admin.visitors-notification.title"),
                "required" => true,
            ])
            ->add("priority", \Symfony\Component\Form\Extension\Core\Type\NumberType::class, [
                "row_attr" => ["class" => "col-md-6 mb-3"],
                "label" => $translator->trans("admin.visitors-notification.priority"),
                "required" => false,
            ])
            ->add("enabled", \Symfony\Component\Form\Extension\Core\Type\CheckboxType::class, [
                "row_attr" => ["class" => "col-md-6 mt-4"],
                "label" => $translator->trans("admin.visitors-notification.enabled"),
                "required" => false,
            ])
            ->add("text", \Symfony\Component\Form\Extension\Core\Type\TextareaType::class, [
                "row_attr" => ["class" => "mb-3"],
//                "attr" => ["data-wysiwyg" => true],
                "label" => $translator->trans("admin.visitors-notification.text"),
                "required" => false,
            ])
            ->add("location", \Symfony\Component\Form\Extension\Core\Type\EnumType::class, [
                "class" => LocationEnum::class,
                "row_attr" => ["class" => "col-md-6 mb-3"],
                "label" => $translator->trans("admin.visitors-notification.location"),
                "choice_label" => fn(?LocationEnum $choice) => $translator->trans("admin.visitors-notification.location-values.$choice->value"),
                "help" => $translator->trans("admin.visitors-notification.location-note"),
                "required" => true,
            ])
            ->add("type", \Symfony\Component\Form\Extension\Core\Type\EnumType::class, [
                "class" => TypeEnum::class,
                "row_attr" => ["class" => "col-md-6 mb-3"],
                "label" => $translator->trans("admin.visitors-notification.type"),
                "choice_label" => fn(?TypeEnum $choice) => $translator->trans("admin.visitors-notification.type-values.$choice->value"),
                "required" => true,
            ])
            ->add("submit", \Symfony\Component\Form\Extension\Core\Type\SubmitType::class, [
                "label" => $translator->trans("admin.action.edit.save"),
            ])
            ->getForm();
    }

}
