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

import com.unicorn.hgzero.common.dto.ApiResponse;
import com.unicorn.hgzero.meeting.biz.domain.Dashboard;
import com.unicorn.hgzero.meeting.biz.usecase.in.dashboard.GetDashboardUseCase;
import com.unicorn.hgzero.meeting.infra.dto.response.DashboardResponse;
import com.unicorn.hgzero.meeting.infra.mapper.DashboardResponseMapper;
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.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

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

    private final GetDashboardUseCase getDashboardUseCase;
    private final DashboardResponseMapper dashboardResponseMapper;

    /**
     * 대시보드 데이터 조회
     * 
     * @param userId 사용자 ID
     * @return 대시보드 데이터
     */
    @Operation(
        summary = "대시보드 데이터 조회",
        description = "사용자별 맞춤 대시보드 정보를 조회합니다. 예정된 회의 목록, 최근 회의록 목록, 통계 정보를 포함합니다.",
        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);
        
        try {
            // 실제 데이터 조회
            Dashboard dashboard = getDashboardUseCase.getDashboard(userId);
            
            // 도메인 객체를 응답 DTO로 변환
            DashboardResponse response = dashboardResponseMapper.toResponse(dashboard);
            
            log.info("대시보드 데이터 조회 완료 - userId: {}", userId);
            
            return ResponseEntity.ok(ApiResponse.success(response));
        } catch (Exception e) {
            log.error("대시보드 데이터 조회 실패 - userId: {}", userId, e);
            throw e;
        }
    }

    /**
     * 기간별 대시보드 데이터 조회
     * 
     * @param userId 사용자 ID
     * @param period 조회 기간 (1day, 3days, 7days, 30days, 90days)
     * @return 기간별 대시보드 데이터
     */
    @Operation(
        summary = "기간별 대시보드 데이터 조회",
        description = "사용자별 맞춤 대시보드 정보를 기간 필터로 조회합니다.",
        security = @SecurityRequirement(name = "bearerAuth")
    )
    @GetMapping("/period/{period}")
    public ResponseEntity<ApiResponse<DashboardResponse>> getDashboardByPeriod(
            @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,
            @Parameter(description = "조회 기간", required = true)
            @PathVariable String period) {
        
        log.info("기간별 대시보드 데이터 조회 요청 - userId: {}, period: {}", userId, period);
        
        try {
            // 실제 데이터 조회
            Dashboard dashboard = getDashboardUseCase.getDashboardByPeriod(userId, period);
            
            // 도메인 객체를 응답 DTO로 변환
            DashboardResponse response = dashboardResponseMapper.toResponse(dashboard);
            
            log.info("기간별 대시보드 데이터 조회 완료 - userId: {}, period: {}", userId, period);
            
            return ResponseEntity.ok(ApiResponse.success(response));
        } catch (Exception e) {
            log.error("기간별 대시보드 데이터 조회 실패 - userId: {}, period: {}", userId, period, e);
            throw e;
        }
    }
    
}