'use client';

import { useCallback, useRef, useEffect } from 'react';
import { useSpeechRecognition } from '@/hooks/useSpeechRecognition';
import { useRouter } from 'next/navigation';

// ─── 명령 핸들러 인터페이스 ─────────────────────────────────────────
export interface VoiceCommandHandlers {
    // 내비게이션
    onNavigateNew?: () => void;
    onNavigateHome?: () => void;
    onNavigateBack?: () => void;
    onNavigateDaily?: () => void;
    // 검색
    onOpenSearch?: () => void;
    onOpenAISearch?: () => void;
    onOpenWikiSearch?: () => void;
    onOpenVoiceSearch?: () => void;
    // 에디터
    onEditStart?: () => void;
    onEditCancel?: () => void;
    onSaveDocument?: () => void;
    onInsertNewline?: () => void;
    onInsertParagraph?: () => void;
    onInsertChecklist?: () => void;
    onUndo?: () => void;
    // 문서 관리
    onSetPublic?: () => void;
    onSetPrivate?: () => void;
    onDelete?: () => void;
    onOpenHistory?: () => void;
    onOpenAIPanel?: () => void;
    // 녹음 제어
    onDictationStart?: () => void;
    onDictationStop?: () => void;
    onDictationPause?: () => void;
    onConsentRecordStart?: () => void;
    onConsentRecordEnd?: () => void;
    // AI 트리거 (P1 — Gemini 음성 연동)
    onAISummarize?: () => void;
    onAIStructure?: () => void;
    onAIExtract?: () => void;
    onAICompare?: () => void;
    onAIMask?: () => void;
    onAICoach?: () => void;
}

export interface VoiceCommandOptions extends VoiceCommandHandlers {
    enabled?: boolean;
}

export interface VoiceCommandReturn {
    isCommandListening: boolean;
    isSupported: boolean;
    toggleCommandMode: () => void;
}

// ─── 명령어 패턴 정의 (31개, 6그룹) ─────────────────────────────────
interface CommandDef {
    patterns: string[];
    action: string;
    group: 'navigation' | 'search' | 'editor' | 'document' | 'recording' | 'ai';
}

