import Foundation

enum AlbumDraftHelper {
    static func preferAlbumMode(resolved: ResolvedSelection) -> AlbumMode {
        let sameTypePlaylist =
            resolved.playlistKind != nil
            && !resolved.entries.isEmpty
            && resolved.entries.allSatisfy { $0.kind == resolved.playlistKind?.resourceKind }
        if resolved.status == .playlistCandidate { return .playlist }
        if resolved.status == .ready,
           let mode = resolved.mode,
           AlbumSessionHelper.comboItemFromResolved(mode: mode, resourceIds: resolved.resourceIds) != nil {
            return .combo
        }
        return sameTypePlaylist ? .playlist : .combo
    }

    static func emptyDraft(title: String, mode: AlbumMode, mediaKind: PlaylistMediaKind?) -> Album {
        Album(title: title, mode: mode, mediaKind: mediaKind, items: [])
    }

    static func buildDraftFromSelection(
        mode: AlbumMode,
        resolved: ResolvedSelection,
        title: String
    ) -> (album: Album, error: String?) {
        let mediaKind = resolved.playlistKind
        if mode == .playlist {
            guard let mediaKind, !resolved.entries.isEmpty else {
                return (emptyDraft(title: title, mode: .playlist, mediaKind: nil), "专辑需要勾选同类 video / audio / pdf")
            }
            guard resolved.entries.allSatisfy({ $0.kind == mediaKind.resourceKind }) else {
                return (emptyDraft(title: title, mode: .playlist, mediaKind: mediaKind), "专辑只能包含同一类型文件")
            }
            let album = Album(
                title: title,
                mode: .playlist,
                mediaKind: mediaKind,
                items: resolved.entries.map { .single(resourceId: $0.id) }
            )
            return (album, nil)
        }

        guard resolved.status == .ready, let studyMode = resolved.mode else {
            return (emptyDraft(title: title, mode: .combo, mediaKind: nil), "课程请先勾选一组可配对文件（如 video+pdf / 双视频）")
        }
        guard let item = AlbumSessionHelper.comboItemFromResolved(mode: studyMode, resourceIds: resolved.resourceIds) else {
            return (emptyDraft(title: title, mode: .combo, mediaKind: nil), "课程不能用单文件；请改用专辑，或勾选对照配对")
        }
        let album = Album(title: title, mode: .combo, mediaKind: nil, items: [item])
        return (album, nil)
    }

    static func togglePlaylistDraftEntry(draft: Album, entry: CatalogEntry) -> (album: Album, error: String?, selected: Bool) {
        guard draft.mode == .playlist else {
            return (draft, "当前不是专辑", false)
        }
        guard entry.kind == .video || entry.kind == .audio || entry.kind == .pdf else {
            return (draft, "仅支持 video / audio / pdf", false)
        }

        var items = draft.items
        if let idx = items.firstIndex(where: {
            if case .single(let id) = $0 { return id == entry.id }
            return false
        }) {
            items.remove(at: idx)
            draft.items = items
            if items.isEmpty { draft.mediaKind = nil }
            return (draft, nil, false)
        }

        if let mediaKind = draft.mediaKind, entry.kind != mediaKind.resourceKind {
            return (draft, "专辑只能添加 \(mediaKind.rawValue) 文件", false)
        }

        draft.mediaKind = draft.mediaKind ?? PlaylistMediaKind(resourceKind: entry.kind)
        items.append(.single(resourceId: entry.id))
        draft.items = items
        return (draft, nil, true)
    }

    static func appendSelectionToDraft(draft: Album, resolved: ResolvedSelection) -> (album: Album, error: String?) {
        if draft.mode == .playlist {
            guard let playlistKind = resolved.playlistKind, !resolved.entries.isEmpty else {
                return (draft, "请勾选同类文件后添加")
            }
            if let mediaKind = draft.mediaKind,
               resolved.entries.contains(where: { $0.kind != mediaKind.resourceKind }) {
                return (draft, "只能追加与专辑相同类型的文件")
            }
            let mediaKind = draft.mediaKind ?? playlistKind
            let existing = Set(draft.items.compactMap { item -> String? in
                if case .single(let id) = item { return id }
                return nil
            })
            let added = resolved.entries
                .filter { $0.kind == mediaKind.resourceKind && !existing.contains($0.id) }
                .map { AlbumItem.single(resourceId: $0.id) }
            guard !added.isEmpty else {
                return (draft, "没有可追加的新文件")
            }
            draft.mediaKind = mediaKind
            draft.items = draft.items + added
            return (draft, nil)
        }

        guard resolved.status == .ready, let mode = resolved.mode else {
            return (draft, "请勾选一组可配对文件后再添加")
        }
        guard let item = AlbumSessionHelper.comboItemFromResolved(mode: mode, resourceIds: resolved.resourceIds) else {
            return (draft, "课程只能添加对照配对")
        }
        draft.items = draft.items + [item]
        return (draft, nil)
    }
}
