<?php 
 
namespace App\Controller; 
 
use App\Entity\Child; 
use App\Entity\PaidCourseList; 
use App\Entity\PasswordUpdate; 
use App\Entity\SessionOrder; 
use App\Entity\SubscriptionOrder; 
use App\Entity\User; 
use App\Form\AccountType; 
use App\Form\ChildEditType; 
use App\Form\ChildType; 
use App\Form\PasswordUpdateType; 
use App\Form\PasswordUserUpdateType; 
use App\Repository\DiscountRepository; 
use App\Repository\HolidayRepository; 
use App\Repository\PaidCourseListRepository; 
use App\Repository\SessionOrderRepository; 
use App\Repository\SessionRegistrationDateRepository; 
use App\Repository\SubscriptionOrderRepository; 
use App\Repository\TicketOrderRepository; 
use App\Repository\UserPlacementTestRepository; 
use App\Repository\UserRepository; 
use App\Repository\VideoCoursesRegistrationRepository; 
use Doctrine\ORM\EntityManagerInterface; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; 
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; 
use Symfony\Component\Form\FormError; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\Routing\Annotation\Route; 
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface; 
 
/** 
 * Class ProfilController 
 * @Route("/user") 
 * @Security("is_granted('ROLE_USER')") 
 */ 
class ProfilController extends AbstractController 
{ 
    /** 
     * @Route("/dashboard", name="user_dashboard") 
     */ 
    public function index(HolidayRepository $holidayRepository) 
    { 
        $holday = $holidayRepository->findOneBy([ 
            'id' => 1 
        ]); 
 
        $startHoliday = $holday->getStartAt(); 
        $endHoliday = $holday->getEndAt(); 
 
        return $this->render('profil/dashboard.html.twig', [ 
            'user' => $this->getUser(), 
            'startHoliday' => $startHoliday, 
            'endHoliday' => $endHoliday 
        ]); 
    } 
 
    /** 
     * @Route("/thanks", name="confirmation_purchase") 
     * @return Response 
     * @param Request $request 
     * @param UserRepository $userRepository 
     * @param SubscriptionOrderRepository $subscriptionOrderRepository 
     * @param SessionOrderRepository $sessionOrderRepository 
     * @return Response 
     */ 
    public function confirmationPurchase(Request $request, UserRepository $userRepository, SubscriptionOrderRepository $subscriptionOrderRepository, SessionOrderRepository $sessionOrderRepository) 
    { 
        $isTwoTime = false; 
        //Type d'order : subscription, group 
        $orderType = $request->query->get('orderType'); 
 
        $userId = $request->query->get('userId'); 
 
 
        $orderId = $request->query->get('orderId'); 
 
        $user = $userRepository->findOneBy(['id'=> $userId]); 
 
        if ($orderType == "subscription"){ 
 
            /** @var SubscriptionOrder $subscriptionOrder */ 
            $subscriptionOrder = $subscriptionOrderRepository->findOneBy(['id'=> $orderId]); 
 
            if ($subscriptionOrder){ 
                $paidAmount = $subscriptionOrder->getPaidAmount(); 
                $startAt = $subscriptionOrder->getCoursesStartAt(); 
                $category = $subscriptionOrder->getCategory(); 
                $program = $subscriptionOrder->getSubject(); 
                $quantity = $subscriptionOrder->getNbOfScheduleChoose(); 
                $isTwoTime = false; 
            }else{ 
                $paidAmount = null; 
                $startAt = null; 
                $program = null; 
                $category = null; 
                $quantity = null; 
            } 
 
        }elseif ($orderType == "group"){ 
 
            /** @var SessionOrder $sessionOrder */ 
            $sessionOrder = $sessionOrderRepository->findOneBy(['id'=> $orderId]); 
 
            if ($sessionOrder){ 
                $paidAmount = $sessionOrder->getAmountPaid(); 
                $startAt = $sessionOrder->getSession()->getStartDate(); 
                $program = $sessionOrder->getSession()->getLevel()->getSubject(); 
                $category = $sessionOrder->getSession()->getLevel()->getSubject()->getCategory(); 
                $quantity = 1; 
                $isTwoTime = $sessionOrder->getIsTwoTime(); 
            }else{ 
                $paidAmount = null; 
                $startAt = null; 
                $program = null; 
                $category = null; 
                $quantity = null; 
            } 
        }else{ 
            $paidAmount = null; 
            $startAt = null; 
            $program = null; 
            $category = null; 
            $quantity = null; 
 
        } 
 
        return $this->render('profil/thank-you.html.twig', [ 
            'orderId' => $orderId, 
            'paidAmount' => $paidAmount, 
            'program' => $program, 
            'startDate' => $startAt, 
            'category' => $category, 
            'quantity' => $quantity, 
            'orderType' => $orderType, 
            'user' => $user, 
            'isTwoTime' => $isTwoTime 
        ]); 
 
    } 
 
