<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\Auth\DefaultPasswordHasher;
use Cake\Core\Configure;
use Cake\Http\Client;
use Cake\Routing\Router;
use Cake\I18n\Time;
use Cake\Mailer\Email;
use Cake\Utility\Security;
use Cake\Auth\AbstractPasswordHasher;

class UsersController extends AppController {

    /**
     * 
     * Function initialize make for automatically trigger when contructure
     */
    public function initialize() {
        parent::initialize();
        // $this->Auth->allow(['signin', 'signout', 'signup', 'verify', 'forgotPassword', 'createAccount', 'pinCode', 'pinCodepassword', 'changeForgotpassword']);
        $this->Auth->allow(['signin', 'signout', 'signup', 'verify', 'forgotPassword', 'createAccount', 'pinCode', 'pinCodepassword', 'registersendpin', 'forgotsendpin', 'changeForgotpassword', 'reautorize']);
    }


    public function index() {
        return $this->redirect(['controller' => 'Users', 'action' => 'signin']);
    }

    /**
     * 
     * Function signin / login make for user authentication
     * @author  sarawutt.b
     * @since   20108/05/24 10:49:20
     * @license Pakgon
     * @return  void
     */
    public function signin() {
        $this->viewBuilder()->layout('blank');
    }

    #Signin

    public function verify() {
        $this->viewBuilder()->layout('blank');

        if ($this->request->is('post')) {
            $data = $this->request->getData();
            if (!empty($data)) {
                $data['data']['ip'] = $this->request->clientIp();
                $api_core_signin = Configure::read('Config.apiCore.signin');
                $http = new Client();
                $response = $http->post($api_core_signin, $data['data'])->body();
                $response = json_decode($response, '_full');

                if (!empty($response)) {
                    if (strtolower(trim($response['status'])) == 'success') {
                        $response['result']['user']['id'] = $response['result']['user']['user_id'];
                        $this->Auth->setUser($response['result']['user']);
                        //$url = Router::url(['controller' => 'Homes', 'action' => 'index'], true);
                        // Before chan logic to OAUTH
                        // echo "<script>setTimeout(function(){Login.onLogin('" . $response['result']['token'] . "','" . $url . "','" . $response['result']['topic'] . "')},1000);</script>";
                        $statusCode = '200';
                        // echo "<script type='text/javascript'>setTimeout(function(){Login.onLogin('" . $statusCode . "','" . $this->_redirectApplicationURL . "','" . $response['result']['topic'] . "')},1000);</script>";
                        $RedirectApplicationURL = Configure::read('RedirectApplicationURL');
                        $topic = $response['result']['topic'];
                        $token = $response['result']['token'];
                        $this->set(compact('statusCode', 'RedirectApplicationURL', 'topic', 'token'));

                        #echo "<script>setTimeout(function(){alert('".$response['result']['token']."')},1000);</script>";
                        #echo "<script>Login.onLogin('".$response['result']['token']."','".$url."','".$response['result']['topic']."');</script>";
                        #echo "<button onclick=Login.onLogin('".$response['result']['token']."','".$url."','".$response['result']['topic']."')>CLICK</button>";
                        #------------------------------------------------------------------
                        $param = [];
                        $param['topic'] = '/topics/' . $response['result']['topic'];
                        $param['title'] = '';
                        $param['message'] = '';
                        $param['badge'] = 1;

                        #$api_notification = 'http://connect05.pakgon.com/api/Notifications/push';
                        $api_notification = Configure::read('Config.apiCommunication.getNotification');
                        $http = new Client();
                        $options = [
                            'headers' => [
                                'Content-Type' => 'application/x-www-form-urlencoded',
                            ]
                        ];
                        $response = $http->post($api_notification, $param, $options)->body();
                        #prr($response);
                        #------------------------------------------------------------------						
                        //$this->redirect($this->_redirectApplicationURL);
                        //header('Location: ' . $this->_redirectApplicationURL);
                        //return $this->redirect($redirectApplicationURL);
                    } else {
                        $this->Flash->error(__('Verify Fail'));
                        return $this->redirect(['controller' => 'Users', 'action' => 'signin']);
                    }
                } else {
                    $this->Flash->error(__('Verify Fail'));
                    return $this->redirect(['controller' => 'Users', 'action' => 'signin']);
                }
            } else {
                $this->Flash->error(__('Data Empty'));
                return $this->redirect(['controller' => 'Users', 'action' => 'signin']);
            }
        }
    }

