import SwiftUI
import SwiftData
import UIKit

struct HomeDeckView: View {
    @Environment(\.modelContext) private var modelContext
    @Query(sort: \LocalCourse.title) private var courses: [LocalCourse]

    @Binding var path: NavigationPath
    var onOpenStudy: (StudySession) -> Void

    @State private var showMenu = false
    @State private var itemPickerCourse: LocalCourse?
    @State private var pickerItems: [AlbumItem] = []
    @State private var errorMessage: String?

    private var store: CourseStore { CourseStore(modelContext: modelContext) }

    private var recent: [LocalCourse] {
        courses
            .filter { $0.lastOpenedAt != nil }
            .sorted { ($0.lastOpenedAt ?? .distantPast) > ($1.lastOpenedAt ?? .distantPast) }
    }

    var body: some View {
        ZStack {
            Color(red: 0.97, green: 0.98, blue: 0.99).ignoresSafeArea()
            VStack(alignment: .leading, spacing: 28) {
                header
                upperShelf
                recentRow
                Spacer(minLength: 0)
            }
            .padding(.horizontal, 28)
            .padding(.top, 12)
            .padding(.bottom, 20)
        }
        .navigationBarHidden(true)
        .sheet(isPresented: $showMenu) {
            ChildMenuView(path: $path, isPresented: $showMenu)
        }
        .sheet(item: $itemPickerCourse) { course in
            ItemPickerSheet(
                course: course,
                items: pickerItems,
                onPick: { index in
                    itemPickerCourse = nil
                    open(course: course, itemIndex: index)
                }
            )
        }
        .alert("无法开始学习", isPresented: Binding(
            get: { errorMessage != nil },
            set: { if !$0 { errorMessage = nil } }
        )) {
            Button("好", role: .cancel) {}
        } message: {
            Text(errorMessage ?? "")
        }
    }

    private var header: some View {
        HStack {
            Text("Stellia")
                .font(.system(size: 28, weight: .bold, design: .rounded))
                .foregroundStyle(Color(red: 0.45, green: 0.72, blue: 0.92))
            Spacer()
            Button {
                showMenu = true
            } label: {
                VStack(alignment: .trailing, spacing: 5) {
                    Capsule().frame(width: 28, height: 3)
                    Capsule().frame(width: 22, height: 3)
                    Capsule().frame(width: 16, height: 3)
                }
                .foregroundStyle(Color(red: 0.25, green: 0.35, blue: 0.55))
                .frame(width: 44, height: 44)
                .contentShape(Rectangle())
            }
            .accessibilityLabel("菜单")
        }
    }

    private var upperShelf: some View {
        Group {
            if courses.isEmpty {
                VStack(spacing: 16) {
                    Text("还没有课程")
                        .font(.title3.weight(.semibold))
                        .foregroundStyle(Color(red: 0.2, green: 0.28, blue: 0.45))
                    Text("请先在电脑 StudyDeck 打开分享，再添加课程")
                        .font(.subheadline)
                        .foregroundStyle(.secondary)
                        .multilineTextAlignment(.center)
                    Button {
                        path.append(ChildRoute.download)
                    } label: {
                        Text("去添加课程")
                            .font(.headline)
                            .padding(.horizontal, 22)
                            .padding(.vertical, 12)
                            .background(Color(red: 0.45, green: 0.72, blue: 0.92))
                            .foregroundStyle(.white)
                            .clipShape(Capsule())
                    }
                }
                .frame(maxWidth: .infinity)
                .padding(.vertical, 36)
            } else {
                ScrollView(.horizontal, showsIndicators: false) {
                    HStack(spacing: 22) {
                        ForEach(courses, id: \.id) { course in
                            Button {
                                handleTap(course)
                            } label: {
                                VStack(spacing: 10) {
                                    courseCover(course)
                                        .frame(width: 120, height: 120)
                                        .clipShape(RoundedRectangle(cornerRadius: 22, style: .continuous))
                                        .shadow(color: .black.opacity(0.08), radius: 8, y: 4)
                                    Text(course.title)
                                        .font(.system(size: 16, weight: .semibold, design: .rounded))
                                        .foregroundStyle(Color(red: 0.15, green: 0.25, blue: 0.45))
                                        .lineLimit(1)
                                        .frame(width: 120)
                                }
                            }
                            .buttonStyle(.plain)
                        }
                    }
                    .padding(.vertical, 8)
                }
            }
        }
    }

