<?php
defined('BASEPATH') OR exit('No direct script access allowed');

/**
 * Login class
 */

/**
 * 로그인 페이지와 관련된 controller 입니다.
 */
class Login extends MY_Controller
{

    /**
     * 모델을 로딩합니다
     */
    protected $models = array();

    /**
     * 헬퍼를 로딩합니다
     */
    protected $helpers = array('form', 'array', 'string');

    function __construct()
    {
        parent::__construct();

    }


    /**
     * 로그인 페이지입니다
     */
    public function index()
    {

        if ($this->userlib->is_user() !== false && ! ($this->userlib->is_admin() === 'super' && $this->uri->segment(1) === config_item('uri_segment_admin'))) {
            redirect();
        }

        $view = array();
        $view['view'] = array();


        $this->load->library(array('form_validation'));

         if ( ! function_exists('password_hash')) {
            $this->load->helper('password');
        }

        $use_login_account = $this->configlib->item('use_login_account');

        /**
         * 전송된 데이터의 유효성을 체크합니다
         */
        $config[] = array(
            'field' => 'user_email',
            'label' => '이메일',
            'rules' => 'trim|required|valid_email',
        );
        $view['view']['useremail_label_text'] = '이메일';
        $config[] = array(
            'field' => 'user_password',
            'label' => '패스워드',
            'rules' => 'trim|required|min_length[4]|callback__check_id_pw[' . $this->input->post('user_email') . ']',
        );

        $this->form_validation->set_rules($config);
        /**
         * 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
         * 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
         */
        if ($this->form_validation->run() === false) {


            if ($this->input->post('returnurl')) {
                if (validation_errors('<div class="alert alert-warning" role="alert">', '</div>')) {
                    $this->session->set_flashdata(
                        'loginvalidationmessage',
                        validation_errors('<div class="alert alert-warning" role="alert">', '</div>')
                    );
                }
                $this->session->set_flashdata(
                    'loginuseremail',
                    $this->input->post('user_email')
                );
                redirect(urldecode($this->input->post('returnurl')));
            }

        
            /**
             * 레이아웃을 정의합니다
             */
            $layoutconfig = array(
                'path' => 'login',
                'layout' => 'layout',
                'skin' => 'login',
            );
            $view['layout'] = $this->layoutlib->front($layoutconfig, $this->configlib->get_device_view_type());
            $this->data = $view;
            $this->layout = element('layout_skin_file', element('layout', $view));
            $this->view = element('view_skin_file', element('layout', $view));
        } else {
            /**
             * 유효성 검사를 통과한 경우입니다.
             * 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
             */


            $userinfo = $this->User_model->get_by_email($this->input->post('user_email'), 'user_id, user_email');
            $this->session->set_userdata(
                'user_id',
                element('user_id', $userinfo)
            );

            $site_title = $this->configlib->item('site_title');

            $url_after_login = $this->configlib->item('url_after_login');
            if ($url_after_login) {
                $url_after_login = site_url($url_after_login);
            }
            if (empty($url_after_login)) {
                $url_after_login = $this->input->get_post('url') ? urldecode($this->input->get_post('url')) : site_url();
            }

            redirect($url_after_login);
        }
    }


    /**
     * 로그인 페이지입니다
     */
    public function nopage()
    {
        $view = array();
        $view['view'] = array();

        $layoutconfig = array(
            'path' => 'login',
            'layout' => 'layout',
            'skin' => 'login_nopage',
            'layout_dir' => $this->configlib->item('layout_login'),
            'mobile_layout_dir' => $this->configlib->item('mobile_layout_login'),
            'use_sidebar' => $this->configlib->item('sidebar_login'),
            'use_mobile_sidebar' => $this->configlib->item('mobile_sidebar_login'),
            'skin_dir' => $this->configlib->item('skin_login'),
            'mobile_skin_dir' => $this->configlib->item('mobile_skin_login'),
        );
        $view['layout'] = $this->layoutlib->front($layoutconfig, $this->configlib->get_device_view_type());
        $this->data = $view;
        $this->layout = element('layout_skin_file', element('layout', $view));
        $this->view = element('view_skin_file', element('layout', $view));

    }


    /**
     * 로그인시 아이디와 패스워드가 일치하는지 체크합니다
     */
    public function _check_id_pw($password, $useremail)
    {
         if ( ! function_exists('password_hash')) {
            $this->load->helper('password');
        }

        $max_login_try_count = (int) $this->configlib->item('max_login_try_count');
        $max_login_try_limit_second = (int) $this->configlib->item('max_login_try_limit_second');

        $use_login_account = $this->configlib->item('use_login_account');


        $userselect = 'user_id, user_password, user_denied, user_email_cert, user_is_admin';
        $userinfo = $this->User_model->get_by_email($useremail, $userselect);
        $hash = password_hash($password, PASSWORD_BCRYPT);

        if ( ! element('user_id', $userinfo) OR ! element('user_password', $userinfo)) {
            $this->form_validation->set_message(
                '_check_id_pw',
                '회원 아이디와 패스워드가 서로 맞지 않습니다'
            );
            return false;
        } elseif ( ! password_verify($password, element('user_password', $userinfo))) {
            $this->form_validation->set_message(
                '_check_id_pw',
                '회원 아이디와 패스워드가 서로 맞지 않습니다'
            );
            return false;
        } elseif (element('user_denied', $userinfo)) {
            $this->form_validation->set_message(
                '_check_id_pw',
                '회원님의 아이디는 접근이 금지된 아이디입니다'
            );
            return false;
        } elseif ($this->configlib->item('use_register_email_auth') && ! element('user_email_cert', $userinfo)) {
            $this->form_validation->set_message(
                '_check_id_pw',
                '회원님은 아직 이메일 인증을 받지 않으셨습니다'
            );
            return false;
        }

        return true;
    }


    /**
     * 로그아웃합니다
     */
    public function logout()
    {

        if ($this->userlib->is_user() === false) {
            redirect();
        }

        $this->session->sess_destroy();
        $url_after_logout = $this->configlib->item('url_after_logout');
        if ($url_after_logout) {
            $url_after_logout = site_url($url_after_logout);
        }
        if (empty($url_after_logout)) {
            $url_after_logout = $this->input->get_post('url') ? $this->input->get_post('url') : site_url();
        }


        redirect($url_after_logout, 'refresh');
    }
}