    /**
     * 
     * Function mobile re-authorized use automatically by mobile application
     * @author  sarawutt.b
     * @return  void
     */
    public function reautorize() {
        $this->viewBuilder()->layout(false);
        $reauthorizeAPI = Configure::read('Config.apiCore.reauthorize');
        $http = new Client();
        $data['data']['username'] = 'pakgon.demo';
        $data['data']['password'] = 'deio$5679@qETY';
        $data['data']['ip'] = $this->request->clientIp();
        $response = $http->post(
                        $reauthorizeAPI, $data['data'], ['headers' => [
                        'Authorization' => $this->request->getHeaderLine('Authorization'),
                        'Accept-Language' => $this->request->getHeaderLine('Accept-Language')
            ]])->body();
        $response = json_decode($response, true);
        if (!empty($response['result']['user'])) {
            $response['result']['user']['id'] = $response['result']['user']['user_id'];
            $this->Auth->setUser($response['result']['user']);
            return $this->redirect(Configure::read('RedirectApplicationURL'));
        } else {
            return $this->redirect(['controller' => 'Users', 'action' => 'signin']);
        }
    }
    public function signup() {
        $this->loadModel('MasterCountries');
        $this->loadModel('MasterProvinces');

		$countries = $this->MasterCountries->find('list',
			[
				'conditions' => ['is_used' => true],
				'keyField' => 'id',
				'valueField' => ['country_name_th']
			]
		);
		if(!empty($countries)) $countries = $countries->toArray();
		
		$provinces = $this->MasterProvinces->find('list',
			[
				'conditions' => ['is_used' => true],
				'keyField' => 'id',
				'valueField' => 'province_name_th'          
			]
		);
		if(!empty($provinces)) $provinces = $provinces->toArray();
		$this->set(compact('provinces','countries'));

        $this->viewBuilder()->layout('blank');
    }

    #---------------------------------------------------------------------------------------------------

    #Signup

