<?php

namespace App\Controller;

use App\Entity\User;
use App\Form\ChangePasswordType;
use App\Service\UserService;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Controller\FOSRestController;
use FOS\RestBundle\View\View;
use Lexik\Bundle\JWTAuthenticationBundle\Services\JWTTokenManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

class ChangePasswordController extends FOSRestController
{
    private $userService;
    private $encoder;
    /**
     * @var JWTTokenManagerInterface
     */
    private $JWTManager;

    public function __construct(UserService $userService, UserPasswordEncoderInterface $encoder, JWTTokenManagerInterface $JWTManager)
    {
        $this->userService = $userService;
        $this->encoder = $encoder;
        $this->JWTManager = $JWTManager;
    }

    /**
     * Request password reset.
     *
     * @Rest\Post("/user/password/change")
     *
     * @return View
     */
    public function postChangePassword(Request $request): View
    {
        $form = $this->createForm(ChangePasswordType::class);

        $form->submit($request->request->all());

        if ($form->isSubmitted() && $form->isValid()) {
            /** @var User $user */
            $user = $this->getUser();
            $user->setPlainPassword($form->getData()['newPassword']);
            $user->setPassword($this->encoder->encodePassword($user, $form->getData()['newPassword']));
            $user = $this->userService->saveUser($user);

            $token = $this->JWTManager->create($user);

            return View::create(['token' => $token], Response::HTTP_OK);
        }

        return View::create($form, Response::HTTP_BAD_REQUEST);
    }
}
