package incheon.product.geoview3d.theme.web;

import incheon.com.cmm.api.DefaultApiResponse;
import incheon.product.geoview3d.theme.service.ThemeService;
import incheon.product.geoview3d.theme.vo.ThemeCategoryVO;
import incheon.product.geoview3d.theme.vo.ThemeLayerVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;

/**
 * GeoView-3D 주제도 API. 카테고리·레이어·필터·검색 데이터를 제공한다.
 */
@Slf4j
@RestController
@RequestMapping("/api/v1/product/g3d/theme")
public class ThemeApiController {

    @Resource(name = "productThemeService")
    private ThemeService themeService;

    @GetMapping(value = "/list", produces = MediaType.APPLICATION_JSON_VALUE)
    public String getThemeList() {
        return themeService.getThemeListJson();
    }

    /**
     * 주제도 전체 키워드 검색.
     * SearchPanel.js의 searchByKeyword()에서 호출한다.
     */
    @GetMapping(value = "/search", produces = MediaType.APPLICATION_JSON_VALUE)
    public String searchAllThemes(@RequestParam String keyword,
                                  @RequestParam(defaultValue = "1") int page,
                                  @RequestParam(defaultValue = "50") int size) {
        return themeService.getThemeListJson();
    }

    @GetMapping(value = "/{themeId}", produces = MediaType.APPLICATION_JSON_VALUE)
    public String getTheme(@PathVariable String themeId,
                           @RequestParam(required = false) String q,
                           @RequestParam(required = false) Integer limit) {
        return themeService.getThemeJson(themeId, q, limit);
    }

    @GetMapping(value = "/{themeId}/search", produces = MediaType.APPLICATION_JSON_VALUE)
    public String searchTheme(@PathVariable String themeId,
                              @RequestParam String q,
                              @RequestParam(required = false) Integer limit) {
        return themeService.getThemeJson(themeId, q, limit);
    }

    @GetMapping("/categories")
    public DefaultApiResponse<List<ThemeCategoryVO>> getCategories() {
        return DefaultApiResponse.success(themeService.getCategories());
    }

    @GetMapping("/layers")
    public DefaultApiResponse<List<ThemeLayerVO>> getLayers() {
        return DefaultApiResponse.success(themeService.getLayers());
    }

    @GetMapping("/filter")
    public DefaultApiResponse<List<String>> getFilterValues(@RequestParam String thmId,
                                                            @RequestParam String filter) {
        return DefaultApiResponse.success(themeService.getFilterValues(thmId, filter));
    }

    @GetMapping("/filter/child")
    public DefaultApiResponse<List<String>> getFilterChildValues(@RequestParam String thmId,
                                                                  @RequestParam String filterName1,
                                                                  @RequestParam String filterValue,
                                                                  @RequestParam String filterName2) {
        return DefaultApiResponse.success(themeService.getFilterChildValues(thmId, filterName1, filterValue, filterName2));
    }

    @GetMapping(value = "/election/geom", produces = MediaType.APPLICATION_JSON_VALUE)
    public String getElectionGeom(@RequestParam String poiId) {
        return themeService.getElectionGeom(poiId);
    }

    @GetMapping("/wastebag")
    public DefaultApiResponse<List<Map<String, Object>>> getWasteBagPrices(@RequestParam String sgg) {
        return DefaultApiResponse.success(themeService.getWasteBagPrices(sgg));
    }
}
