<?php

namespace App\Http\Controllers\Sales;

use App\Http\Controllers\Controller;
use App\Models\Sales\SalesTenantManagement;
use App\Services\Sales\SalesDevelopmentApprovalService;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\View\View;

/**
 * 개발 승인 관리 컨트롤러
 */
class SalesDevelopmentApprovalController extends Controller
{
    public function __construct(
        private SalesDevelopmentApprovalService $service
    ) {}

    /**
     * 개발 승인 메인 페이지
     */
    public function index(Request $request): View|Response
    {
        // 권한 체크: admin 역할만 접근 가능
        if (! auth()->user()->isAdmin()) {
            abort(403, '접근 권한이 없습니다.');
        }

        if ($request->header('HX-Request')) {
            return response('', 200)->header('HX-Redirect', route('sales.development.approvals.index'));
        }

        $search = $request->get('search');

        // 통계
        $stats = $this->service->getStats();

        // 3개 목록
        $pendingItems = $this->service->getPendingApprovals($search);
        $progressItems = $this->service->getInProgressItems($search);
        $completedItems = $this->service->getCompletedItems($search);

        // 본사 진행 상태 정보 (뷰에서 사용)
        $hqStatuses = SalesTenantManagement::$hqStatusLabels;
        $hqStatusOrder = SalesTenantManagement::$hqStatusOrder;

        return view('sales.development.approvals', compact(
            'stats',
            'pendingItems',
            'progressItems',
            'completedItems',
            'hqStatuses',
            'hqStatusOrder'
        ));
    }

    /**
     * 승인 처리
     */
    public function approve(Request $request, int $id)
    {
        // 권한 체크
        if (! auth()->user()->isAdmin()) {
            abort(403, '접근 권한이 없습니다.');
        }

        try {
            $management = $this->service->approve($id);
            $tenantName = $management->tenant?->company_name ?? '알 수 없음';

            if ($request->header('HX-Request')) {
                return response()->json([
                    'success' => true,
                    'message' => "{$tenantName}의 개발이 승인되었습니다.",
                ]);
            }

            return redirect()->route('sales.development.approvals.index')
                ->with('success', "{$tenantName}의 개발이 승인되었습니다.");
        } catch (\InvalidArgumentException $e) {
            if ($request->header('HX-Request')) {
                return response()->json([
                    'success' => false,
                    'message' => $e->getMessage(),
                ], 400);
            }

            return redirect()->back()->with('error', $e->getMessage());
        }
    }

    /**
     * 반려 처리
     */
    public function reject(Request $request, int $id)
    {
        // 권한 체크
        if (! auth()->user()->isAdmin()) {
            abort(403, '접근 권한이 없습니다.');
        }

        $validated = $request->validate([
            'rejection_reason' => 'required|string|max:1000',
        ]);

        try {
            $management = $this->service->reject($id, $validated['rejection_reason']);
            $tenantName = $management->tenant?->company_name ?? '알 수 없음';

            if ($request->header('HX-Request')) {
                return response()->json([
                    'success' => true,
                    'message' => "{$tenantName}이(가) 반려되었습니다.",
                ]);
            }

            return redirect()->route('sales.development.approvals.index')
                ->with('success', "{$tenantName}이(가) 반려되었습니다.");
        } catch (\InvalidArgumentException $e) {
            if ($request->header('HX-Request')) {
                return response()->json([
                    'success' => false,
                    'message' => $e->getMessage(),
                ], 400);
            }

            return redirect()->back()->with('error', $e->getMessage());
        }
    }

    /**
     * 상태 변경
     */
    public function updateStatus(Request $request, int $id)
    {
        // 권한 체크
        if (! auth()->user()->isAdmin()) {
            abort(403, '접근 권한이 없습니다.');
        }

        $validated = $request->validate([
            'status' => 'required|string',
        ]);

        try {
            $management = $this->service->updateHqStatus($id, $validated['status']);
            $tenantName = $management->tenant?->company_name ?? '알 수 없음';
            $statusLabel = SalesTenantManagement::$hqStatusLabels[$validated['status']] ?? $validated['status'];

            if ($request->header('HX-Request')) {
                return response()->json([
                    'success' => true,
                    'message' => "{$tenantName}의 상태가 '{$statusLabel}'(으)로 변경되었습니다.",
                ]);
            }

            return redirect()->route('sales.development.approvals.index')
                ->with('success', "{$tenantName}의 상태가 '{$statusLabel}'(으)로 변경되었습니다.");
        } catch (\InvalidArgumentException $e) {
            if ($request->header('HX-Request')) {
                return response()->json([
                    'success' => false,
                    'message' => $e->getMessage(),
                ], 400);
            }

            return redirect()->back()->with('error', $e->getMessage());
        }
    }

    /**
     * 승인대기로 되돌리기
     */
    public function revertToPending(Request $request, int $id)
    {
        // 권한 체크
        if (! auth()->user()->isAdmin()) {
            abort(403, '접근 권한이 없습니다.');
        }

        try {
            $management = $this->service->revertToPending($id);
            $tenantName = $management->tenant?->company_name ?? '알 수 없음';

            if ($request->header('HX-Request')) {
                return response()->json([
                    'success' => true,
                    'message' => "{$tenantName}이(가) 승인대기로 이동되었습니다.",
                ]);
            }

            return redirect()->route('sales.development.approvals.index')
                ->with('success', "{$tenantName}이(가) 승인대기로 이동되었습니다.");
        } catch (\InvalidArgumentException $e) {
            if ($request->header('HX-Request')) {
                return response()->json([
                    'success' => false,
                    'message' => $e->getMessage(),
                ], 400);
            }

            return redirect()->back()->with('error', $e->getMessage());
        }
    }

    /**
     * 상세 정보 모달
     */
    public function detail(int $id): View
    {
        // 권한 체크
        if (! auth()->user()->isAdmin()) {
            abort(403, '접근 권한이 없습니다.');
        }

        $management = $this->service->getDetail($id);
        $hqStatuses = SalesTenantManagement::$hqStatusLabels;
        $hqStatusOrder = SalesTenantManagement::$hqStatusOrder;

        return view('sales.development.partials.detail-modal', compact(
            'management',
            'hqStatuses',
            'hqStatusOrder'
        ));
    }
}
