<?php
/**
 * @link      http://github.com/zendframework/ZendSkeletonApplication for the canonical source repository
 * @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
 * @license   http://framework.zend.com/license/new-bsd New BSD License
 */

namespace Application\Controller;

use Application\Master;
use Zend\View\Model\ViewModel;

class UserController extends \Application\Master\GlobalActionController
{
    public function __construct($headScript)
    {
        $this->headScript = $headScript;
    }

    public function indexAction() {
        $result = new Result(0, 403, 'invalid_controller');
        header('Content-Type: application/json');
        return $this->redirect()->toRoute('login');
    }

    public function loginAction(){
        try {
            
            $view = new ViewModel();

            $session        = $this->getSession();
            $token_keamanan = md5(uniqid(mt_rand(), true));
            
            error_log('$token_keamanan: ' . $token_keamanan);
            
            if($session) {
                $session->put(null, array('token_keamanan' => $token_keamanan));
                $message = $session->get('message');
            } else {
                $message = 'Tidak dapat mengakses database. Mohon ulangi beberapa saat lagi.';
            }

            $view->setVariables(array(
                'message'           => $message,
                'token_keamanan'    => $token_keamanan
            ));

            //$view->setTerminal(true);
            
            //$this->layout("layout/layout");
            $this->layout('layout/login');
            //$view->headTitle('Login')->setSeparator(' - ');
            //$this->view->headTitle("login bray");

            $this->headScript->appendFile('/action-js/index-js/login-user-action.js');
            return $view;
        } catch (Exception $ex) {
            error_log($ex->getMessage());
            return $this->redirect()->toRoute('login');
        }
    }

    public function authenticateAction(){

        try {
            $uri     = $this->getRequest()->getUri();
            $baseurl = sprintf('//%s', $uri->getHost());

            $post    = $this->getRequest()->getPost();
            $session = $this->getSession();
        
            // if (strlen('' . $post['token_keamanan']) <= 0 || $post['token_keamanan'] <> $session->get('token_keamanan')) {
            //     $message = htmlspecialchars('Token login tidak sesuai. Mohon ulangi.', ENT_QUOTES, 'UTF-8');
            //     $session->put(null, array('message' => $message));
            //     return $this->redirect()->toRoute('login');
            // }

            $username = $post['username'];
            $password = $post['passwd'];

            $storage = \Khansia\Access\User\Storage::factory($this->getDb(), $this->getConfig());
            $user    =  new \Khansia\Access\User($storage);
                
            if($user->load($username,  \Khansia\Access\User\Storage::LOADBY_CODE)){ // sukses load then

                $authResult = $user->authenticate($password, null, \Khansia\Access\User::RETRIES_TRUE);

                if($authResult->code == $authResult::CODE_SUCCESS) {

                    $session->owner($user->id);
                    
                    /* get access role */
                    $access = $user->loadAccess($user->id);
                    
                    $accessArray = array();
                    
                    foreach($access->data as $data=> $val){

                        if($val['access_status'] == 'TRUE'){
                            $newStat = true;
                        }else{
                            $newStat = false;
                        }
                        $accessArray[$val['access_code']] = $newStat;
                    
                    }

                    $session->put(null, array(
                        'baseurl'           => $baseurl,
                        'user_id'           => $user->id,
                        'usernamed'         => $user->username,
                        'passwd'            => $user->password,
                        'name'              => $user->name,
                        'role'              => $user->role,
                        'status'            => $user->status,
                        'deviceid'          => $user->deviceid,
                        'token'             => $user->token,
                        'email'             => $user->email,
                        'retries'           => $user->retries,
                        'create_dtm'        => $user->create_dtm,
                        'access'            => $accessArray,
                        'role_code'         => $access->data[0]['role_code'],
                        
                    ));

                    $session->flush();

                    /* direct data */
                    if($user->role == 10){
                        return $this->redirect()->toRoute('home');
                    }else {
                        return $this->redirect()->toRoute('admin');
                    }
                    
                }else{
                    switch($authResult->code) {
                        case \Khansia\Access\User::CODE_AUTH_INVALID:
                            $authMessage = 'User tidak valid';
                            break;
                        case \Khansia\Access\User::CODE_AUTH_SUSPEND:
                            $authMessage = 'User ditangguhkan';
                            break;
                        case \Khansia\Access\User::CODE_AUTH_LOCKED:
                            $authMessage = 'User tidak aktif';
                            break;
                        case \Khansia\Access\User::CODE_AUTH_FAILED:
                            $authMessage = 'Password tidak sesuai';
                            break;
                    }

                    $message = htmlspecialchars($authMessage, ENT_QUOTES, 'UTF-8');

                    $session->put(null, array('message' => $message));
                    
                    return $this->redirect()->toRoute('login');
                }
            }else{
                
                $session = $this->getSession();
                
                $session->put(null, array('message' => "incorrect username or password "));
    
                return $this->redirect()->toRoute('login');
            }

        } catch (\Exception $ex) {
            $session = $this->getSession();
            $message = htmlspecialchars($ex->getMessage(), ENT_QUOTES, 'UTF-8');
            
            $session->put(null, array('message' => $message));

            return $this->redirect()->toRoute('login');
        }        
    }

