package com.kamco.cd.kamcoback.menu;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.kamco.cd.kamcoback.config.api.ApiLogFunction;
import com.kamco.cd.kamcoback.config.api.ApiResponseDto;
import com.kamco.cd.kamcoback.menu.dto.MenuDto;
import com.kamco.cd.kamcoback.menu.service.MenuService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import java.util.LinkedHashMap;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@Tag(name = "메뉴 관리", description = "메뉴 관리 API")
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/menu")
public class MenuApiController {

  private final MenuService menuService;

  @Autowired private ObjectMapper objectMapper;

  @Operation(summary = "목록 조회", description = "모든 메뉴 조회")
  @ApiResponses(
      value = {
        @ApiResponse(
            responseCode = "200",
            description = "조회 성공",
            content =
                @Content(
                    mediaType = "application/json",
                    schema = @Schema(implementation = MenuDto.Basic.class))),
        @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content),
        @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
      })
  @GetMapping
  public ApiResponseDto<List<MenuDto.Basic>> getFindAll() {
    return ApiResponseDto.ok(menuService.getFindAll());
  }

  @GetMapping("/find-uri")
  public ApiResponseDto<String> getFindAllByUid(@RequestParam String apiUri) {
    List<?> list = menuService.getFindAll();

    List<MenuDto.Basic> result =
        list.stream()
            .map(
                item -> {
                  if (item instanceof LinkedHashMap<?, ?> map) {
                    return objectMapper.convertValue(map, MenuDto.Basic.class);
                  } else if (item instanceof MenuDto.Basic dto) {
                    return dto;
                  } else {
                    throw new IllegalStateException("Unsupported cache type: " + item.getClass());
                  }
                })
            .toList();

    return ApiResponseDto.ok(ApiLogFunction.getUriMenuInfo(result, apiUri));
  }
}
