package com.unicorn.hgzero.meeting.biz.service;

import com.unicorn.hgzero.meeting.biz.domain.Dashboard;
import com.unicorn.hgzero.meeting.biz.domain.Meeting;
import com.unicorn.hgzero.meeting.biz.usecase.in.dashboard.GetDashboardUseCase;
import com.unicorn.hgzero.meeting.biz.usecase.out.DashboardReader;
import com.unicorn.hgzero.meeting.biz.usecase.out.MeetingReader;
import com.unicorn.hgzero.meeting.biz.usecase.out.MeetingWriter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

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

/**
 * 대시보드 Service
 * Dashboard 관련 모든 UseCase 구현
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class DashboardService implements GetDashboardUseCase {

    private final DashboardReader dashboardReader;
    private final MeetingReader meetingReader;
    private final MeetingWriter meetingWriter;

    /**
     * 사용자 대시보드 조회
     */
    @Override
    @Transactional
    public Dashboard getDashboard(String userId) {
        log.debug("Getting dashboard for user: {}", userId);

        // 대시보드 조회 전 회의 상태 자동 업데이트
        updateMeetingStatusesIfNeeded();

        return dashboardReader.getDashboardByUserId(userId);
    }

    /**
     * 사용자 대시보드 (기간 필터) 조회
     */
    @Override
    @Transactional
    public Dashboard getDashboardByPeriod(String userId, String period) {
        log.debug("Getting dashboard for user: {} with period: {}", userId, period);

        // 대시보드 조회 전 회의 상태 자동 업데이트
        updateMeetingStatusesIfNeeded();

        return dashboardReader.getDashboardByUserIdAndPeriod(userId, period);
    }

    /**
     * 시간이 지난 SCHEDULED 회의들을 IN_PROGRESS로 상태 변경
     */
    private void updateMeetingStatusesIfNeeded() {
        LocalDateTime now = LocalDateTime.now();
        
        try {
            // SCHEDULED 상태이면서 시작 시간이 지난 회의들 조회
            List<Meeting> meetingsToStart = meetingReader.findScheduledMeetingsBeforeTime(now);
            
            if (!meetingsToStart.isEmpty()) {
                log.info("Found {} meetings to update status to IN_PROGRESS", meetingsToStart.size());
                
                for (Meeting meeting : meetingsToStart) {
                    // 회의 시작 처리 (상태를 IN_PROGRESS로 변경)
                    meeting.start();
                    meetingWriter.save(meeting);
                    
                    log.debug("Updated meeting status to IN_PROGRESS: meetingId={}, title={}", 
                             meeting.getMeetingId(), meeting.getTitle());
                }
            }
        } catch (Exception e) {
            log.error("Failed to update meeting statuses", e);
            // 상태 업데이트 실패해도 대시보드 조회는 계속 진행
        }
    }
}
