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

import com.unicorn.hgzero.meeting.biz.service.MinutesSectionService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 협업 메시지 처리기
 * WebSocket을 통해 수신된 협업 메시지를 처리하고 비즈니스 로직 수행
 */
@Component
@RequiredArgsConstructor
@Slf4j
public class CollaborationMessageHandler {

    private final MinutesSectionService minutesSectionService;

    /**
     * 협업 메시지 처리
     * @param message 수신된 메시지
     * @return 다른 사용자에게 전송할 메시지 (없으면 null)
     */
    public CollaborationMessage handleMessage(CollaborationMessage message) {
        try {
            switch (message.getType()) {
                case "SECTION_UPDATE":
                    return handleSectionUpdate(message);
                case "SECTION_LOCK":
                    return handleSectionLock(message);
                case "SECTION_UNLOCK":
                    return handleSectionUnlock(message);
                case "CURSOR_MOVE":
                    return handleCursorMove(message);
                case "TYPING_START":
                    return handleTypingStart(message);
                case "TYPING_STOP":
                    return handleTypingStop(message);
                default:
                    log.warn("지원하지 않는 메시지 타입: {}", message.getType());
                    return null;
            }
        } catch (Exception e) {
            log.error("협업 메시지 처리 실패 - type: {}, minutesId: {}, userId: {}", 
                    message.getType(), message.getMinutesId(), message.getUserId(), e);
            
            return CollaborationMessage.builder()
                    .type("ERROR")
                    .minutesId(message.getMinutesId())
                    .userId(message.getUserId())
                    .userName(message.getUserName())
                    .message("메시지 처리 중 오류가 발생했습니다: " + e.getMessage())
                    .timestamp(System.currentTimeMillis())
                    .build();
        }
    }

    /**
     * 섹션 내용 업데이트 처리
     */
    private CollaborationMessage handleSectionUpdate(CollaborationMessage message) {
        log.debug("섹션 업데이트 요청 - sectionId: {}, userId: {}", 
                message.getSectionId(), message.getUserId());

        try {
            // 섹션 내용 업데이트
            minutesSectionService.updateSectionContent(
                    message.getSectionId(), 
                    message.getContent(), 
                    message.getUserId()
            );

            // 다른 사용자에게 업데이트 알림
            return CollaborationMessage.builder()
                    .type("SECTION_UPDATED")
                    .minutesId(message.getMinutesId())
                    .sectionId(message.getSectionId())
                    .content(message.getContent())
                    .userId(message.getUserId())
                    .userName(message.getUserName())
                    .timestamp(System.currentTimeMillis())
                    .build();

        } catch (Exception e) {
            log.error("섹션 업데이트 실패 - sectionId: {}", message.getSectionId(), e);
            throw e;
        }
    }

    /**
     * 섹션 잠금 처리
     */
    private CollaborationMessage handleSectionLock(CollaborationMessage message) {
        log.debug("섹션 잠금 요청 - sectionId: {}, userId: {}", 
                message.getSectionId(), message.getUserId());

        try {
            // 섹션 잠금
            minutesSectionService.lockSection(message.getSectionId(), message.getUserId());

            // 다른 사용자에게 잠금 알림
            return CollaborationMessage.builder()
                    .type("SECTION_LOCKED")
                    .minutesId(message.getMinutesId())
                    .sectionId(message.getSectionId())
                    .userId(message.getUserId())
                    .userName(message.getUserName())
                    .timestamp(System.currentTimeMillis())
                    .build();

        } catch (Exception e) {
            log.error("섹션 잠금 실패 - sectionId: {}", message.getSectionId(), e);
            throw e;
        }
    }

    /**
     * 섹션 잠금 해제 처리
     */
    private CollaborationMessage handleSectionUnlock(CollaborationMessage message) {
        log.debug("섹션 잠금 해제 요청 - sectionId: {}, userId: {}", 
                message.getSectionId(), message.getUserId());

        try {
            // 섹션 잠금 해제
            minutesSectionService.unlockSection(message.getSectionId(), message.getUserId());

            // 다른 사용자에게 잠금 해제 알림
            return CollaborationMessage.builder()
                    .type("SECTION_UNLOCKED")
                    .minutesId(message.getMinutesId())
                    .sectionId(message.getSectionId())
                    .userId(message.getUserId())
                    .userName(message.getUserName())
                    .timestamp(System.currentTimeMillis())
                    .build();

        } catch (Exception e) {
            log.error("섹션 잠금 해제 실패 - sectionId: {}", message.getSectionId(), e);
            throw e;
        }
    }

    /**
     * 커서 이동 처리
     */
    private CollaborationMessage handleCursorMove(CollaborationMessage message) {
        // 커서 이동은 단순히 다른 사용자에게 전달만 함
        return CollaborationMessage.builder()
                .type("CURSOR_MOVED")
                .minutesId(message.getMinutesId())
                .sectionId(message.getSectionId())
                .position(message.getPosition())
                .userId(message.getUserId())
                .userName(message.getUserName())
                .timestamp(System.currentTimeMillis())
                .build();
    }

    /**
     * 타이핑 시작 처리
     */
    private CollaborationMessage handleTypingStart(CollaborationMessage message) {
        return CollaborationMessage.builder()
                .type("TYPING_STARTED")
                .minutesId(message.getMinutesId())
                .sectionId(message.getSectionId())
                .userId(message.getUserId())
                .userName(message.getUserName())
                .timestamp(System.currentTimeMillis())
                .build();
    }

    /**
     * 타이핑 종료 처리
     */
    private CollaborationMessage handleTypingStop(CollaborationMessage message) {
        return CollaborationMessage.builder()
                .type("TYPING_STOPPED")
                .minutesId(message.getMinutesId())
                .sectionId(message.getSectionId())
                .userId(message.getUserId())
                .userName(message.getUserName())
                .timestamp(System.currentTimeMillis())
                .build();
    }
}