<?php

namespace OfficeBrain\Bundle\UserBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Translation\Translator;
use Nelmio\ApiDocBundle\Annotation\ApiDoc;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use OfficeBrain\Bundle\CoreBundle\CustomeHandler as FormErrorManager;
use OfficeBrain\Bundle\UserBundle\Entity\User;
use OfficeBrain\Bundle\UserBundle\Form\UserType;
use OfficeBrain\Bundle\UserBundle\Form\UserPhotoType;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;

/**
 * Mobiel API User.
 *
 * @author Employee Id: 5052
 *
 * Desciption: This is a User controler
 *
 * @param null
 *
 * @return json Response
 *
 * @throws null
 *
 * @Route("/api/v1", defaults={"_format" = "json"})
 */
class ApiUserController extends UserController
{
	const SUCCESS = 'success';
	const ERROR = 'error';
	const SUCCESS_CODE = 1;
	const ERROR_CODE = 0;
    /**
     * @author Employee Id: 5052
     *
     * Create various objects required action in this class
     */
    public function initAction()
    {
        parent::initAction();
        $this->request = $this->getRequest();
        $this->coreManager = $this->get('office_brain_core_manager');
        $this->baseUrl = $this->container->getParameter('base_url');
    }
    /**
     * @author Employee Id: 5052
     *
     * To set member variables default value
     */
    public function __construct()
    {
        parent::__construct();
        $this->coreManager = null;
    }
    /**
     * @author Employee Id: 5052
     *
     *         To unset member variables
     */
    public function __destruct()
    {
        parent::__destruct();
        unset($this->coreManager);
    }
    
    
    /**
     * @author Employee Id: 410175
     * OB eCommerce Product - User Info
     * Function created to get User info
     *
     * @Route("/{_locale}/my-account/view-info",
     * 	name="office_brain_userbundle_user_my_account_view_api")
     *
     * @ApiDoc(
     *      resource=true,
     *      section="User",
     *      description="To Submit User information for edit user account information.",
     *      statusCodes={
     *              1="Returned when success",
     *              403="Returned when the user is not authorized to see this link",
     *              0="Returned when form validation is failed",
     *      },
     *      requirements={             
     *             {"name"="_locale", "dataType"="string",  "default"="en_us"},
     *             {"name"="access_token", "dataType"="string", "required"=true, "description"="valid access token"},
     *             {"name"="instance_id", "dataType"="integer", "required"=true, "description"="valid instance_id"},
     *             {"name"="instance_type", "dataType"="string", "required"=true, "description"="valid instance_type"},
     *      },
     * )
     * @Method({"POST"})
     */
     public function myAccountViewAction()
     {
	     $this->initAction();
	      
	     $userData = $this->userManager->getUserByIdMobileApi();
	     if (isset($userData ['photo']) && $userData ['photo'] != '') {
	     	$userData ['photo_url'] = $this->baseUrl.'/images/uploads/user_photo/'.$userData ['photo'];
	     }
	    
	     return array(
		     'status' => SELF::SUCCESS,
		     'status_code' => SELF::SUCCESS_CODE,
		     'response_data' => $userData,
	     );
     }
    