    public function createAccount() {
        $this->loadModel('UserPersonals');

        $users = $this->Users->newEntity();
        $user_personals = $this->UserPersonals->newEntity();

        if ($this->request->is('post')) {
            // $username_check = $this->MasterProvinces->find('all')->toArray();
            // pr($username_check);die;
            // pr($this->request->data);die;
            $today = Time::now();
            $dateNow = $today->i18nFormat('yyyy-MM-dd HH:mm:ss');
            $hasher = new DefaultPasswordHasher();
            $firstname = $this->request->data['firstname'];
            // $moblie_no = $this->request->data['moblie_no'];
            $lastname = $this->request->data['lastname'];
            $master_country_id = $this->request->data['master_country_id'];
            $master_province_id = $this->request->data['master_province_id'];
            $password = $this->request->data['password'];
            $confirm_password = $this->request->data['confirm_password'];
            $btn = $this->request->data['btn'];

            if (!empty($this->request->data['birthdate'])) {
                $birthdate = explode("/", $this->request->data['birthdate']);
                $birthdate = $birthdate[2] . '-' . $birthdate[1] . '-' . $birthdate[0];
                $this->request->data['birthdate'] = $birthdate;
            } else {
                $birthdate = '2000-10-10';
            }

            $this->request->data['password'] = $hasher->hash($password);
            $users['created_by'] = 0;
            $users['is_used'] = false;
            $users['created'] = $dateNow;
            $users['dynamic_key'] = 'dynamic_key';

            // $users['point'] = 0;
            $users['dynamic_key_expiry'] = date('Y-m-d', strtotime('+3 day'));
            $users['token'] = Security::hash($this->request->data['username'] . date('Y-m-d h:i:s'), 'md5', true);
            $users['token_expiry'] = date('Y-m-d', strtotime('+3 day'));
            // $users['modified_by'] = $modified_by;
            $digits = 4;
            $users['pin_code'] = str_pad(rand(0, pow(10, $digits) - 1), $digits, '0', STR_PAD_LEFT);

            if (!empty($this->request->data['accept'])) {

                $username_check = $this->Users->find('all', [
                            'conditions' => [
                                'Users.username' => $this->request->data['username']
                            ]
                        ])->toArray();

                $email_check = $this->UserPersonals->find('all', [
                            'conditions' => [
                                'UserPersonals.email' => $this->request->data['email']
                            ]
                        ])->toArray();

                if ((empty($username_check)) && (empty($email_check))) {
                    $users = $this->Users->patchEntity($users, $this->request->getData());
                    // pr($users);die;
//------------------------------  ส่งอีเมล์  -----------------------------------------------------					
                    $data_notification = [];
                    $data_notification['email'] = $this->request->data['email'];
                    $data_notification['pin_code'] = $users['pin_code'];
                    $this->notification($data_notification);
//----------------------------------------------------------------------------------------------
                    $this->Users->save($users);
                    $user_personals['master_country_id'] = $master_country_id;
                    $user_personals['master_province_id'] = $master_province_id;
                    $user_personals['user_id'] = $users['id'];
                    $user_personals['firstname_th'] = $firstname;
                    $user_personals['lastname_th'] = $lastname;
                    $user_personals['created_by'] = 1;
                    $user_personals['created'] = $dateNow;
                    $user_personals = $this->UserPersonals->patchEntity($user_personals, $this->request->getData());
                    $this->UserPersonals->save($user_personals);

                    // $this->Flash->success(__('The register success.'));
                    return $this->redirect(['controller' => 'Users', 'action' => 'pinCode/' . $users['token']]);
                    // return $this->redirect(['action' => 'signin']);		
                }
                $this->Flash->error(__('This email is already in the system.'));
                return $this->redirect(['action' => 'signup']);
            } else if (empty($this->request->data['accept'])) {
                $this->Flash->error(__('Please accept the Terms of Use.'));
                return $this->redirect(['action' => 'signup']);
            }
            $this->Flash->error(__('The article could not be saved. Please, try again.'));
        }
    }

    public function notification($data = null) {
        if (!empty($data)) {
            $verify_code = $data['pin_code'];
            $from_email = ['support@pakgon.com' => 'Support'];
            $to_emails = [$data['email']];

            $email = new Email();
            $email->transport('gmail');

            try {
                $email->template('notification_signup', 'connect');
                $email->from($from_email);
                $email->to($to_emails);
                $email->subject('Signup Connect Verify');
                $email->emailFormat('html');
                $email->viewVars(compact('verify_code'));
                #$email->send($message);
                $email->send();
            } catch (Exception $e) {
                echo 'Exception : ', $e->getMessage(), "\n";
            }

            #$this->httpStatusCode = 200;
            #$this->apiResponse['message'] = 'Signup Connect Completed!!';
        }
    }

    #---------------------------------------------------------------------------------------------------    

    function validateAccount($data = null) {

        $error = [];

        if (!empty($error)) {
            $this->set('error', $error);
            return false;
        } else {
            return true;
        }
    }

    // public function notification()
    // {
    //     $this->viewBuilder()->layout('blank');
    // }
    
