<?php

namespace App\Http\Middleware\Board;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
use App\Services\BoardService;
use App\Services\PostService;

class PostAccess
{
    public function handle(Request $request, Closure $next)
    {
        $code = $request->route('code');
        $postID = $request->route('postID');

        // 게시판 코드 확인
        if (!$code || !$postID) {
            abort(404);
        }

        $boardService = new BoardService();

        // 게시판 정보 조회
        $board = $boardService->find($code);

        // 게시판 존재 유무
        if (!$board->exists) {
            return alert('존재하지 않는 게시판입니다.', DIRECTORY_SEPARATOR);
        }

        // 게시판 사용 여부
        if ($board->is_display == 0) {
            return alert('더 이상 사용하지 않는 게시판입니다.', DIRECTORY_SEPARATOR);
        }

        $postService = new PostService();

        // 게시글 조회
        $post = $postService->find($postID);
        $boardIndexURL = route('board.list', $code);

        // 게시글 존재 유무
        if (!$post->exists) {
            return alert('존재하지 않는 게시글입니다.', $boardIndexURL);
        }

        // 게시판 정보 조회
        $boardMeta = $boardService->meta($board->id);

        // 보기 권한 확인
        $response = Gate::inspect('view', [$post, $boardMeta]);
        if($response->denied()) {
            if($response->code() == 401) {
                return loginCheck($boardIndexURL);
            }else{
                return alert($response->message(), $boardIndexURL);
            }
        }

        // 신고 시 숨김
        if (
            $boardMeta->item('use_blame', 0)
            && $post->blame >= $boardMeta->item('blame_blind_count', 0)
        ) {
            return alert('신고 누적으로 비공개 처리되었습니다. 해당 게시글은 관리자 확인 후 이용규칙에 따라 처리됩니다.', $boardIndexURL);
        }

        // 게시글 조회 수 증가
        $postService->addHit($post);

        $request->merge([
            'board' => $board,
            'boardMeta' => $boardMeta,
            'post' => $post
        ]);

        return $next($request);
    }
}
