<?php

namespace OfficeBrain\Bundle\UserBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use OfficeBrain\Bundle\UserBundle\Entity\User;
use OfficeBrain\Bundle\UserBundle\Form\UserType;
use OfficeBrain\Bundle\CoreBundle\CustomeHandler as FormErrorManager;
use Symfony\Component\HttpFoundation\JsonResponse;
use Nelmio\ApiDocBundle\Annotation\ApiDoc;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
/**
 *
 * @author Employee Id: 4273
 * OB eCommerce Product - SignUp
 * - SignUp Process for user
 *
 */
class SignUpController extends Controller
{
    /**
     *
     * @author Employee Id: 4273
     *
     *         To set member variables default value
     *
     * @return NULL
     */
    public function __construct()
    {
        $this->request = null;
        $this->user = null;
        $this->userId = null;
        $this->locale = null;
        $this->cultureId = null;
        $this->session = null;
        $this->sessionManager = null;
        $this->entityManager = null;
        $this->responseArray = array();
        $this->projectSetting = null;
        $this->queueApiManager = null;
    }

    /**
     *
     * @author Employee Id: 4273
     *
     *         To unset member variables
     *
     * @return NULL
     */
    public function __destruct()
    {
        unset($this->user);
        unset($this->userId);
        unset($this->locale);
        unset($this->session);
        unset($this->request);
        unset($this->cultureId);
        unset($this->responseArray);
        unset($this->entityManager);
        unset($this->sessionManager);
        unset($this->projectSetting);
        unset($this->queueApiManager);
    }

    /**
     *
     * @author Employee Id: 4273
     *
     *         Create various objects required action in this class
     *
     * @return NULL
     */
    public function initAction()
    {
        $this->request = $this->getRequest();
        $this->translator = $this->get('translator');
        $this->projectSetting = $this->request->get('project_setting');
        $this->signUpConfigrations = $this->projectSetting['configuration_rule']['user']['sign_up'];
        //echo '<pre>';print_r($this->signUpConfigrations); die;
        $this->userId = $this->projectSetting['user_id'];

        $this->coreManager = $this->get('office_brain_core_manager');
        $this->signUpManager = $this->get('office_brain_user_sign_up_manager');
        $this->loginManager = $this->get('office_brain_user_login_manager');
        $this->userManager = $this->get('office_brain_user_manager');
        $this->formErrorManager = new FormErrorManager\JsonError();
        if ($this->has('office_brain_queue_api_manager')) {
            $this->request->attributes->set('object', 'User');
            $this->queueApiManager = $this->get('office_brain_queue_api_manager');
        }
    }

    /**
     * @author Employee Id: 4273
     * OB eCommerce Product - SignUp
     * Function created to show sign up form
     *
     * @Route("/{_locale}/register",
     * 	name="office_brain_userbundle_sign_up_register",
     *  options={"expose"=true}
     * )
     * @Method({"GET"})
     * @Template("OfficeBrainCustomBundleUserBundle:SignUp:register.html.twig")
     */

    public function registerAction()
    {
        $this->initAction();
        $data = array();
        
        if($this->userId!=0){
        	return $this->redirect ( $this->generateUrl ( 'office_brain_page_homepage_view' ) );
        }
        
        $userType = 'distributor';
        $signUpFormFields = $this->signUpManager->getsignUpFormData($userType);
        
        $user = new User();
        $userTypeObj = new UserType($this->coreManager, $signUpFormFields, 'main_register');
        
        $form = $this->createForm($userTypeObj, $user);
        $form->handleRequest($this->request);
        
        $data['form_user'] = $form->createView();
        $data['userType'] = $userType;
        $data['form_fields'] = $signUpFormFields;
        $data['states'] = $this->coreManager->getStateData();
        $data['distributors'] = array();
//         $data['distributors'] = $this->userManager->getDistributors();
        
        return $data;
    }



    /**
     * @author Employee Id: 4273
     * OB eCommerce Product - SignUp
     * Function created to show sign up form
     *
     * @Route("/{_locale}/user-registration",
     * 	name="office_brain_userbundle_sign_up_user_registration",
     *  options={"expose"=true}
     * )
     * @Method({"GET"})
     * @Template("OfficeBrainUserBundle:SignUp:register.html.twig")
     */