    /** 
     * @Route("/profil", name="user_profil") 
     */ 
    public function profil() 
    { 
        $currentYear = date('Y'); 
        return $this->render('profil/profil.html.twig', [ 
            'user' => $this->getUser(), 
            'currentYear' => $currentYear 
        ]); 
    } 
 
    /** 
     * @Route("/{id}/edit", name="user_profil_edit") 
     */ 
    public function editProfil(User $user, Request $request, EntityManagerInterface $em) 
    { 
        $user = $this->getUser(); 
        $form = $this->createForm(AccountType::class, $user); 
        $form->handleRequest($request); 
        if ($form->isSubmitted() && $form->isValid()) { 
            $em->persist($user); 
            $em->flush(); 
            $this->addFlash( 
                'success', 
                'Les données de votre compte ont été mise à jour avec succès !' 
            ); 
            return $this->redirectToRoute('user_profil'); 
        } 
        return $this->render('profil/edit.html.twig', [ 
            'form' => $form->createView(), 
 
        ]); 
 
    } 
 
    /** 
     * @Route("/password", name="user_password_edit") 
     * @param Request $request 
     * @param UserPasswordEncoderInterface $passwordEncoder 
     * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response 
     */ 
    public function editPassword(Request $request, UserPasswordEncoderInterface $passwordEncoder, EntityManagerInterface $em) 
    { 
 
        $user = $this->getUser(); 
        $form = $this->createForm(PasswordUserUpdateType::class, $user); 
        $form->handleRequest($request); 
 
        if ($form->isSubmitted() && $form->isValid()) { 
 
            $user = $form->getData(); 
 
            $encodedPassword = $passwordEncoder->encodePassword($user, $user->getPassword()); 
            $user->setPassword($encodedPassword); 
 
            $em->persist($user); 
            $em->flush(); 
            $this->addFlash( 
                'success', 
                'Votre mot de passe a été mise à jour avec succès !' 
            ); 
            return $this->redirectToRoute('user_profil'); 
            } 
 
        return $this->render('profil/password.html.twig', [ 
            'form' => $form->createView(), 
        ]); 
    } 
 
    /** 
     * @Route("/child/add", name="user_profil_add_child") 
     * @param Request $request 
     * @param EntityManagerInterface $em 
     * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response 
     */ 
    public function addChild(Request $request, EntityManagerInterface $em) 
    { 
        $child = new Child(); 
        $parent = $this->getUser(); 
 
        $form = $this->createForm(ChildType::class, $child); 
        $form->handleRequest($request); 
 
        if ($form->isSubmitted() && $form->isValid()) { 
 
            $age = $child->getAge(); 
 
            if ($age > 0 and $age < 12) 
            { 
                $child->setIsChild(true) 
                    ->setIsTeen(false) 
                    ->setIsAdult(false) 
                ; 
            }elseif ($age > 11 and $age < 16) 
            { 
                $child->setIsTeen(true) 
                    ->setIsAdult(false) 
                    ->setIsChild(false) 
                ; 
            }else{ 
                $child->setIsTeen(false) 
                    ->setIsAdult(true) 
                    ->setIsChild(false) 
                ; 
            } 
 
 
 
            $child->setParent($parent); 
            $em->persist($child); 
            $em->flush(); 
 
            $this->addFlash('success', 'Le membre a bien été ajouté'); 
 
            return $this->redirectToRoute('user_profil'); 
        } 
 
        return $this->render('profil/add_child.html.twig', [ 
            'form' => $form->createView(), 
        ]); 
 
    } 
 
