<?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;
use App\Models\DTO\ResponseData;
use Exception;

class PostDelete
{
    public function handle(Request $request, Closure $next)
    {
        try{

            $code = $request->route('code');
            $postID = $request->route('postID');

            // 게시판 코드 확인
            if (!$code || !$postID) {
                throw new Exception('잘못된 접근입니다.', 404);
            }

            $boardService = new BoardService();

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

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

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

            $postService = new PostService();

            // 게시글 조회
            $post = $postService->find($postID);

            if(!$post->exists) {
                throw new Exception('존재하지 않는 게시글입니다.');
            }

            $user = $request->user();

            // 비회원 게시글은 비밀번호 확인
            if(!$user && !$post->user_id) {
                $passwd = $request->input('passwd');
                if(!$passwd || $passwd != $post->password) {
                    throw new Exception('권한이 없습니다.');
                }
            }

            $boardMeta = $boardService->meta($board->id);

            // 삭제 권한 확인
            $response = Gate::inspect('delete', [$post, $boardMeta]);
            if($response->denied()) {
                throw new Exception($response->message(), $response->code());
            }

            // 관리자만 삭제 가능
            $response = Gate::inspect('forceDelete', [$post, $boardMeta]);
            if($response->denied()) {
                throw new Exception($response->message());
            }

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

        }catch(Exception $e) {
            return ResponseData::fromException($e);
        }

        return $next($request);
    }
}
