<?php declare(strict_types=1);

namespace App\Engine\Page;

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

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

    public function list(
        \App\Engine\Page\PageRepository                                                $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.page");
        return $this->createList($repository);
    }

    public function edit(
        \App\Engine\Page\PageRepository                    $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()) {
            if ($this->proccessRecordUrl(translator: $translator, page: $record)) {
                $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);
    }

    private function createEditForm(\Symfony\Contracts\Translation\TranslatorInterface $translator, ?Page $page = null): \Symfony\Component\Form\FormInterface
    {
        return $this->createFormBuilder($page, ["attr" => ["class" => "row"]])
            ->add("id", \Symfony\Component\Form\Extension\Core\Type\TextType::class, [
                "label" => $translator->trans("admin.page.id"),
                "disabled" => true,
            ])
            ->add("title", \Symfony\Component\Form\Extension\Core\Type\TextType::class, [
                "row_attr" => ["class" => "col-md-6 mb-3"],
                "label" => $translator->trans("admin.page.title"),
                "required" => true,
            ])
            ->add("url", \Symfony\Component\Form\Extension\Core\Type\TextType::class, [
                "row_attr" => ["class" => "col-md-6 mb-3"],
                "label" => $translator->trans("admin.page.url"),
                "help" => $translator->trans("admin.page.url-help"),
                "required" => false,
            ])
            ->add("enabled", \Symfony\Component\Form\Extension\Core\Type\CheckboxType::class, [
                "row_attr" => ["class" => "col-md-6 mb-3"],
                "label" => $translator->trans("admin.page.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.page.text"),
                "required" => false,
            ])
            ->add("metaTitle", \Symfony\Component\Form\Extension\Core\Type\TextType::class, [
                "row_attr" => ["class" => "col-md-6 mb-3"],
                "label" => $translator->trans("admin.page.meta-title"),
                "required" => false,
            ])
            ->add("metaShouldIndex", \Symfony\Component\Form\Extension\Core\Type\CheckboxType::class, [
                "row_attr" => ["class" => "col-md-6 mb-3"],
                "label" => $translator->trans("admin.page.meta-should-index"),
                "required" => false,
            ])
            ->add("metaDescription", \Symfony\Component\Form\Extension\Core\Type\TextareaType::class, [
                "row_attr" => ["class" => "mb-3"],
                "label" => $translator->trans("admin.page.meta-description"),
                "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, Page $page): bool
    {
        if ($page->getUrl()) {
            return false; // URL je nastavená, takže neaktualizujeme
        }

        $newUrl = \App\Engine\Utills\StringHelpers::urlize($page->getTitle());
        $page->setUrl($newUrl);
        $this->addFlash('info', $translator->trans("admin.page.automatically-generated-url", ['{{url}}' => $newUrl]));
        return true;
    }

    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 Page();
        $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, page: $record);
            $entityManager->persist($record);
            $entityManager->flush();
            $this->addFlash("success", $translator->trans("admin.action.new.successfully-created"));
            return $this->redirectToRoute("AdminPageList");
        }

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

    public function delete(
        \App\Engine\Page\PageRepository                    $repository,
        \Doctrine\ORM\EntityManagerInterface               $entityManager,
        \Symfony\Contracts\Translation\TranslatorInterface $translator,
        \Symfony\Component\HttpFoundation\Request          $request,
    ) {
        $redirectRoute = "AdminPageList";
        $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
        );
    }

}