    /** 
     * @Route("/child/{id}/edit", name="user_profil_edit_child") 
     */ 
    public function editChild(Child $child, Request $request, EntityManagerInterface $em) 
    { 
        $parent = $this->getUser(); 
 
        $form = $this->createForm(ChildEditType::class, $child); 
        $form->handleRequest($request); 
 
        if ($form->isSubmitted() && $form->isValid()) { 
 
            $age = $child->getAge(); 
 
            if ($age > 0 and $age < 12) 
            { 
                $child->setIsChild(true) 
                    ->setIsTeen(false) 
                    ->setIsAdult(false) 
                ; 
            }elseif ($age > 11 and $age < 16) 
            { 
                $child->setIsTeen(true) 
                    ->setIsAdult(false) 
                    ->setIsChild(false) 
                ; 
            }else{ 
                $child->setIsTeen(false) 
                    ->setIsAdult(true) 
                    ->setIsChild(false) 
                ; 
            } 
 
            $child->setParent($parent); 
            $em->persist($child); 
            $em->flush(); 
 
            $this->addFlash('success', 'Les informations du membre '. $child->getFirstName().' ont bien été modifiées'); 
 
            return $this->redirectToRoute('user_profil'); 
        } 
 
        return $this->render('profil/edit_child.html.twig', [ 
            'form' => $form->createView(), 
            'child' => $child, 
        ]); 
 
    } 
 
    /** 
     * @Route("/courses", name="user_courses") 
     * @param SubscriptionOrderRepository $subscriptionOrderRepository 
     * @param SessionOrderRepository $orderRepository 
     * @param VideoCoursesRegistrationRepository $videosCoursesRegistrationRepository 
     * @param TicketOrderRepository $ticketOrderRepository 
     * @return Response 
     */ 
    public function coursesList(SubscriptionOrderRepository $subscriptionOrderRepository, SessionOrderRepository $orderRepository, VideoCoursesRegistrationRepository $videosCoursesRegistrationRepository, TicketOrderRepository $ticketOrderRepository, UserPlacementTestRepository $userPlacementTestRepository, SessionRegistrationDateRepository $sessionRegistrationDateRepository, DiscountRepository $discountRepository) 
    { 
        /** @var User $user */ 
        $user = $this->getUser(); 
 
        $sessionsRegistrationDate = $sessionRegistrationDateRepository->findAll(); 
        $discounts = $discountRepository->findAll(); 
 
        $userTickets = $ticketOrderRepository->getValidTicketsForOneUser($user); 
 
        $cardError = null; 
 
        $activeSubscriptions = $subscriptionOrderRepository->getAllActiveSubscriptionForUser($user); 
 
        $dueSubscriptions = $subscriptionOrderRepository->getAllDueSubscriptionForUser($user); 
 
        /*rajouter dans la vue, la limite : "now"|date("Y/m/d") <  abo.renewBefore|date_modify("+3 day")|date("Y/m/d") 
        */ 
        $canceledSubscriptionsToResubscribe = $subscriptionOrderRepository->getAllSubscriptionToResubscribeForUser($user); 
 
        $videosCourses = $videosCoursesRegistrationRepository->getAllActiveVideoCoursesOrderByUser($user); 
 
 
        $activeGroupCourses = $orderRepository->getAllCurrentOrderSessionForUser($user); 
        $sessionOrderWithNoFuturSessionOrder = $orderRepository->getAllCurrentOrderSessionForUserWithNoFuturOrderForSameProgram($user); 
 
        $userTestsLevel = $userPlacementTestRepository->findBy([ 
            'user' => $user, 
            'isCanceledbyUs' => false 
        ]); 
 
        return $this->render('profil/courses.html.twig', [ 
            'user' => $user, 
            'activeSubscriptions' => $activeSubscriptions, 
            'dueSubscriptions' => $dueSubscriptions, 
            'toRenewSubscriptions' => $canceledSubscriptionsToResubscribe, 
            'activeGroup' => $activeGroupCourses, 
            'videosCourses' => $videosCourses, 
            'errorCard' => $cardError, 
            'stripe_public_key' => $this->getParameter('stripe_public_key'), 
            'tickets' => $userTickets, 
            'userTestsLevel' => $userTestsLevel, 
            'sessionsRegistrationDate' => $sessionsRegistrationDate, 
            'discounts' => $discounts, 
            'sessionOrderWithNoFuturSessionOrder' => $sessionOrderWithNoFuturSessionOrder 
        ]); 
    } 
 
}