// MockAIProvider.swift — S3 가 실 LLM 없이 빌드/프리뷰하기 위한 mock.
//
// 어떤 AIProviderID 로도 가장해 태스크별 canned 응답을 반환한다.
// S3 SwiftUI 프리뷰 / UI 테스트가 이걸 주입해 AI 흐름을 끝까지 그릴 수 있다.

import Foundation

public struct MockAIProvider: AIProvider {
    public let id: AIProviderID
    public let available: Bool
    /// 인위적 지연(ms) — 로딩 UI 확인용.
    public let simulatedLatencyMs: Double

    public init(id: AIProviderID = .onDevice, available: Bool = true, simulatedLatencyMs: Double = 120) {
        self.id = id
        self.available = available
        self.simulatedLatencyMs = simulatedLatencyMs
    }

    public var isAvailable: Bool {
        get async { available }
    }

    public func complete(_ request: AICompletionRequest) async throws -> AICompletionResponse {
        guard available else { throw AIProviderError.unavailable(id) }

        switch request.task {
        case .quickSummarize:
            return AICompletionResponse(
                text: "요약(mock): 엘보 내경 가공 시 공차 +0.1/-0.0 관리와 최종 치수 검사 기록이 핵심.",
                providerUsed: id, confidence: .high, latencyMs: simulatedLatencyMs
            )
        case .memoAssist:
            return AICompletionResponse(
                text: "제목 제안(mock): 엘보 발주 확인 / 태그: 발주, 엘보, 업무",
                providerUsed: id, confidence: .medium, latencyMs: simulatedLatencyMs
            )
        case .askSelection:
            return AICompletionResponse(
                text: "선택 구간 답변(mock): UCS-66 면제 곡선은 재료군과 두께로 MDMT 면제를 판정합니다.",
                providerUsed: id, confidence: .high, latencyMs: simulatedLatencyMs
            )
        case .corpusAsk:
            return AICompletionResponse(
                text: "충격시험 면제는 UCS-66 면제 곡선으로 판정합니다 [1]. 설계 응력비가 낮으면 UCS-66.1로 MDMT를 더 낮출 수 있습니다 [1].",
                providerUsed: .remoteDS,
                citations: [
                    AICitation(n: 1, docId: 4912,
                               title: "ASME Section VIII Div 1 — Impact Test 요건",
                               sectionTitle: "2. UCS-66 면제 곡선",
                               spanText: "재료군과 두께에 따라 MDMT에서의 충격시험 면제 여부를 결정한다.")
                ],
                confidence: .high, latencyMs: 2840
            )
        case .classify:
            return AICompletionResponse(
                text: "분류 제안(mock): Engineering / 압력용기",
                providerUsed: id, confidence: .medium, latencyMs: simulatedLatencyMs
            )
        case .vision:
            return AICompletionResponse(
                text: "비전(mock): 스캔 도면에서 표제란·치수선·용접기호가 식별됨.",
                providerUsed: .specialized, confidence: .medium, latencyMs: 900
            )
        }
    }
}
