package com.unicorn.hgzero.meeting.infra.controller;

import com.unicorn.hgzero.common.dto.ApiResponse;
import com.unicorn.hgzero.meeting.biz.dto.DashboardDTO;
import com.unicorn.hgzero.meeting.biz.usecase.in.dashboard.GetDashboardUseCase;
import com.unicorn.hgzero.meeting.infra.dto.response.DashboardResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

/**
 * 대시보드 REST API Controller
 * 사용자별 맞춤 대시보드 데이터 제공
 */
@Tag(name = "Dashboard", description = "대시보드 관련 API")
@RestController
@RequestMapping("/api/dashboard")
@RequiredArgsConstructor
@Slf4j
public class DashboardController {

    private final GetDashboardUseCase getDashboardUseCase;

    /**
     * 대시보드 데이터 조회
     * 
     * @param userId 사용자 ID
     * @return 대시보드 데이터
     */
    @Operation(
        summary = "대시보드 데이터 조회",
        description = "사용자별 맞춤 대시보드 정보를 조회합니다. 예정된 회의 목록, 진행 중 Todo 목록, 최근 회의록 목록, 통계 정보를 포함합니다.",
        security = @SecurityRequirement(name = "bearerAuth")
    )
    @GetMapping
    public ResponseEntity<ApiResponse<DashboardResponse>> getDashboard(
            @Parameter(description = "사용자 ID", required = true)
            @RequestHeader("X-User-Id") String userId,
            @Parameter(description = "사용자명", required = true)
            @RequestHeader("X-User-Name") String userName,
            @Parameter(description = "사용자 이메일", required = true)
            @RequestHeader("X-User-Email") String userEmail) {
        
        log.info("대시보드 데이터 조회 요청 - userId: {}", userId);
        
        var dashboardData = getDashboardUseCase.getDashboard(userId);
        var dashboardDTO = DashboardDTO.from(dashboardData);
        var response = DashboardResponse.from(dashboardDTO);
        
        log.info("대시보드 데이터 조회 완료 - userId: {}", userId);
        
        return ResponseEntity.ok(ApiResponse.success(response));
    }
}