<?php

namespace App\Filters;

use CodeIgniter\Filters\FilterInterface;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;

class AuthFilter implements FilterInterface
{
    /**
     * Do whatever processing this filter needs to do.
     * By default it should not return anything during
     * normal execution. However, when an abnormal state
     * is found, it should return an instance of
     * CodeIgniter\HTTP\Response. If it does, script
     * execution will end and that Response will be
     * sent back to the client, allowing for error pages,
     * redirects, etc.
     *
     * @param RequestInterface $request
     * @param array|null       $arguments
     *
     * @return mixed
     */
    public function before(RequestInterface $request, $arguments = null)
    {
        // 로그인을 했으면
        if (session()->get(SESSION_NAMES['ISLOGIN'])) {
            $auth = session()->get(SESSION_NAMES['AUTH']);
            // 회원 ROLES이 필요ROLE($arguments[0]) 목록에 존재하지 않으면(ACL)
            if (!in_array($arguments[0], explode(DEFAULTS['DELIMITER_ROLE'], $auth[AUTH_FIELDS['ROLE']]))) {
                return redirect()->to('/login')->with(
                    'return_message',
                    sprintf(
                        "%s,%s회원님은 접속에 필요한 권한[%s]이 없습니다. ",
                        $auth[AUTH_FIELDS['ROLE']],
                        $auth[AUTH_FIELDS['TITLE']],
                        implode(",", $arguments)
                    )
                );
            }
        } else {
            session()->setFlashdata(SESSION_NAMES['RETURN_URL'], $request->getUri()->getPath() . '?' . $request->getUri()->getQuery());
            return redirect()->to('/login')->with('return_message', '로그인을하셔야합니다.');
        }
    }

    /**
     * Allows After filters to inspect and modify the response
     * object as needed. This method does not allow any way
     * to stop execution of other after filters, short of
     * throwing an Exception or Error.
     *
     * @param RequestInterface  $request
     * @param ResponseInterface $response
     * @param array|null        $arguments
     *
     * @return mixed
     */
    public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
    {
        //
    }
}