    #Verify Pin Code
    public function pinCode($token = null) {



        $this->viewBuilder()->layout('blank');

        $data = $this->request->data();
        if (!empty($data)) {

            $api_core_verify_pin_code = Configure::read('Config.apiCore.verifyPinCode');
            $http = new Client();
            #$response = json_decode($http->post($api_core_verify_pin_code,$data)->body(),'_full');
            $response = $http->post($api_core_verify_pin_code, $data)->body();
            $response = json_decode($response, '_full');

            if (!empty($response)) {
                if (trim($response['status']) == 'Success') {
                    $this->Flash->success(__('Verify Completed.'));
                    return $this->redirect(['controller' => 'Users', 'action' => 'signin']);
                } else {
                    $this->Flash->error(__('Pin Code Invalid'));
                    return $this->redirect(['controller' => 'Users', 'action' => 'pinCode/' . $token]);
                }
            }
        }
        $this->set(array('token' => $token, '_serialize' => array('token')));
    }

    /**
     * 
     * Function user forgot password
     * @return void
     */
    public function forgotPassword() {
        $this->viewBuilder()->layout('blank');
        $this->loadModel('UserPersonals');
        if ($this->request->is('post')) {
            $hasher = new DefaultPasswordHasher();
            $email = $this->request->data['email'];
            $user_personals = $this->UserPersonals->find('all', [
                        'conditions' => [
                            'UserPersonals.email' => $email
                        ]
                    ])->first();
            if (!empty($user_personals)) {

                $users = $this->Users->find('all', [
                            'conditions' => [
                                'Users.id' => $user_personals['user_id']
                            ]
                        ])->first();
                $digits = 4;
                $users['pin_pass'] = str_pad(rand(0, pow(10, $digits) - 1), $digits, '0', STR_PAD_LEFT);
                $token = $users['token'];

                //--------------------ตัวส่ง Email ---------------------------------------------------------
                //pr($user_personals);die;
                $data_notification = [];
                $data_notification['email'] = $this->request->data['email'];
                $data_notification['pin_code'] = $users['pin_pass'].'<br>Username:'.$users['username'];
                $this->notification($data_notification);
                //----------------------------------------------------------------------------------------
                $this->Users->save($users);

                $this->Flash->success(__('send password to email success'));
                return $this->redirect(['action' => 'pinCodepassword/' . $token]);
            } else {
                $this->Flash->error(__('Invalid Email.'));
                return $this->redirect(['action' => 'forgot-password']);
            }
        }
    }

	public function pinCodepassword($token=null)    
    {
		$this->viewBuilder()->layout('blank');
		$users = $this->Users->find('all',[
			'conditions'=>[
				'Users.token'=>$token
			]
		])->first();

		if($this->request->is('post')){
			$data = $this->request->data();	
			$data['pin_pass'] = $data['pin_code_1'].$data['pin_code_2'].$data['pin_code_3'].$data['pin_code_4'];
			if($data['pin_pass']==$users['pin_pass']){
				$this->Flash->success(__('Pin Completed.'));
				return $this->redirect(['controller' => 'Users', 'action' => 'changeForgotpassword/'.$token]);	
			}
			$this->Flash->error(__('Pin Invalid'));
			return $this->redirect(['controller' => 'Users', 'action' => 'pinCodepassword/'.$token]);
		}
		$this->set(array('token' => $token, '_serialize' => array('token'))); 
	}
	
	public function changePassword()
    {
    
    		$id = $this->Auth->user('id');
			$this->viewBuilder()->layout('blank');
			$users = $this->Users->get($id);
			if ($this->request->is('post')) {

			$hasher = new DefaultPasswordHasher();
			$password = $this->request->data['password'];
			$confirm_password = $this->request->data['confirm_password'];
			$oldpassword = $this->request->data['oldpassword'];
			$this->request->data['password'] = $hasher->hash($this->request->data['password']);			
			//------- เทียบ password ที่เข้ารหัส ---------------password_verify($password,hashed_password)---------------------------
			
			if (password_verify($oldpassword, $users['password'])) {
				$users = $this->Users->patchEntity($users, $this->request->getData());
				$this->Users->save($users);
				$this->Flash->success(__('You are now logged out.'));
				return $this->redirect(['action' => 'signout']);

			} else {
				$this->Flash->error(__('Invalid password.'));
				return $this->redirect(['action' => 'change-password']);
			}
		}
	}