     /**
      * @author Employee Id: 410175
      * OB eCommerce Product - Upload Photo
      * Function created to upload user photo via mobile
      *
      * @Route("/{_locale}/my-account/edit-photo",	name="office_brain_userbundle_user_my_account_edit_photo_api")
      *
      * @ApiDoc(
      *      resource=true,
      *      section="User",
      *      description="To Upload user photo.",
      *      statusCodes={
      *              1="Returned when success",
      *              403="Returned when the user is not authorized to see this link",
      *              0="Returned when form validation is failed",
      *      },
      *      input = {
      *      	"class" = "\OfficeBrain\Bundle\UserBundle\Form\UserPhotoType",
      *      },
      *      requirements={      
      *             {"name"="_locale", "dataType"="string",  "default"="en_us"},
      *             {"name"="access_token", "dataType"="string", "required"=true, "description"="valid access token"},
      *             {"name"="instance_id", "dataType"="integer", "required"=true, "description"="valid instance_id"},
      *             {"name"="instance_type", "dataType"="string", "required"=true, "description"="valid instance_type"},
      *
      *      },
      * )
      *
      * @Method({"POST"})
      * @Template()
      */
      public function myAccountEditPhotoAction()
      {     
      	$data = parent::myAccountEditPhotoAction();
      	
      	if( isset( $data ['success'] ) && $data ['success'] != '' ){
      		return array (
      				'status' => SELF::SUCCESS,
      				'status_code' => SELF::SUCCESS_CODE,
      				'data' => array('userPhoto'=>$data ['userPhoto'] )
      		);
      	}else {
      		return array (
      				'status' => SELF::ERROR,
      				'status_code' => SELF::ERROR_CODE,
      				'message' => (isset($data ['error'])?$data ['error']:'error')
      		);      		
      	}	   
      }
     
     
    /**
     * @author Employee Id: 5052
     * OB eCommerce Product - Login
     * Function created to save edit info
     *
     * @Route("/{_locale}/my-account/edit-info",
     * 	name="office_brain_userbundle_user_my_account_edit_post_api",
     *  options={"expose"=true}
     * )
     * *@ApiDoc(
     *      resource=true,
     *      section="User",
     *      description="To Submit User information for edit user account information.",
     *      input = {
     *      	"class" = "\OfficeBrain\Bundle\UserBundle\Form\ApiUserTypeEdit",
     *      },
     *      statusCodes={
     *              1="Returned when success",
     *              403="Returned when the user is not authorized to see this link",
     *              0="Returned when form validation is failed",
     *      },
     *      requirements={
     *             {"name"="_locale", "dataType"="string",  "default"="en_us"},
     *             {"name"="access_token", "dataType"="string", "required"=true, "description"="valid access token"},
     *             {"name"="instance_id", "dataType"="integer", "required"=true, "description"="valid instance_id"},
     *             {"name"="instance_type", "dataType"="string", "required"=true, "description"="valid instance_type"},
     *      },  
     * )
     * @Method({"POST"})
     */
    public function myAccountEditPostAction()
    {
        $this->initAction();
     
        $user = $this->projectUserSetting ['user_data'];
		$userOldStatus = $user->getStatus();
        $userType = $user->getUserType();
        $signUpFormFields = $this->signUpManager->getsignUpFormData($userType);

        $userTypeObj = new UserType($this->coreManager, $signUpFormFields, 'main_edit');
        $isIndividual = $user->getIsIndividual();
              
        $form = $this->createForm($userTypeObj, $user);

        $form->handleRequest($this->request);

        $form_photo = $this->createForm(new UserPhotoType(), $user);

        $form->getData()->setStatus($userOldStatus); // set default status as it is updating during  
        $form->getData()->setIsIndividual($isIndividual); // for admin issue
        $userStatus = $this->userManager->editUser($form);

        if ($userStatus) {
            $erpIntegration = $this->projectSetting ['configuration_rule'] ['erp_integration'];
            $isIndividual = $userStatus->getIsIndividual();
            $erpFlag = true;
            $userStatusType = $userStatus->getUserType();
            if (($userStatusType == 'end_user' && $this->projectSetting ['instance_type'] == 'supplier') || ($isIndividual == true && $this->projectSetting ['instance_type'] == 'supplier')) {
                $erpFlag = false;
            }
            if ($erpIntegration && $erpIntegration ['userManagement'] == 1 && !empty($this->queueApiManager) && $userStatus->getErpId() > 0 && $erpFlag == true) {
                $this->queueApiManager->mapQueue('update', $userStatus);
            }
            
            return array (
            		'status' => SELF::SUCCESS,
            		'status_code' => SELF::SUCCESS_CODE,
            		'message' => $this->translator->trans('user.my_account_edit.success_msg'),
            );
        }

        $aryErrors = $this->formErrorManager->prepareErrorArray($this->get('validator')->validate($form));
		if (count($aryErrors) <= 0) {
			foreach ($form->getErrors(true) as $key => $error) {
				$aryErrors ['other_error'] = $error->getMessage();
				break;
			}
		}else{
			foreach ($aryErrors as $errorField=>$errorMsg){
				if($errorField == ""){
					unset($aryErrors[""]);
					$aryErrors['other_error'] = $errorMsg;
					break;
				}
			}
		}		
		
       return array(
				'status' => SELF::ERROR,
				'status_code' => SELF::ERROR_CODE,
				'message' => $aryErrors ,
		);	
    }

}
