<?php

namespace App\Http\Controllers\Api\V1;

use App\Helpers\ApiResponse;
use App\Http\Controllers\Controller;
use App\Services\MenuService;
use App\Services\MenuSyncService;
use Illuminate\Http\Request;

class MenuController extends Controller
{
    public function __construct(
        protected MenuSyncService $menuSyncService
    ) {}

    public function index(Request $request)
    {
        return ApiResponse::handle(function () use ($request) {
            return MenuService::index($request->all());
        }, '메뉴 목록 조회');
    }

    public function show($id)
    {
        return ApiResponse::handle(function () use ($id) {
            return MenuService::show(['id' => (int) $id]);
        }, '메뉴 단건 조회');
    }

    public function store(Request $request)
    {
        return ApiResponse::handle(function () use ($request) {
            return MenuService::store($request->all());
        }, '메뉴 등록');
    }

    public function update(Request $request, $id)
    {
        return ApiResponse::handle(function () use ($request, $id) {
            $params = $request->all();
            $params['id'] = (int) $id;

            return MenuService::update($params);
        }, '메뉴 수정');
    }

    public function destroy($id)
    {
        return ApiResponse::handle(function () use ($id) {
            return MenuService::destroy(['id' => (int) $id]);
        }, '메뉴 삭제');
    }

    public function reorder(Request $request)
    {
        return ApiResponse::handle(function () use ($request) {
            return MenuService::reorder($request->all());
        }, '메뉴 정렬 변경');
    }

    public function toggle(Request $request, $id)
    {
        return ApiResponse::handle(function () use ($request, $id) {
            $params = $request->all();
            $params['id'] = (int) $id;

            return MenuService::toggle($params);
        }, '메뉴 상태 토글');
    }

    /**
     * 삭제된 메뉴 복원
     */
    public function restore($id)
    {
        return ApiResponse::handle(function () use ($id) {
            return MenuService::restore(['id' => (int) $id]);
        }, '메뉴 복원');
    }

    /**
     * 삭제된 메뉴 목록 조회
     */
    public function trashed()
    {
        return ApiResponse::handle(function () {
            return MenuService::trashedList();
        }, '삭제된 메뉴 목록 조회');
    }

    /**
     * 복제 가능한 글로벌 메뉴 목록
     */
    public function availableGlobal()
    {
        return ApiResponse::handle(function () {
            return $this->menuSyncService->getAvailableGlobalMenus();
        }, '복제 가능한 글로벌 메뉴 목록');
    }

    /**
     * 동기화 상태 목록 조회
     */
    public function syncStatus(Request $request)
    {
        return ApiResponse::handle(function () use ($request) {
            $statusFilter = $request->query('status');

            return $this->menuSyncService->getSyncStatus($statusFilter);
        }, '동기화 상태 조회');
    }

    /**
     * 선택 동기화 (신규 생성 또는 기존 업데이트)
     */
    public function sync(Request $request)
    {
        return ApiResponse::handle(function () use ($request) {
            $menuIds = $request->input('menu_ids', []);
            $force = $request->boolean('force', false);

            return $this->menuSyncService->syncMenus($menuIds, $force);
        }, '메뉴 동기화');
    }

    /**
     * 신규 글로벌 메뉴 일괄 가져오기
     */
    public function syncNew()
    {
        return ApiResponse::handle(function () {
            return $this->menuSyncService->importNewMenus();
        }, '신규 메뉴 가져오기');
    }

    /**
     * 변경된 기존 메뉴 일괄 업데이트 (커스텀 제외)
     */
    public function syncUpdates()
    {
        return ApiResponse::handle(function () {
            return $this->menuSyncService->syncUpdates();
        }, '메뉴 업데이트 동기화');
    }
}
