package com.zioinfo.kintex.home;

import com.zioinfo.kintex.auth.KintexPrincipal;
import com.zioinfo.kintex.common.ApiResponse;
import com.zioinfo.kintex.home.dto.HomeDtos.HallCenter;
import com.zioinfo.kintex.home.dto.HomeDtos.ShowcaseItem;
import com.zioinfo.kintex.home.dto.HomeDtos.SummaryResponse;
import com.zioinfo.kintex.home.dto.HomeDtos.TodoResponse;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
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;

import java.util.List;

/**
 * SCR-HOME(로그인 후 메인 홈) 집계 API — 전 역할 공통(인증 필수). 읽기 전용.
 *
 * <p>영역별 독립 엔드포인트 → 프론트가 영역별 스켈레톤/에러 처리(한 영역 실패가 홈 전체를 막지 않음, design.md).
 * 모든 응답은 {@code ApiResponse<T>} 봉투. PII·서버 자격정보 미포함, 스택트레이스 미노출(전역 핸들러).
 */
@RestController
@RequestMapping("/api/home")
public class HomeController {

    private final HomeService service;

    public HomeController(HomeService service) {
        this.service = service;
    }

    /** GET /api/home/todos — 역할 기반 내 할 일(기한 임박순 최대 6건 + total). */
    @GetMapping("/todos")
    public ApiResponse<TodoResponse> todos(@AuthenticationPrincipal KintexPrincipal principal) {
        return ApiResponse.ok(service.getTodos(principal));
    }

    /** GET /api/home/showcase?tab=ongoing|thisMonth|nextMonth — 진행 중·다가오는 전시(최대 12건). */
    @GetMapping("/showcase")
    public ApiResponse<List<ShowcaseItem>> showcase(
            @RequestParam(name = "tab", required = false, defaultValue = "ongoing") String tab) {
        return ApiResponse.ok(service.getShowcase(tab));
    }

    /** GET /api/home/hall-centers — 캘린더/리스트 세그먼트 필터의 동적 전시장 옵션(하드코딩 금지). */
    @GetMapping("/hall-centers")
    public ApiResponse<List<HallCenter>> hallCenters() {
        return ApiResponse.ok(service.getHallCenters());
    }

    /** GET /api/home/summary — 역할별 KPI 4타일. */
    @GetMapping("/summary")
    public ApiResponse<SummaryResponse> summary(@AuthenticationPrincipal KintexPrincipal principal) {
        return ApiResponse.ok(service.getSummary(principal));
    }
}