    public function registerUserAction()
    {
        $this->initAction();


        $data = array();

        $userType = 'end_user';
        $signUpFormFields = $this->signUpManager->getsignUpFormData($userType);

        $user = new User();
        $userTypeObj = new UserType($this->coreManager, $signUpFormFields, 'main_register');

        $form = $this->createForm($userTypeObj, $user);
        $form->handleRequest($this->request);

        $data['form_user'] = $form->createView();
        $data['userType'] = $userType;
        $data['form_fields'] = $signUpFormFields;
        $data['states'] = $this->coreManager->getStateData();
        $data['distributors'] = $this->userManager->getDistributors();

        return $data;
    }


    /**
     * @author Employee Id: 4273
     * OB eCommerce Product - SignUp
     * Function created to show sign up form
     *
     * @Route("/{_locale}/supplier-registration",
     * 	name="office_brain_userbundle_sign_up_supplier_registration",
     *  options={"expose"=true}
     * )
     * @Method({"GET"})
     * @Template("OfficeBrainUserBundle:SignUp:register.html.twig")
     */

    public function supplierRegistrationAction()
    {
        $this->initAction();
        $data = array();

        $userType = 'supplier';
        $signUpFormFields = $this->signUpManager->getsignUpFormData($userType);

        $user = new User();
        $userTypeObj = new UserType($this->coreManager, $signUpFormFields, 'main_register');

        $form = $this->createForm($userTypeObj, $user);
        $form->handleRequest($this->request);

        $data['form_user'] = $form->createView();
        $data['userType'] = $userType;
        $data['form_fields'] = $signUpFormFields;
        $data['states'] = $this->coreManager->getStateData();
        $data['distributors'] = $this->userManager->getDistributors();

        return $data;
    }


    /**
     * @author Employee Id: 4273
     * OB eCommerce Product - SignUp
     * Function created to show sign up form
     *
     * @Route("/{_locale}/distributor-registration",
     * 	name="office_brain_userbundle_sign_up_distributor_registration",
     *  options={"expose"=true}
     * )
     * @Method({"GET"})
     * @Template("OfficeBrainUserBundle:SignUp:register.html.twig")
     */

    public function distributorRegistrationAction()
    {
        
        $this->initAction();
        $data = array();

        $userType = 'distributor';
        $signUpFormFields = $this->signUpManager->getsignUpFormData($userType);

        $user = new User();
        $userTypeObj = new UserType($this->coreManager, $signUpFormFields, 'main_register');

        $form = $this->createForm($userTypeObj, $user);
        $form->handleRequest($this->request);

        $data['form_user'] = $form->createView();
        $data['userType'] = $userType;
        $data['form_fields'] = $signUpFormFields;
        $data['states'] = $this->coreManager->getStateData();
        $data['distributors'] = $this->userManager->getDistributors();

        return $data;
    }

    /**
     * @author Employee Id: 4273
     * OB eCommerce Product - SignUp
     * Function created to validate sign up form
     *
     * @Route("/{_locale}/register",
     * 	name="office_brain_userbundle_sign_up_register_post",
     *  options={"expose"=true}
     * )
     *
     * @Method({"POST"})
     * @Template("OfficeBrainUserBundle:SignUp:register.html.twig")
     */

