<?php
namespace App\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use App\Repository\ActivityRepository;
use App\Repository\ActorRepository;
use App\Entity\ActivityEntity;
use App\Entity\ActorEntity;
use App\Form\Activity\ActivityAddForm;
use App\Form\Activity\ActivityDeleteForm;
use App\Form\Activity\ActivityEditForm;
use App\Form\Activity\ActivityFilterForm;

/**
 * Controller for activity related pages
 */
class ActivityController extends AbstractExtendedController
{

    /**
     * Page for the list of activities
     *
     * @param Request $request
     * @return Response
     */
    public function activities(Request $request): Response
    {
        // Get repositories
        $entityManager = $this->getDoctrine()->getManager();
        /** @var ActivityRepository $activityRepository */
        $activityRepository = $entityManager->getRepository(ActivityEntity::class);
        /** @var ActorRepository $actorRepository */
        $actorRepository = $entityManager->getRepository(ActorEntity::class);

        // Get actors
        $actors = $actorRepository->findAll();

        // Activity add form
        /** @var ActivityAddForm $activityAddForm */
        $activityAddForm = $this->createNamedCustomForm('activityAdd', ActivityAddForm::class, [
            'actors' => $actors,
        ]);
        $activityAddForm->handleRequest($request);
        if ($activityAddForm->isSubmitted() && $activityAddForm->isValid()) {
            $errors = $activityAddForm->validate();
            if (empty($errors)) {
                $activity = $activityAddForm->getActivity();
                $entityManager->persist($activity);
                $entityManager->flush();
                return $this->ajaxFormAnswer([
                    'refresh' => true,
                    'reset' => true,
                ]);
            } else {
                return $this->ajaxFormAnswer([
                    'error' => join('<br/>', $errors),
                    'code' => Response::HTTP_BAD_REQUEST,
                ]);
            }
        }

        // Activity delete form
        /** @var ActivityDeleteForm $activityDeleteForm */
        $activityDeleteForm = $this->createNamedCustomForm('activityDelete', ActivityDeleteForm::class);
        $activityDeleteForm->handleRequest($request);
        if ($activityDeleteForm->isSubmitted() && $activityDeleteForm->isValid()) {
            $errors = $activityDeleteForm->validate();
            if (empty($errors)) {
                $activity = $activityDeleteForm->getActivity($activityRepository);
                if (!is_null($activity)) {
                    $entityManager->remove($activity);
                    $entityManager->flush();
                    return $this->ajaxFormAnswer([
                        'refresh' => true,
                    ]);
                } else {
                    return $this->ajaxFormAnswer([
                        'error' => 'Activité non trouvé',
                        'code' => Response::HTTP_BAD_REQUEST,
                    ]);
                }
            } else {
                return $this->ajaxFormAnswer([
                    'error' => join('<br/>', $errors),
                    'code' => Response::HTTP_BAD_REQUEST,
                ]);
            }
        }

        // Filter
        /** @var ActivityFilterForm $activityFilterForm */
        $activityFilterForm = $this->createNamedGetCustomForm('activityFilter', ActivityFilterForm::class, [
            'actors' => $actors,
        ]);
        $activityFilterForm->handleRequest($request);
        $activities = $activityFilterForm->getActivities($activityRepository);

        return $this->render('activity/activities.html.twig', [
            'activities' => $activities,
            'activityFilterForm' => $activityFilterForm,
            'activityDeleteForm' => $activityDeleteForm,
            'activityAddForm' => $activityAddForm,
        ]);
    }

    /**
     * Page for editing activity
     *
     * @param String $id
     * @param Request $request
     * @return Response
     */
    public function activity(string $id, Request $request): Response
    {
        // Get repositories
        $entityManager = $this->getDoctrine()->getManager();
        /** @var ActivityRepository $actorRepository */
        $activityRepository = $entityManager->getRepository(ActivityEntity::class);
        /** @var ActorRepository $actorRepository */
        $actorRepository = $entityManager->getRepository(ActorEntity::class);

        // Get activity
        $activity = $activityRepository->find($id);

        // Activity edit form
        /** @var ActivityEditForm $activityEditForm */
        $activityEditForm = $this->createNamedCustomForm('edit', ActivityEditForm::class, [
            'actors' => $actorRepository->findAll()
        ]);
        $activityEditForm->handleRequest($request);
        if ($activityEditForm->isSubmitted() && $activityEditForm->isValid()) {
            $errors = $activityEditForm->validate();
            $errors = $activityEditForm->validate();
            if (empty($errors)) {
                $activityEditForm->updateActivity($activity);
                $entityManager->persist($activity);
                $entityManager->flush();
                return $this->ajaxFormAnswer([
                    'message' => 'Modification enregistrées',
                    'refresh' => true,
                ]);
            } else {
                return $this->ajaxFormAnswer([
                    'error' => join('<br/>', $errors),
                    'code' => Response::HTTP_BAD_REQUEST,
                ]);
            }
        }

        // Update fields
        $activityEditForm->updateFields($activity);

        return $this->render('activity/activity.html.twig', [
            'activity' => $activity,
            'activityEditForm' => $activityEditForm,
        ]);
    }
}