<?php

namespace OfficeBrain\Bundle\OauthBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Security\Core\SecurityContext;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Nelmio\ApiDocBundle\Annotation\ApiDoc;



class SecurityController extends Controller
{
    public function loginAction(Request $request)
    {
        $session = $request->getSession();

        if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
            $error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
        } elseif (null !== $session && $session->has(SecurityContext::AUTHENTICATION_ERROR)) {
            $error = $session->get(SecurityContext::AUTHENTICATION_ERROR);
            $session->remove(SecurityContext::AUTHENTICATION_ERROR);
        } else {
            $error = '';
        }

        if ($error) {
            $error = $error->getMessage();
            // WARNING! Symfony source code identifies this line as a potential 
            // security threat.                    
        }

        $lastUsername = (null === $session) ? '' : $session->get(SecurityContext::LAST_USERNAME);

        return $this->render('OfficeBrainUserBundle:Login:login.html.twig', array(
                'last_username' => $lastUsername,
                'error' => $error));
    }

    public function loginCheckAction(Request $request)
    {

    }
    
    /**
     * Logout action
     *
     * @Route("/api/v1/api-logout", name="officebrain_api_server_auth_logout")
     * @Method({"POST"})
     * @ApiDoc(
     *  resource=false,
     *  section=" Authentication",
     *  description="Logout from mobile api ",
     *  parameters={
     *      {"name"="access_token", "dataType"="string", "required"=true, "description"="valid access token"},
     *      {"name"="refresh_token", "dataType"="string", "required"=true, "description"="valid refresh token"},
     *      {"name"="reference_access_token", "dataType"="string", "required"=true, "description"="valid access token. value will be same as access_token"}
     *  },
     *  statusCodes={
     *      200="Returned when logout successful",
     *      403="Returned when the user is not authorized to logout",
     *   }
     * )
     *
     * @return JsonResponse
     */
    public function logoutAction(Request $request)
    {
       
        $accessToken = $request->get('reference_access_token', null);
        $refreshToken = $request->get('refresh_token', null);

        $returnArray = array('status' => 'error', 'status_code' => 0);

        $isPassed = true;
        if ($accessToken == null || $refreshToken == null) {

            $returnArray['message'] = 'access_token or refresh_token are missing.';
            $isPassed = false;
        }

        if ($isPassed) {

            $refreshTokenManager = $this->get('fos_oauth_server.refresh_token_manager');
            $refreshTokenTokenObj = $refreshTokenManager->findTokenBy(array(
                    'token' => $refreshToken));

            $tokenManager = $this->get('fos_oauth_server.access_token_manager');
            $accessTokenObj = $tokenManager->findTokenBy(array(
                    'token' => $accessToken));

            if ($refreshTokenTokenObj) {
                $refreshTokenManager->deleteToken($refreshTokenTokenObj);
            }

            if ($accessTokenObj) {
                $tokenManager->deleteToken($accessTokenObj);
            }

            $returnArray['status'] = 'success';
            $returnArray['status_code'] = '1';
            $returnArray['message']   = 'Logout sucessfully.';

            return $returnArray;
            //return JsonResponse::create($returnArray, 200);
        }
		return $returnArray;
       // return JsonResponse::create($returnArray, 400);
    }
}
