<?php

namespace App\Http\Controllers\Api\Admin\Quote;

use App\Http\Controllers\Controller;
use App\Http\Requests\Quote\StoreQuoteFormulaCategoryRequest;
use App\Http\Requests\Quote\UpdateQuoteFormulaCategoryRequest;
use App\Services\Quote\QuoteFormulaCategoryService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;

class QuoteFormulaCategoryController extends Controller
{
    public function __construct(
        private readonly QuoteFormulaCategoryService $categoryService
    ) {}

    /**
     * 카테고리 목록 (HTMX용)
     */
    public function index(Request $request): View|JsonResponse
    {
        $filters = $request->only(['search', 'is_active', 'trashed', 'sort_by', 'sort_direction']);
        $categories = $this->categoryService->getCategories($filters, 15);

        // HTMX 요청이면 HTML 파셜 반환
        if ($request->header('HX-Request')) {
            return view('quote-formulas.categories.partials.table', compact('categories'));
        }

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

    /**
     * 카테고리 통계
     */
    public function stats(): JsonResponse
    {
        $stats = $this->categoryService->getCategoryStats();

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

    /**
     * 카테고리 상세 조회
     */
    public function show(int $id): JsonResponse
    {
        $category = $this->categoryService->getCategoryById($id, true);

        if (! $category) {
            return response()->json([
                'success' => false,
                'message' => '카테고리를 찾을 수 없습니다.',
            ], 404);
        }

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

    /**
     * 카테고리 생성
     */
    public function store(StoreQuoteFormulaCategoryRequest $request): JsonResponse
    {
        $validated = $request->validated();

        // 코드 중복 체크
        if ($this->categoryService->isCodeExists($validated['code'])) {
            return response()->json([
                'success' => false,
                'message' => '이미 사용 중인 카테고리 코드입니다.',
            ], 422);
        }

        $category = $this->categoryService->createCategory($validated);

        return response()->json([
            'success' => true,
            'message' => '카테고리가 생성되었습니다.',
            'data' => $category,
        ]);
    }

    /**
     * 카테고리 수정
     */
    public function update(UpdateQuoteFormulaCategoryRequest $request, int $id): JsonResponse
    {
        $validated = $request->validated();

        // 코드 중복 체크 (자신 제외)
        if (isset($validated['code']) && $this->categoryService->isCodeExists($validated['code'], $id)) {
            return response()->json([
                'success' => false,
                'message' => '이미 사용 중인 카테고리 코드입니다.',
            ], 422);
        }

        $this->categoryService->updateCategory($id, $validated);

        return response()->json([
            'success' => true,
            'message' => '카테고리가 수정되었습니다.',
        ]);
    }

    /**
     * 카테고리 삭제 (Soft Delete)
     */
    public function destroy(int $id): JsonResponse
    {
        $this->categoryService->deleteCategory($id);

        return response()->json([
            'success' => true,
            'message' => '카테고리가 삭제되었습니다.',
        ]);
    }

    /**
     * 카테고리 복원
     */
    public function restore(int $id): JsonResponse
    {
        $this->categoryService->restoreCategory($id);

        return response()->json([
            'success' => true,
            'message' => '카테고리가 복원되었습니다.',
        ]);
    }

    /**
     * 카테고리 영구 삭제
     */
    public function forceDestroy(int $id): JsonResponse
    {
        $this->categoryService->forceDeleteCategory($id);

        return response()->json([
            'success' => true,
            'message' => '카테고리가 영구 삭제되었습니다.',
        ]);
    }

    /**
     * 카테고리 활성/비활성 토글
     */
    public function toggleActive(int $id): JsonResponse
    {
        $category = $this->categoryService->toggleActive($id);

        return response()->json([
            'success' => true,
            'message' => $category->is_active ? '카테고리가 활성화되었습니다.' : '카테고리가 비활성화되었습니다.',
            'data' => ['is_active' => $category->is_active],
        ]);
    }

    /**
     * 카테고리 순서 변경
     */
    public function reorder(Request $request): JsonResponse
    {
        $validated = $request->validate([
            'category_ids' => 'required|array',
            'category_ids.*' => 'integer|exists:quote_formula_categories,id',
        ]);

        $this->categoryService->reorder($validated['category_ids']);

        return response()->json([
            'success' => true,
            'message' => '순서가 변경되었습니다.',
        ]);
    }

    /**
     * 드롭다운용 카테고리 목록
     */
    public function dropdown(): JsonResponse
    {
        $categories = $this->categoryService->getActiveCategories();

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