<?php

namespace App\Policies;

use Illuminate\Auth\Access\HandlesAuthorization;
use App\Models\Board;
use App\Models\BoardMeta;
use App\Models\User;
use App\Services\BoardService;
use App\Services\PostService;

class BoardPolicy
{
    use HandlesAuthorization;

    public BoardService $boardService;
    public PostService $postService;

    /**
     * Create a new policy instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->boardService = new BoardService();
        $this->postService = new PostService();
    }

    /**
     * Determine whether the user can view any models.
     *
     * @param  \App\Models\User  $user
     * @param  \App\Models\BoardMeta  $boardMeta
     * @return \Illuminate\Auth\Access\Response|bool
     */
    public function viewAny(?User $user, BoardMeta $boardMeta)
    {
        // 게시판 사용 권한 확인
        $permitValue = $boardMeta->item(BOARD_PERMIT_TYPE_1, 0);
        if ($permitValue == 1 && !$user) {
            return $this->deny('로그인 후 이용 해주세요.', 401);
        }else if($permitValue == 100 && !$user?->isAdministrator()) {
            return $this->deny(MAP_BOARD_PERMIT_ALERT_TYPE[BOARD_PERMIT_TYPE_1]);
        }

        // 1:1 문의 게시판은 로그인 후 이용할 수 있다.
        if($boardMeta->item('use_personal', 0)) {
            if(!$user) {
                return $this->deny('로그인 후 이용 해주세요.', 401);
            }
        }

        return true;
    }

    /**
     * Determine whether the user can create models.
     *
     * @param  \App\Models\User  $user
     * @param  \App\Models\Board  $board
     * @param  \App\Models\BoardMeta  $boardMeta
     * @return \Illuminate\Auth\Access\Response|bool
     */
    public function create(?User $user, Board $board, BoardMeta $boardMeta)
    {
        // 글 작성은 하루에 한번만 허용
        if ($boardMeta->item('use_only_one_post', 0)) {
            if ($this->postService->userPostRows($board, $user) >= 1) {
                return $this->deny('이 게시판은 하루에 한 글만 작성 가능합니다.');
            }
        }

        // 글쓰기 버튼 보이기
        if(!$boardMeta->item('always_show_write_button', 0)) {
            return false;
        }
        return true;
    }
}