    private var recentRow: some View {
        Group {
            if recent.isEmpty {
                EmptyView()
            } else {
                ScrollView(.horizontal, showsIndicators: false) {
                    HStack(spacing: 20) {
                        ForEach(recent, id: \.id) { course in
                            Button {
                                handleTap(course)
                            } label: {
                                recentCard(course)
                            }
                            .buttonStyle(.plain)
                        }
                    }
                    .padding(.vertical, 8)
                }
            }
        }
    }

    private func courseCover(_ course: LocalCourse) -> some View {
        Group {
            if let rel = course.coverRelativePath,
               let url = try? CourseLibrary.fileURL(courseId: course.id, resourcePath: rel),
               let ui = UIImage(contentsOfFile: url.path) {
                Image(uiImage: ui).resizable().scaledToFill()
            } else {
                DefaultCoverArt.view(for: course.id, title: course.title)
            }
        }
    }

    private func recentCard(_ course: LocalCourse) -> some View {
        ZStack {
            courseCover(course)
                .frame(width: 280, height: 160)
                .clipped()
            LinearGradient(
                colors: [.black.opacity(0.05), .black.opacity(0.35)],
                startPoint: .top,
                endPoint: .bottom
            )
            Circle()
                .fill(Color(red: 0.55, green: 0.78, blue: 0.95).opacity(0.85))
                .frame(width: 64, height: 64)
                .overlay(
                    Image(systemName: "play.fill")
                        .font(.title2)
                        .foregroundStyle(.white)
                        .offset(x: 2)
                )
            VStack {
                HStack(spacing: 3) {
                    ForEach(0..<5, id: \.self) { _ in
                        Image(systemName: "star.fill")
                            .font(.caption2)
                            .foregroundStyle(Color(red: 1, green: 0.78, blue: 0.2))
                    }
                    Spacer()
                }
                .padding(10)
                Spacer()
            }
        }
        .frame(width: 280, height: 160)
        .clipShape(RoundedRectangle(cornerRadius: 20, style: .continuous))
        .shadow(color: .black.opacity(0.1), radius: 10, y: 4)
    }

    private func handleTap(_ course: LocalCourse) {
        do {
            let manifest = try CourseLibrary.loadManifest(courseId: course.id)
            if manifest.items.count <= 1 {
                open(course: course, itemIndex: 0)
            } else {
                pickerItems = manifest.items
                itemPickerCourse = course
            }
        } catch {
            errorMessage = error.localizedDescription
        }
    }

    private func open(course: LocalCourse, itemIndex: Int) {
        do {
            let session = try store.startOrResumeSession(course: course, itemIndex: itemIndex)
            onOpenStudy(session)
        } catch {
            errorMessage = error.localizedDescription
        }
    }
}

private struct ItemPickerSheet: View {
    let course: LocalCourse
    let items: [AlbumItem]
    var onPick: (Int) -> Void

    var body: some View {
        NavigationStack {
            List(Array(items.enumerated()), id: \.offset) { index, item in
                Button {
                    onPick(index)
                } label: {
                    VStack(alignment: .leading, spacing: 4) {
                        Text(label(for: item, index: index))
                            .font(.headline)
                        Text(subtitle(for: item))
                            .font(.caption)
                            .foregroundStyle(.secondary)
                    }
                }
            }
            .navigationTitle(course.title)
            .navigationBarTitleDisplayMode(.inline)
        }
    }

    private func label(for item: AlbumItem, index: Int) -> String {
        switch item {
        case .single: return "第 \(index + 1) 课"
        case .combo(let mode, _): return "\(mode.label) · \(index + 1)"
        }
    }

    private func subtitle(for item: AlbumItem) -> String {
        switch item {
        case .single(let id): return id
        case .combo(let mode, _): return mode.rawValue
        }
    }
}