const COMMANDS: CommandDef[] = [
    // ── 내비게이션 (4개) ──
    { patterns: ['새 문서', '새문서', '문서 만들어', '새로 만들어'], action: 'NAV_NEW_DOC', group: 'navigation' },
    { patterns: ['홈으로', '메인으로', '홈', '메인', '메인 페이지'], action: 'NAV_HOME', group: 'navigation' },
    { patterns: ['뒤로 가', '뒤로', '이전 페이지', '뒤로 가줘'], action: 'NAV_BACK', group: 'navigation' },
    { patterns: ['데일리 노트', '오늘 일지', '일일 기록'], action: 'NAV_DAILY', group: 'navigation' },

    // ── 검색 (4개) ──
    { patterns: ['검색', '찾아', '찾아줘', '검색해', '검색해줘'], action: 'SEARCH_OPEN', group: 'search' },
    { patterns: ['ai 검색', '인텔리서치', 'ai한테 물어봐', '에이아이 검색', 'ai 물어봐'], action: 'SEARCH_AI', group: 'search' },
    { patterns: ['위키 검색', '일반 검색', '키워드 검색'], action: 'SEARCH_WIKI', group: 'search' },
    { patterns: ['음성 검색', '말로 검색', '보이스 검색'], action: 'SEARCH_VOICE', group: 'search' },

    // ── 에디터 제어 (7개) ──
    { patterns: ['편집', '편집 모드', '수정', '수정해', '편집해'], action: 'EDIT_START', group: 'editor' },
    { patterns: ['편집 취소', '취소', '그만 편집', '수정 취소'], action: 'EDIT_CANCEL', group: 'editor' },
    { patterns: ['저장', '저장해', '저장해줘'], action: 'EDIT_SAVE', group: 'editor' },
    { patterns: ['줄 바꿔', '다음 줄', '엔터', '줄바꿈'], action: 'EDIT_NEWLINE', group: 'editor' },
    { patterns: ['새 문단', '문단 나눠', '문단 바꿔'], action: 'EDIT_PARAGRAPH', group: 'editor' },
    { patterns: ['할 일', '체크리스트', '할일 추가', '투두', '할 일 추가'], action: 'EDIT_CHECKLIST', group: 'editor' },
    { patterns: ['되돌려', '실행 취소', '언두', '되돌리기', '취소해'], action: 'EDIT_UNDO', group: 'editor' },

    // ── 문서 관리 (5개) ──
    { patterns: ['공개해', '위키로 공개', '팀 공유', '공개로', '공개 전환'], action: 'DOC_PUBLIC', group: 'document' },
    { patterns: ['비공개', '비공개로', '잠가', '잠금', '비공개 전환'], action: 'DOC_PRIVATE', group: 'document' },
    { patterns: ['삭제', '삭제해', '지워줘', '문서 삭제'], action: 'DOC_DELETE', group: 'document' },
    { patterns: ['히스토리', '수정 이력', '변경 이력', '버전 기록'], action: 'DOC_HISTORY', group: 'document' },
    { patterns: ['ai 열어', 'ai 도우미', 'ai 패널', '에이아이', 'ai 어시스턴트'], action: 'DOC_AI_PANEL', group: 'document' },

    // ── 녹음 제어 (5개) ──
    { patterns: ['받아쓰기', '받아쓰기 시작', '딕테이션'], action: 'REC_DICTATION', group: 'recording' },
    { patterns: ['받아쓰기 중지', '중단', '받아쓰기 끝'], action: 'REC_STOP', group: 'recording' },
    { patterns: ['잠깐', '일시정지', '멈춰', '잠시 멈춰'], action: 'REC_PAUSE', group: 'recording' },
    { patterns: ['녹취 시작', '녹음해', '녹음 시작'], action: 'REC_CONSENT_START', group: 'recording' },
    { patterns: ['녹취 종료', '녹음 끝', '녹음 종료', '녹취 끝'], action: 'REC_CONSENT_END', group: 'recording' },

    // ── AI 트리거 (6개, P1 — Gemini 음성 연동) ──
    { patterns: ['요약해줘', '요약해', '이 문서 요약', '문서 요약', '요약 해줘'], action: 'AI_SUMMARIZE', group: 'ai' },
    { patterns: ['구조화해줘', '정리해줘', '구조 정리', '문서 정리해', '깔끔하게 정리'], action: 'AI_STRUCTURE', group: 'ai' },
    { patterns: ['정보 추출', '핵심 뽑아줘', '핵심 추출', '정보 뽑아', '중요한 거 뽑아'], action: 'AI_EXTRACT', group: 'ai' },
    { patterns: ['비교해줘', '비교표 만들어', '비교 분석', '비교해', '비교표'], action: 'AI_COMPARE', group: 'ai' },
    { patterns: ['개인정보 가려', '개인정보 마스킹', 'pii 마스킹', '민감 정보 가려', '개인정보 처리'], action: 'AI_MASK', group: 'ai' },
    { patterns: ['피드백 줘', '코칭해줘', '상담 피드백', '코칭', '피드백'], action: 'AI_COACH', group: 'ai' },
];

// ─── Action → Handler 매핑 ──────────────────────────────────────────
const ACTION_MAP: Record<string, keyof VoiceCommandHandlers> = {
    // 내비게이션
    NAV_NEW_DOC: 'onNavigateNew',
    NAV_HOME: 'onNavigateHome',
    NAV_BACK: 'onNavigateBack',
    NAV_DAILY: 'onNavigateDaily',
    // 검색
    SEARCH_OPEN: 'onOpenSearch',
    SEARCH_AI: 'onOpenAISearch',
    SEARCH_WIKI: 'onOpenWikiSearch',
    SEARCH_VOICE: 'onOpenVoiceSearch',
    // 에디터
    EDIT_START: 'onEditStart',
    EDIT_CANCEL: 'onEditCancel',
    EDIT_SAVE: 'onSaveDocument',
    EDIT_NEWLINE: 'onInsertNewline',
    EDIT_PARAGRAPH: 'onInsertParagraph',
    EDIT_CHECKLIST: 'onInsertChecklist',
    EDIT_UNDO: 'onUndo',
    // 문서 관리
    DOC_PUBLIC: 'onSetPublic',
    DOC_PRIVATE: 'onSetPrivate',
    DOC_DELETE: 'onDelete',
    DOC_HISTORY: 'onOpenHistory',
    DOC_AI_PANEL: 'onOpenAIPanel',
    // 녹음
    REC_DICTATION: 'onDictationStart',
    REC_STOP: 'onDictationStop',
    REC_PAUSE: 'onDictationPause',
    REC_CONSENT_START: 'onConsentRecordStart',
    REC_CONSENT_END: 'onConsentRecordEnd',
    // AI 트리거
    AI_SUMMARIZE: 'onAISummarize',
    AI_STRUCTURE: 'onAIStructure',
    AI_EXTRACT: 'onAIExtract',
    AI_COMPARE: 'onAICompare',
    AI_MASK: 'onAIMask',
    AI_COACH: 'onAICoach',
};