    public function logoutAction() {
        try {
            $session = $this->getSession();
            $session->stop();
            
            return $this->redirect()->toRoute('login');
        } catch (\Exception $ex) {
            return $this->redirect()->toRoute('login');
        }
    }

    public function registrationAction(){
        $view = new ViewModel();
        $uri     = $this->getRequest()->getUri();
        $baseurl = sprintf('//%s', $uri->getHost());

        $this->headScript->appendScript(' var baseURL = "' . $baseurl . '"'); 
        $this->headScript->appendFile('/action-js/index-js/register-user-action.js');
        
        $this->layout("layout/login");
        return $view;
    }

    public function profileAction(){
        $view = new ViewModel();
        $uri     = $this->getRequest()->getUri();
        $baseurl = sprintf('//%s', $uri->getHost());
        $session_data   =   $this->getSession();

        // $storage = \Khansia\Access\User\Storage::factory($this->getDb(), $this->getConfig());
        // $user    =  new \Khansia\Access\User($storage);

        //$user    =  new \Khansia\Access\User($storage);
        $view->setVariables(array(
            'id_user'   => $session_data->get('user_id'),
            'name'      => $session_data->get('name'),
            'email'     => $session_data->get('email'),
            'username'  => $session_data->get('usernamed'),
        ));
        
        
        $this->headScript->appendScript(' var baseURL = "' . $baseurl . '"'); 
        $this->headScript->appendScript(' var idUserProfile = "' . $session_data->get('user_id') . '"');
        $this->headScript->appendFile('/action-js/index-js/user-profile-action.js');
        $this->layout()->myParameter = $session_data->get('usernamed');
        $this->layout("layout/menu");
        return $view;
    }

    public function adminpageAction(){
        $view           = new ViewModel();
        $uri            = $this->getRequest()->getUri();
        $baseurl        = sprintf('//%s', $uri->getHost());
        $session_data   =   $this->getSession();

        // if($session_data->get('role') != 20){
        //     $this->redirect()->toRoute('admin');
        // }

        $view->setVariables(array(
            'id_user'   => $session_data->get('user_id'),
            'name'      => $session_data->get('name'),
            'email'     => $session_data->get('email'),
            'username'  => $session_data->get('usernamed'),
            'role'      => $session_data->get('role'),
        ));

        $this->headScript->appendScript(' var baseURL = "' . $baseurl . '"');
        $this->headScript->appendFile('/template/js/demo/user-list-action.js');
        $this->layout()->myParameter = $session_data->get('usernamed');
        $this->layout("layout/admin");
        return $view;
    }

}