import Foundation

enum ResolvedStatus: String {
    case ready
    case playlistCandidate = "playlist_candidate"
    case invalid
    case empty
}

struct ResolvedSelection {
    var status: ResolvedStatus
    var mode: StudyMode?
    var resourceIds: SessionResources
    var label: String
    var message: String
    var playlistKind: PlaylistMediaKind?
    var entries: [CatalogEntry]

    static func empty(_ message: String = "选择文件后自动识别学习方式") -> ResolvedSelection {
        ResolvedSelection(
            status: .empty,
            mode: nil,
            resourceIds: SessionResources(),
            label: "未选择",
            message: message,
            playlistKind: nil,
            entries: []
        )
    }
}

enum SelectionResolver {
    static func resolve(_ entries: [CatalogEntry]) -> ResolvedSelection {
        let usable = entries.filter { $0.kind == .video || $0.kind == .audio || $0.kind == .pdf }
        if usable.isEmpty {
            if !entries.isEmpty {
                var result = ResolvedSelection.empty("仅支持 video / audio / pdf")
                result.status = .invalid
                result.label = "无效"
                result.message = "所选文件类型不支持开课"
                result.entries = entries
                return result
            }
            return .empty()
        }

        let videos = usable.filter { $0.kind == .video }
        let audios = usable.filter { $0.kind == .audio }
        let pdfs = usable.filter { $0.kind == .pdf }
        let v = videos.count
        let a = audios.count
        let p = pdfs.count

        if v > 0 && a > 0 {
            return ResolvedSelection(
                status: .invalid,
                mode: nil,
                resourceIds: SessionResources(),
                label: "无效",
                message: "不能同时选择音频和视频",
                playlistKind: nil,
                entries: usable
            )
        }

        if usable.count == 1 {
            if v == 1 {
                return ResolvedSelection(
                    status: .ready,
                    mode: .singleVideo,
                    resourceIds: SessionResources(video: videos[0].id),
                    label: StudyMode.singleVideo.label,
                    message: "已识别：单视频 · 可开课",
                    playlistKind: .video,
                    entries: usable
                )
            }
            if a == 1 {
                return ResolvedSelection(
                    status: .ready,
                    mode: .singleAudio,
                    resourceIds: SessionResources(audio: audios[0].id),
                    label: StudyMode.singleAudio.label,
                    message: "已识别：单音频 · 可开课",
                    playlistKind: .audio,
                    entries: usable
                )
            }
            return ResolvedSelection(
                status: .ready,
                mode: .singlePdf,
                resourceIds: SessionResources(pdf: pdfs[0].id),
                label: StudyMode.singlePdf.label,
                message: "已识别：单 PDF · 可开课",
                playlistKind: .pdf,
                entries: usable
            )
        }

        if v == 1 && p == 1 && a == 0 {
            return ResolvedSelection(
                status: .ready,
                mode: .videoPdf,
                resourceIds: SessionResources(video: videos[0].id, pdf: pdfs[0].id),
                label: StudyMode.videoPdf.label,
                message: "已识别：video + pdf · 可开课",
                playlistKind: nil,
                entries: usable
            )
        }
        if a == 1 && p == 1 && v == 0 {
            return ResolvedSelection(
                status: .ready,
                mode: .pdfAudio,
                resourceIds: SessionResources(audio: audios[0].id, pdf: pdfs[0].id),
                label: StudyMode.pdfAudio.label,
                message: "已识别：pdf + audio · 可开课",
                playlistKind: nil,
                entries: usable
            )
        }
        if v == 2 && p == 0 && a == 0 {
            return ResolvedSelection(
                status: .ready,
                mode: .dualVideo,
                resourceIds: SessionResources(video: videos[0].id, video2: videos[1].id),
                label: StudyMode.dualVideo.label,
                message: "已识别：双视频 · 可开课",
                playlistKind: nil,
                entries: usable
            )
        }
        if p == 2 && v == 0 && a == 0 {
            return ResolvedSelection(
                status: .ready,
                mode: .dualPdf,
                resourceIds: SessionResources(pdf: pdfs[0].id, pdf2: pdfs[1].id),
                label: StudyMode.dualPdf.label,
                message: "已识别：双 PDF · 可开课",
                playlistKind: nil,
                entries: usable
            )
        }

        if v >= 2 && a == 0 && p == 0 {
            return ResolvedSelection(
                status: .playlistCandidate,
                mode: nil,
                resourceIds: SessionResources(video: videos[0].id),
                label: "视频专辑",
                message: "多个视频 → 可创建专辑连续播放（双视频请只选 2 个）",
                playlistKind: .video,
                entries: usable
            )
        }
        if p >= 2 && v == 0 && a == 0 {
            return ResolvedSelection(
                status: .playlistCandidate,
                mode: nil,
                resourceIds: SessionResources(pdf: pdfs[0].id),
                label: "PDF 专辑",
                message: "多个 PDF → 可创建专辑连续阅读（双 PDF 请只选 2 个）",
                playlistKind: .pdf,
                entries: usable
            )
        }
        if a >= 2 && v == 0 && p == 0 {
            return ResolvedSelection(
                status: .playlistCandidate,
                mode: nil,
                resourceIds: SessionResources(audio: audios[0].id),
                label: "音频专辑",
                message: "多个音频 → 可创建专辑连续播放",
                playlistKind: .audio,
                entries: usable
            )
        }

        return ResolvedSelection(
            status: .invalid,
            mode: nil,
            resourceIds: SessionResources(),
            label: "无效",
            message: "无法识别（请拆成单课或同类专辑）",
            playlistKind: nil,
            entries: usable
        )
    }
}