	public function changeForgotpassword($token=null)
    {
			$this->viewBuilder()->layout('blank');
			$users = $this->Users->find('all',[
				'conditions' => [
					'Users.token' => $token
				]
			])->first();
			if ($this->request->is('post')) {
			$hasher = new DefaultPasswordHasher();
			$password = $this->request->data['password'];
			$confirm_password = $this->request->data['confirm_password'];
			$this->request->data['password'] = $hasher->hash($this->request->data['password']);			
			//------- เทียบ password ที่เข้ารหัส ---------------password_verify($password,hashed_password)---------------------------
				$users = $this->Users->patchEntity($users, $this->request->getData());
				$this->Users->save($users);
				$this->Flash->success(__('You are now logged out.'));
				return $this->redirect(['action' => 'signin']);
		}
		$this->set(array('token' => $token, '_serialize' => array('token'))); 
	}


    #---------------------------------------------------------------------------------------------------        


	public function forgotsendpin($token=null) {
		$this->loadModel('UserPersonals');
		$users = $this->Users->find('all',[
			'conditions'=>[
				'Users.token'=>$token
			]
		])->first();
		$digits = 4;
		$users['pin_pass'] = str_pad(rand(0, pow(10, $digits)-1), $digits, '0', STR_PAD_LEFT);

		$user_personals = $this->UserPersonals->find('all',[
			'conditions'=>[
				'UserPersonals.user_id'=>$users['id']
			]
		])->first();
		//--------------------ตัวส่ง Email ---------------------------------------------------------
		 //pr($user_personals);die;
		$data_notification = [];
		$data_notification['email'] = $user_personals['email'];
		$data_notification['pin_code'] = $users['pin_pass'].'<br>'." Username: ".$users['username'];
		$this->notification($data_notification);
		//----------------------------------------------------------------------------------------
		if($this->Users->save($users)){
			$this->Flash->success(__('send pin success.'));
			return $this->redirect(['action' => 'pin_codepassword/'.$token]);
		}
		$this->Flash->success(__('send pin false.'));
		return $this->redirect(['action' => 'pin_codepassword/'.$token]);
    }
	
	public function registersendpin($token=null) {
		$this->loadModel('UserPersonals');
		$users = $this->Users->find('all',[
			'conditions'=>[
				'Users.token'=>$token
			]
		])->first();
		$digits = 4;
		$users['pin_pass'] = str_pad(rand(0, pow(10, $digits)-1), $digits, '0', STR_PAD_LEFT);

		$user_personals = $this->UserPersonals->find('all',[
			'conditions'=>[
				'UserPersonals.user_id'=>$users['id']
			]
		])->first();
		//--------------------ตัวส่ง Email ---------------------------------------------------------
		 //pr($user_personals);die;
		$data_notification = [];
		$data_notification['email'] = $user_personals['email'];
		$data_notification['pin_code'] = $users['pin_pass'].'<br>'." Username: ".$users['username'];
		$this->notification($data_notification);
		//----------------------------------------------------------------------------------------
		if($this->Users->save($users)){
			$this->Flash->success(__('send pin success.'));
			return $this->redirect(['action' => 'pin_code/'.$token]);
		}
		$this->Flash->success(__('send pin false.'));
		return $this->redirect(['action' => 'pin_code/'.$token]);
    }



    /**
     * 
     * Function user logout / signout
     * @author sarawutt.b
     * @since  2018/05/22 16:44:20
     * @license PAKGON
     * @return void
     */
    public function signout() {
        $http = new Client();
        $result = $http->delete(Configure::read('OAUTH2_PROVIDER.TOKEN_DETETE') . '/' . $this->Auth->user('id'))->body();
        $this->Flash->success(__('You are now logged out.'));
        return $this->redirect($this->Auth->logout());
    }

}