/**
 * 음성 명령 훅 (확장 버전 — 31개 명령, 6개 그룹)
 * 
 * 그룹 1: 내비게이션 — "새 문서", "홈으로", "뒤로", "데일리 노트"
 * 그룹 2: 검색 — "검색해줘", "AI 검색", "위키 검색", "음성 검색"
 * 그룹 3: 에디터 — "편집", "취소", "저장", "줄 바꿔", "새 문단", "할 일", "되돌려"
 * 그룹 4: 문서 관리 — "공개해", "비공개", "삭제", "히스토리", "AI 열어"
 * 그룹 5: 녹음 제어 — "받아쓰기", "중지", "일시정지", "녹취 시작", "녹취 종료"
 * 그룹 6: AI 트리거 — "요약해줘", "정리해줘", "핵심 뽑아줘", "비교해줘", "개인정보 가려", "코칭해줘"
 */
export function useVoiceCommand({
    enabled = true,
    ...handlers
}: VoiceCommandOptions = {}): VoiceCommandReturn {
    const router = useRouter();
    const lastCommandRef = useRef<string>('');
    const handlersRef = useRef<VoiceCommandHandlers>(handlers);

    // handlers가 변경될 때 ref 업데이트
    useEffect(() => {
        handlersRef.current = handlers;
    });

    const matchCommand = useCallback((text: string): string | null => {
        const normalized = text.trim().replace(/\s+/g, ' ').toLowerCase();

        // 더 긴 패턴부터 매칭하여 "편집 취소"가 "편집"보다 먼저 매칭되도록
        let bestMatch: { action: string; patternLength: number } | null = null;

        for (const cmd of COMMANDS) {
            for (const pattern of cmd.patterns) {
                if (normalized.includes(pattern)) {
                    if (!bestMatch || pattern.length > bestMatch.patternLength) {
                        bestMatch = { action: cmd.action, patternLength: pattern.length };
                    }
                }
            }
        }

        return bestMatch?.action ?? null;
    }, []);

    const executeCommand = useCallback((action: string, rawText: string) => {
        // 동일 명령 중복 실행 방지
        if (lastCommandRef.current === rawText) return;
        lastCommandRef.current = rawText;

        // 내비게이션 기본 동작 (handler가 없어도 router로 처리)
        const h = handlersRef.current;

        switch (action) {
            case 'NAV_NEW_DOC':
                if (h.onNavigateNew) h.onNavigateNew();
                else router.push('/new');
                break;
            case 'NAV_HOME':
                if (h.onNavigateHome) h.onNavigateHome();
                else router.push('/');
                break;
            case 'NAV_BACK':
                if (h.onNavigateBack) h.onNavigateBack();
                else router.back();
                break;
            case 'NAV_DAILY':
                if (h.onNavigateDaily) h.onNavigateDaily();
                // 데일리 노트는 기본 동작 없음 (DailyNoteButton이 처리)
                break;
            default: {
                // 나머지 action은 ACTION_MAP으로 handler 호출
                const handlerKey = ACTION_MAP[action];
                if (handlerKey) {
                    const handler = h[handlerKey];
                    if (typeof handler === 'function') {
                        (handler as () => void)();
                    }
                }
                break;
            }
        }

        // 3초 후 중복 방지 해제
        setTimeout(() => { lastCommandRef.current = ''; }, 3000);
    }, [router]);

    const {
        isListening,
        isSupported,
        startListening,
        stopListening,
        resetTranscript,
    } = useSpeechRecognition({
        lang: 'ko-KR',
        continuous: false,
        interimResults: false,
        onResult: (text, isFinal) => {
            if (isFinal) {
                const action = matchCommand(text);
                if (action) {
                    executeCommand(action, text);
                }
            }
        },
    });

    const toggleCommandMode = useCallback(() => {
        if (isListening) {
            stopListening();
        } else {
            resetTranscript();
            startListening();
        }
    }, [isListening, stopListening, resetTranscript, startListening]);

    return {
        isCommandListening: isListening,
        isSupported: isSupported && enabled,
        toggleCommandMode,
    };
}

/**
 * 사용 가능한 전체 명령 목록 반환 (UI 표시용)
 */
export function getAvailableCommands() {
    return COMMANDS.map(cmd => ({
        group: cmd.group,
        action: cmd.action,
        patterns: cmd.patterns,
        primaryPattern: cmd.patterns[0],
    }));
}
