<?php declare(strict_types=1);

namespace App\Engine\Literature;

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

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

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

    public function edit(
        LiteratureRepository                               $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, literature: $record);
            $this->processImageFile($form, fieldName: "image", recordTitle: $record->getTitle(), setImage: fn(string $path) => $record->setImage($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);
    }

    private function createEditForm(\Symfony\Contracts\Translation\TranslatorInterface $translator, ?Literature $literature = null): \Symfony\Component\Form\FormInterface
    {
        return $this->createFormBuilder($literature, ["attr" => ["class" => "row"]])
            ->add("id", \Symfony\Component\Form\Extension\Core\Type\TextType::class, [
                "label" => $translator->trans("admin.literature.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.literature.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.literature.url"),
                "help" => $translator->trans("admin.literature.url-help"),
                "required" => true,
            ])
            ->add("image", \App\Engine\Form\Type\ImageFileType::class, [
                "row_attr" => ["class" => "col-md-6 mb-3"],
                "label" => $translator->trans("admin.literature.image"),
                "uploaded_file_path" => $literature->getImage(),
                "required" => true,
            ])
            ->add("enabled", \Symfony\Component\Form\Extension\Core\Type\CheckboxType::class, [
                "row_attr" => ["class" => "col-md-6 mb-3  pt-4"],
                "label" => $translator->trans("admin.literature.enabled"),
                "required" => false,
            ])
            ->add("text", \Symfony\Component\Form\Extension\Core\Type\TextareaType::class, [
                "row_attr" => ["class" => "mb-3"],
                "label" => $translator->trans("admin.literature.text"),
                "attr" => ["rows" => 5],
                "required" => true,
            ])
            ->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, Literature $literature): bool
    {
        if ($literature->getUrl()) {
            return false; // URL je nastavená, takže neaktualizujeme
        }

        $newUrl = \App\Engine\Utills\StringHelpers::sanitizeUrlAsAbsoulutePath($literature->getTitle());
        $literature->setUrl($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 Literature();
        $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, literature: $record);
            $this->processImageFile($form, fieldName: "image", recordTitle: $record->getTitle(), setImage: fn(string $path) => $record->setImage($path));

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

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

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

}
