<?php

namespace App\Http\Controllers\Api\Admin;

use App\Http\Controllers\Controller;
use App\Http\Requests\StoreMenuRequest;
use App\Http\Requests\UpdateMenuRequest;
use App\Services\MenuService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class GlobalMenuController extends Controller
{
    public function __construct(
        private readonly MenuService $menuService
    ) {}

    /**
     * 글로벌 메뉴 목록 조회
     */
    public function index(Request $request): JsonResponse|\Illuminate\Http\Response
    {
        $menus = $this->menuService->getGlobalMenus(
            $request->all(),
            $request->integer('per_page', 100) // 글로벌 메뉴는 많지 않으므로 페이지당 100개
        );

        // HTMX 요청인 경우 HTML 직접 반환 (JSON 래핑 없이)
        if ($request->header('HX-Request')) {
            $html = view('menus.partials.global-table', compact('menus'))->render();

            return response($html)->header('Content-Type', 'text/html');
        }

        // 일반 API 요청인 경우 JSON 반환
        return response()->json([
            'success' => true,
            'data' => $menus->items(),
            'meta' => [
                'current_page' => $menus->currentPage(),
                'last_page' => $menus->lastPage(),
                'per_page' => $menus->perPage(),
                'total' => $menus->total(),
            ],
        ]);
    }

    /**
     * 글로벌 메뉴 상세 조회
     */
    public function show(int $id): JsonResponse
    {
        $menu = $this->menuService->getGlobalMenuById($id);

        if (! $menu) {
            return response()->json([
                'success' => false,
                'message' => '글로벌 메뉴를 찾을 수 없습니다.',
            ], 404);
        }

        return response()->json([
            'success' => true,
            'data' => $menu,
        ]);
    }

    /**
     * 글로벌 메뉴 생성
     */
    public function store(StoreMenuRequest $request): JsonResponse
    {
        try {
            $menu = $this->menuService->createGlobalMenu($request->validated());

            return response()->json([
                'success' => true,
                'message' => '글로벌 메뉴가 생성되었습니다.',
                'data' => $menu,
                'redirect' => route('menus.global.index'),
            ], 201);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => '글로벌 메뉴 생성에 실패했습니다: '.$e->getMessage(),
            ], 500);
        }
    }

    /**
     * 글로벌 메뉴 수정
     */
    public function update(UpdateMenuRequest $request, int $id): JsonResponse
    {
        try {
            $result = $this->menuService->updateGlobalMenu($id, $request->validated());

            if (! $result) {
                return response()->json([
                    'success' => false,
                    'message' => '글로벌 메뉴를 찾을 수 없거나 수정할 수 없습니다.',
                ], 404);
            }

            return response()->json([
                'success' => true,
                'message' => '글로벌 메뉴가 수정되었습니다.',
                'redirect' => route('menus.global.index'),
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => '글로벌 메뉴 수정에 실패했습니다: '.$e->getMessage(),
            ], 500);
        }
    }

    /**
     * 글로벌 메뉴 삭제
     */
    public function destroy(int $id): JsonResponse
    {
        try {
            $result = $this->menuService->deleteGlobalMenu($id);

            if (! $result) {
                return response()->json([
                    'success' => false,
                    'message' => '글로벌 메뉴를 찾을 수 없거나 자식 메뉴가 있어 삭제할 수 없습니다.',
                ], 404);
            }

            return response()->json([
                'success' => true,
                'message' => '글로벌 메뉴가 삭제되었습니다.',
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => '글로벌 메뉴 삭제에 실패했습니다: '.$e->getMessage(),
            ], 500);
        }
    }

    /**
     * 글로벌 메뉴 복원
     */
    public function restore(Request $request, int $id): JsonResponse
    {
        $this->menuService->restoreGlobalMenu($id);

        if ($request->header('HX-Request')) {
            return response()->json([
                'success' => true,
                'message' => '글로벌 메뉴가 복원되었습니다.',
                'action' => 'refresh',
            ]);
        }

        return response()->json([
            'success' => true,
            'message' => '글로벌 메뉴가 복원되었습니다.',
        ]);
    }

    /**
     * 글로벌 메뉴 영구 삭제
     * - 연관 권한도 함께 삭제
     * - 참조하는 테넌트 메뉴의 global_menu_id 해제
     * - 삭제 정보는 archived_records에 저장
     */
    public function forceDestroy(Request $request, int $id): JsonResponse
    {
        try {
            $result = $this->menuService->forceDeleteGlobalMenu($id);

            if (! $result['success']) {
                return response()->json([
                    'success' => false,
                    'message' => $result['message'],
                ], 400);
            }

            if ($request->header('HX-Request')) {
                return response()->json([
                    'success' => true,
                    'message' => $result['message'],
                    'action' => 'refresh',
                    'deleted_permissions' => $result['deleted_permissions'],
                    'referencing_menus_unlinked' => $result['referencing_menus_unlinked'] ?? 0,
                    'batch_id' => $result['batch_id'] ?? null,
                ]);
            }

            return response()->json([
                'success' => true,
                'message' => $result['message'],
                'deleted_permissions' => $result['deleted_permissions'],
                'referencing_menus_unlinked' => $result['referencing_menus_unlinked'] ?? 0,
                'batch_id' => $result['batch_id'] ?? null,
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => '글로벌 메뉴 영구 삭제에 실패했습니다: '.$e->getMessage(),
            ], 500);
        }
    }

    /**
     * 글로벌 메뉴 활성 상태 토글
     */
    public function toggleActive(Request $request, int $id): JsonResponse
    {
        try {
            $result = $this->menuService->toggleGlobalActive($id);

            if (! $result) {
                return response()->json([
                    'success' => false,
                    'message' => '글로벌 메뉴를 찾을 수 없습니다.',
                ], 404);
            }

            if ($request->header('HX-Request')) {
                return response()->json([
                    'success' => true,
                    'message' => '글로벌 메뉴 활성 상태가 변경되었습니다.',
                    'action' => 'refresh',
                ]);
            }

            return response()->json([
                'success' => true,
                'message' => '글로벌 메뉴 활성 상태가 변경되었습니다.',
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => '글로벌 메뉴 활성 상태 변경에 실패했습니다: '.$e->getMessage(),
            ], 500);
        }
    }

    /**
     * 글로벌 메뉴 숨김 상태 토글
     */
    public function toggleHidden(Request $request, int $id): JsonResponse
    {
        try {
            $result = $this->menuService->toggleGlobalHidden($id);

            if (! $result) {
                return response()->json([
                    'success' => false,
                    'message' => '글로벌 메뉴를 찾을 수 없습니다.',
                ], 404);
            }

            if ($request->header('HX-Request')) {
                return response()->json([
                    'success' => true,
                    'message' => '글로벌 메뉴 숨김 상태가 변경되었습니다.',
                    'action' => 'refresh',
                ]);
            }

            return response()->json([
                'success' => true,
                'message' => '글로벌 메뉴 숨김 상태가 변경되었습니다.',
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => '글로벌 메뉴 숨김 상태 변경에 실패했습니다: '.$e->getMessage(),
            ], 500);
        }
    }

    /**
     * 글로벌 메뉴 계층 이동 (인덴트/아웃덴트)
     */
    public function move(Request $request): JsonResponse
    {
        $validated = $request->validate([
            'menu_id' => 'required|integer',
            'new_parent_id' => 'nullable|integer',
            'sort_order' => 'required|integer|min:1',
        ]);

        try {
            $result = $this->menuService->moveGlobalMenu(
                $validated['menu_id'],
                $validated['new_parent_id'],
                $validated['sort_order']
            );

            if (! $result['success']) {
                return response()->json($result, 400);
            }

            return response()->json($result);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => '글로벌 메뉴 이동에 실패했습니다: '.$e->getMessage(),
            ], 500);
        }
    }

    /**
     * 글로벌 메뉴 순서 변경
     */
    public function reorder(Request $request): JsonResponse
    {
        $validated = $request->validate([
            'items' => 'required|array',
            'items.*.id' => 'required|integer',
            'items.*.sort_order' => 'required|integer',
        ]);

        try {
            $this->menuService->reorderGlobalMenus($validated['items']);

            return response()->json([
                'success' => true,
                'message' => '글로벌 메뉴 순서가 변경되었습니다.',
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => '글로벌 메뉴 순서 변경에 실패했습니다: '.$e->getMessage(),
            ], 500);
        }
    }
}