    public function registerPostAction()
    {
        $this->initAction();
        $data = array();

        $format = $this->request->get('_format', 'html') ;

        $userType = $this->request->get('userType', 'supplier');
        $signUpFormFields = $this->signUpManager->getsignUpFormData($userType);

        $user = new User();
        $userTypeObj = new UserType($this->coreManager, $signUpFormFields, 'main_register');


        $form = $this->createForm($userTypeObj, $user);
        $form->handleRequest($this->request);

        $userStatus = $this->signUpManager->registerUser($form);

        if ($userStatus) {
            $erp_flag = TRUE;
            $user_type = $userStatus->getUserType();
            $is_individual = $userStatus->getIsIndividual();
            if (($user_type == 'end_user' && $this->projectSetting['instance_type'] == 'supplier') || ($is_individual == TRUE && $this->projectSetting['instance_type'] == 'supplier')) {
                $erp_flag = FALSE;
            }
	    if ($erp_flag == TRUE && $user_type != 'end_user' && empty($userStatus->getUserCompany())) {
                $erp_flag = FALSE;
            }
            $erpIntegration = $this->projectSetting['configuration_rule']['erp_integration'];
            if ($erpIntegration && $erpIntegration['userManagement'] == 1 && !empty($this->queueApiManager) && ($userStatus->getStatus()=="active" || $userStatus->getStatus()=="inactive") && $erp_flag == TRUE) {
                $this->queueApiManager->mapQueue("create", $userStatus);
            }

            //if ($this->request->get('billing_address')) {
                //$billingArray['id'] = 1; $billingArray['default'] = $this->request->get('billing_address',null);
                $billingAddressId = 1;
                $billingAddress = $this->signUpManager->addAddress($user, $billingAddressId);
                if ($erpIntegration && $erpIntegration['userManagement'] == 1 && !empty($this->queueApiManager) && ($userStatus->getStatus()=="active" || $userStatus->getStatus()=="inactive") && $erp_flag == TRUE) {
                    $this->request->attributes->set('object', 'ContactBook');
                    $this->queueApiManager->mapQueue("create", $billingAddress);
                }
            //}
            //if ($this->request->get('shipping_address')) {
                //$shippingArray['id'] = 2;$shippingArray['default'] = $this->request->get('shipping_address',null);
                $shippingAddressId = 2;
                $shippingAddress = $this->signUpManager->addAddress($user, $shippingAddressId);
                if ($erpIntegration && $erpIntegration['userManagement'] == 1 && !empty($this->queueApiManager) && ($userStatus->getStatus()=="active" || $userStatus->getStatus()=="inactive") && $erp_flag == TRUE) {
                    $this->request->attributes->set('object', 'ContactBook');
                    $this->queueApiManager->mapQueue("create", $shippingAddress);
                }
            //}

            $this->signUpManager->sendEmail($form, $this->translator->trans('user.register.mail.subject'));

            if ($signUpFormFields['approval_configuration']['is_auto_approve']->option->approval_email==1) {
                $this->get('session')->getFlashBag()->set('success_message', $this->translator->trans('user.register.success'));
            } else {
                $this->get('session')->getFlashBag()->set('success_message', $this->translator->trans('user.register.success'));
            }
            if ($this->signUpConfigrations['option']['allow_login_after_signup']==1) {
                $this->loginManager->doLogin($form);

                return $this->redirect($this->generateUrl($this->projectSetting['configuration_rule']['user']['login']['option']['after_login_url']));
            } else {

                return $this->redirect($this->generateUrl('office_brain_page_homepage_view'));
            }
        }

        $data['form_user'] = $form->createView();
        $data['userType'] = $userType;
        $data['form_fields'] = $signUpFormFields;
        $data['states'] = $this->coreManager->getStateData();
        $data['distributors'] = array();
//         $data['distributors'] = $this->userManager->getDistributors();

        if ($this->request->isXmlHttpRequest()) {
            if ($this->request->get('call_type')=='country_code' || $this->request->get('call_type')=='state_code') {
                return $data;
            } else {
                $errors = array(
                        'form_name' => $form->getName(),
                        'form_status' => 'error',
                        'form_errors' => $this->formErrorManager->prepareErrorArray($this->get('validator')->validate($form))
                );
                return new JsonResponse($errors);
            }
        }

        return $data;
    }


    /**
     * @author Employee Id: 4273
     * OB eCommerce Product - SignUp
     * Function created to Aprrove sign up
     *
     * @Route("/{_locale}/approve/{confirmation_token}",
     * 	name="office_brain_userbundle_sign_up_approve_register",
     *  options={"expose"=true}
     * )
     * @Method({"GET"})
     * @Template()
     */
    public function aprroveRegisterAction($confirmation_token)
    {
        $this->initAction();
        $data = array();
        $user = $this->userManager->getUserByConfirmationToken($confirmation_token);

        if ($user) {
            $status = $this->signUpManager->approveUserByConfirmationToken($user);
            if ($this->request->isXmlHttpRequest()) {
                $data['success'] = $this->translator->trans('user.register.approve');
                return new JsonResponse($data);
            } else {
                $this->get('session')->getFlashBag()->set('success_message', $this->translator->trans('user.register.approve'));
            }
        } else {
            if ($this->request->isXmlHttpRequest()) {
                $data['error'] = $this->translator->trans('user.register.already_approve');
                return new JsonResponse($data);
            } else {
                $this->get('session')->getFlashBag()->set('error_message', $this->translator->trans('user.register.already_approve'));
            }
        }

        return $this->redirect($this->generateUrl('office_brain_page_homepage_view'));
    }
}
