<?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;

class UsersController extends AppController
{

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

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

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

        $data = $this->request->data();
		#$data['data']['ip'] = $this->request->clientIp();

        if(!empty($data)){
		if(!empty($data['data']['username']) && !empty($data['data']['password'])){
			$data['data']['ip'] = $this->request->clientIp();#prr($data);
				
			$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');#prd($response);

			if(!empty($response)){
				if(trim($response['status']) == 'Success'){
					$url = Router::url(['controller' => 'Homes', 'action' => 'index'], true);

					echo "<script>setTimeout(function(){Login.onLogin('".$response['result']['token']."','".$url."','".$response['result']['topic']."')},1000);</script>";
					#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);
					#------------------------------------------------------------------						
					
					die;
										
				}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']);		
		}				
        }

    }

    public function signup()
    {	
		$this->loadModel('MasterCountries');
		$this->loadModel('MasterProvinces');

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

        $this->viewBuilder()->layout('blank');
	}
	
	// public function getProvince() {
	// 	$this->autoRender = false;
	// 	$this->loadModel('MasterProvinces');
	// 	$states = array();
	// 	pr($this->request->$data);die;
	// 	if (isset($this->request['data']['id'])) {
	// 		$states = $this->MasterProvinces->find('list', array(
	// 			'keyField' => 'id',
	// 			'valueField' => ['country_name_th'],
	// 			'conditions' => array(
	// 				'State.countries_id' => $this->request['data']['id']
	// 			)
	// 		));
	// 	}
	// 	header('Content-Type: application/json');
	// 	pr($states);die;
	// 	echo json_encode($states);
	// 	exit();
	// }

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

    #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'];
            // $phone_no = $this->request->data['phone_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'] = true;
			$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(__('Username or Email Address already used by others.'));
				return $this->redirect(['action' => 'signup']);
			}else if(empty($this->request->data['accept'])){
				$this->Flash->error(__('please accept'));
				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)    
    {
    
    	if(empty($token)) die;
	
        $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'))); 
    }
    
    #---------------------------------------------------------------------------------------------------        
    
    #Forgot Password
    public function forgotPassword()
    {
            $this->viewBuilder()->layout('blank');

        $data = $this->request->data();
	#$data['data']['ip'] = $this->request->clientIp();

        if(!empty($data)){
		if(!empty($data['data']['username'])){
			$data['data']['ip'] = $this->request->clientIp();#prr($data);
				
			$api_core_forgotPassword = Configure::read('Config.apiCore.forgotPassword');
			$http = new Client();
			$response = $http->post($api_core_forgotPassword,$data['data'])->body();
			$response = json_decode($response,'_full');#debug($response);

			if(!empty($response)){
				if(trim($response['status']) == 'Success'){
                                        $this->Flash->success(__('Completed.'));
					return $this->redirect(['controller' => 'Users', 'action' => 'signin']);
				}else{
					$this->Flash->error(__('Forgot Password Fail'));
					return $this->redirect(['controller' => 'Users', 'action' => 'forgotPassword']);	
				}
			}else{
				$this->Flash->error(__('Forgot Password Fail'));
				return $this->redirect(['controller' => 'Users', 'action' => 'forgotPassword']);			
			}
				
		}else{
			$this->Flash->error(__('Data Empty'));
			return $this->redirect(['controller' => 'Users', 'action' => 'forgotPassword']);		
		}				
        }    
    }

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

    #Change Password
    public function changePassword()
    {
        $this->viewBuilder()->layout('blank');

		$data = $this->request->data();#debug($data);exit();
		// pr($data);die;
		// pr($this->validateAccount($data));die;
        if(!empty($data)){
			// pr($data);die;
		if($this->validateAccount($data)){
			$data['data']['ip'] = $this->request->clientIp();#debug($data);exit();
				
			// pr($data);die;
			$api_core_change_password = Configure::read('Config.apiCore.changePassword');#debug($api_core_change_password);exit();
			$http = new Client();
			// pr($http);die;
			#$response = json_decode($http->post($api_core_change_password,$data)->body(),'_full');
			$response = $http->post($api_core_change_password,$data)->body();
			// pr($data);die;
			#debug($response);exit();
			$response = json_decode($response,'_full');		
			// pr($response);die;	
			#debug($response);exit();

			if(!empty($response)){
			// pr($response);die;
				
				#if(trim($response['status']) == 'Success' && !empty($response['result']['type'])){
				if(trim($response['status']) == 'Success'){
					#$this->response->withHeader('Authorization', 'Bearer '.$response['result']['token']);
					#$url = $this->Url->build(['controller' => 'Homes', 'action' => 'index'], true);
					$url = Router::url(['controller' => 'Users', 'action' => 'signup'], true);
					#echo "<script>Login.onLogin('".$response['result']['token']."','".$url."');</script>";die;
						
					$this->Flash->success(__('change Password completed.'));
					return $this->redirect(['controller' => 'Users', 'action' => 'signin']);								
				}else{
					$this->Flash->error(__('change Password Fail'));
					return $this->redirect(['controller' => 'Users', 'action' => 'signup']);	
				}
			}
				
		}else{
			$this->Flash->error(__('Data Empty'));
			return $this->redirect(['controller' => 'Users', 'action' => 'signin']);		
		}				
        }    
    }
    
    #---------------------------------------------------------------------------------------------------        
    
    public function signout()
    {
	$this->checkToken();
    
	}   
	 
}