//
//  DailyQuestsView.swift
//  lichunWebsocket
//
//  Daily quest system with progress tracking and rewards
//

import SwiftUI

struct DailyQuestsView: View {
    @EnvironmentObject var webSocketService: WebSocketService
    @Environment(\.dismiss) var dismiss
    @State private var selectedQuest: DailyQuest?

    var state: DailyQuestsState? {
        webSocketService.dailyQuestsState
    }

    var completedCount: Int {
        state?.quests.filter { $0.completed }.count ?? 0
    }

    var totalCount: Int {
        state?.quests.count ?? 0
    }

    var claimableCount: Int {
        state?.quests.filter { $0.canClaim }.count ?? 0
    }

    var body: some View {
        NavigationView {
            ZStack {
                // Cozy background
                AppColors.background.ignoresSafeArea()

                ScrollView {
                    VStack(spacing: AppSpacing.lg) {
                        // Header with warm, inviting icon and title
                        VStack(spacing: AppSpacing.sm) {
                            ZStack {
                                // Warm glow
                                Circle()
                                    .fill(
                                        LinearGradient(
                                            colors: [
                                                Color(red: 1.0, green: 0.84, blue: 0.0).opacity(0.3),
                                                Color(red: 1.0, green: 0.65, blue: 0.0).opacity(0.2)
                                            ],
                                            startPoint: .topLeading,
                                            endPoint: .bottomTrailing
                                        )
                                    )
                                    .frame(width: 100, height: 100)
                                    .blur(radius: 10)

                                Circle()
                                    .fill(
                                        LinearGradient(
                                            colors: [
                                                Color(red: 1.0, green: 0.84, blue: 0.0).opacity(0.15),
                                                Color(red: 0.85, green: 0.65, blue: 0.13).opacity(0.1)
                                            ],
                                            startPoint: .top,
                                            endPoint: .bottom
                                        )
                                    )
                                    .frame(width: 80, height: 80)

                                Image(systemName: "checklist")
                                    .font(.system(size: 40))
                                    .foregroundStyle(
                                        LinearGradient(
                                            colors: [
                                                Color(red: 1.0, green: 0.84, blue: 0.0),
                                                Color(red: 0.85, green: 0.65, blue: 0.13)
                                            ],
                                            startPoint: .top,
                                            endPoint: .bottom
                                        )
                                    )
                            }

                            Text("Daily Quests")
                                .font(.system(size: 28, weight: .bold, design: .rounded))
                                .foregroundColor(AppColors.primaryText)

                            Text("Complete quests to earn amazing rewards!")
                                .font(.appBody)
                                .foregroundColor(AppColors.secondaryText)
                                .multilineTextAlignment(.center)

                            if claimableCount > 0 {
                                Text("You have \(claimableCount) reward\(claimableCount == 1 ? "" : "s") to claim!")
                                    .font(.appCaptionBold)
                                    .foregroundColor(Color(red: 1.0, green: 0.65, blue: 0.0))
                                    .italic()
                            }
                        }
                        .padding(.top, AppSpacing.lg)

                        // Progress Summary
                        ProgressSummaryCard(
                            completed: completedCount,
                            total: totalCount,
                            claimable: claimableCount
                        )

                        // Quest depth: full-clear streak + weekly challenge
                        // (sourced from the cached questEngagement snapshot).
                        QuestDepthSection(
                            engagement: webSocketService.player.questEngagement
                        )
                        .padding(.horizontal, AppSpacing.md)

                        // Quests List
                        if let state = state {
                            VStack(spacing: AppSpacing.md) {
                                ForEach(state.quests) { quest in
                                    QuestCard(
                                        quest: quest,
                                        onClaim: {
                                            claimQuest(quest: quest)
                                        }
                                    )
                                }
                            }
                            .padding(.horizontal, AppSpacing.md)
                        } else {
                            // Loading state
                            VStack(spacing: AppSpacing.md) {
                                ProgressView()
                                    .scaleEffect(1.5)
                                Text("Loading quests...")
                                    .font(.appBody)
                                    .foregroundColor(AppColors.secondaryText)
                            }
                            .frame(maxWidth: .infinity)
                            .padding(AppSpacing.xl)
                        }

                        // Info Footer
                        QuestInfoFooter()
                            .padding(.bottom, AppSpacing.xl)
                    }
                }
            }
            .navigationBarTitleDisplayMode(.inline)
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button(action: { dismiss() }) {
                        Image(systemName: "xmark.circle.fill")
                            .font(.title3)
                            .foregroundColor(AppColors.secondaryText)
                    }
                }
            }
        }
        .onAppear {
            webSocketService.fetchDailyQuests()
            AnalyticsManager.shared.trackScreenView("daily_quests", screenClass: "DailyQuestsView")
        }
    }

    private func claimQuest(quest: DailyQuest) {
        webSocketService.claimQuestReward(questId: quest.id)
        AnalyticsManager.shared.track(.purchaseCompleted(
            itemId: "quest_\(quest.id)",
            itemName: quest.name,
            price: quest.reward.diamonds
        ))
    }
}

// MARK: - Supporting Views

struct ProgressSummaryCard: View {
    let completed: Int
    let total: Int
    let claimable: Int

    var progressPercentage: Double {
        guard total > 0 else { return 0 }
        return Double(completed) / Double(total)
    }

    var body: some View {
        VStack(spacing: AppSpacing.sm) {
            HStack(spacing: AppSpacing.lg) {
                // Completed count
                VStack(spacing: AppSpacing.xs) {
                    HStack(spacing: 4) {
                        Image(systemName: "checkmark.circle.fill")
                            .font(.title3)
                            .foregroundColor(AppColors.success)
                        Text("\(completed)")
                            .font(.system(size: 22, weight: .bold, design: .rounded))
                            .foregroundColor(AppColors.primaryText)
                    }
                    Text("Completed")
                        .font(.appCaption)
                        .foregroundColor(AppColors.secondaryText)
                }
                .frame(maxWidth: .infinity)

                Divider()
                    .frame(height: 40)

                // Total count
                VStack(spacing: AppSpacing.xs) {
                    Text("\(total)")
                        .font(.system(size: 22, weight: .bold, design: .rounded))
                        .foregroundColor(AppColors.primaryText)
                    Text("Total Quests")
                        .font(.appCaption)
                        .foregroundColor(AppColors.secondaryText)
                }
                .frame(maxWidth: .infinity)

                // Claimable count (if any)
                if claimable > 0 {
                    Divider()
                        .frame(height: 40)

                    VStack(spacing: AppSpacing.xs) {
                        HStack(spacing: 4) {
                            Image(systemName: "gift.fill")
                                .font(.title3)
                                .foregroundColor(.yellow)
                            Text("\(claimable)")
                                .font(.system(size: 22, weight: .bold, design: .rounded))
                                .foregroundColor(AppColors.primaryText)
                        }
                        Text("Can Claim")
                            .font(.appCaption)
                            .foregroundColor(AppColors.secondaryText)
                    }
                    .frame(maxWidth: .infinity)
                }
            }
            .padding(AppSpacing.md)

            // Progress bar
            GeometryReader { geometry in
                ZStack(alignment: .leading) {
                    Rectangle()
                        .fill(AppColors.disabledText.opacity(0.2))
                        .frame(height: 8)
                        .cornerRadius(4)

                    Rectangle()
                        .fill(
                            LinearGradient(
                                colors: [AppColors.success, AppColors.success.opacity(0.7)],
                                startPoint: .leading,
                                endPoint: .trailing
                            )
                        )
                        .frame(width: geometry.size.width * progressPercentage, height: 8)
                        .cornerRadius(4)
                        .animation(.easeInOut(duration: 0.3), value: progressPercentage)
                }
            }
            .frame(height: 8)
            .padding(.horizontal, AppSpacing.md)

            Text("\(Int(progressPercentage * 100))% Complete")
                .font(.appCaption)
                .foregroundColor(AppColors.secondaryText)
        }
        .padding(AppSpacing.md)
        .background(
            LinearGradient(
                colors: [AppColors.success.opacity(0.1), AppColors.primary.opacity(0.1)],
                startPoint: .topLeading,
                endPoint: .bottomTrailing
            )
        )
        .cornerRadius(AppSpacing.cornerRadius)
        .overlay(
            RoundedRectangle(cornerRadius: AppSpacing.cornerRadius)
                .stroke(AppColors.success.opacity(0.3), lineWidth: 1)
        )
        .padding(.horizontal, AppSpacing.md)
    }
}

struct QuestCard: View {
    let quest: DailyQuest
    let onClaim: () -> Void

    var cardState: CardState {
        if quest.claimed {
            return .claimed
        } else if quest.completed {
            return .completed
        } else {
            return .inProgress
        }
    }

    enum CardState {
        case inProgress, completed, claimed
    }

    var body: some View {
        VStack(alignment: .leading, spacing: AppSpacing.sm) {
            // Header: Category icon, name, and status
            HStack(spacing: AppSpacing.sm) {
                // Category icon
                ZStack {
                    Circle()
                        .fill(categoryColor.opacity(0.15))
                        .frame(width: 44, height: 44)

                    Image(systemName: quest.category.icon)
                        .font(.system(size: 20))
                        .foregroundColor(categoryColor)
                }

                VStack(alignment: .leading, spacing: 2) {
                    Text(quest.name)
                        .font(.appHeadline)
                        .foregroundColor(AppColors.primaryText)
                        .lineLimit(1)

                    HStack(spacing: 4) {
                        Image(systemName: statusIcon)
                            .font(.caption2)
                        Text(quest.category.rawValue)
                            .font(.appCaption)
                    }
                    .foregroundColor(AppColors.secondaryText)
                }

                Spacer()

                // Status indicator
                statusBadge
            }

            // Description
            Text(quest.description)
                .font(.appBody)
                .foregroundColor(AppColors.secondaryText)
                .lineLimit(2)

            // Progress bar
            if !quest.claimed {
                VStack(spacing: AppSpacing.xs) {
                    HStack {
                        Text(quest.progressText)
                            .font(.appCaptionBold)
                            .foregroundColor(AppColors.primaryText)

                        Spacer()

                        Text("\(Int(quest.progressPercentage * 100))%")
                            .font(.appCaption)
                            .foregroundColor(AppColors.secondaryText)
                    }

                    GeometryReader { geometry in
                        ZStack(alignment: .leading) {
                            Rectangle()
                                .fill(AppColors.disabledText.opacity(0.2))
                                .frame(height: 6)
                                .cornerRadius(3)

                            Rectangle()
                                .fill(progressBarColor)
                                .frame(width: geometry.size.width * quest.progressPercentage, height: 6)
                                .cornerRadius(3)
                                .animation(.easeInOut(duration: 0.3), value: quest.progressPercentage)
                        }
                    }
                    .frame(height: 6)
                }
            }

            // Rewards and claim button
            HStack(spacing: AppSpacing.sm) {
                // Rewards display
                HStack(spacing: 8) {
                    if quest.reward.diamonds > 0 {
                        HStack(spacing: 4) {
                            Image(systemName: "gem.fill")
                                .font(.caption)
                                .foregroundColor(AppColors.diamond)
                            Text("\(quest.reward.diamonds)")
                                .font(.appBody)
                                .foregroundColor(AppColors.primaryText)
                        }
                    }

                    if let energy = quest.reward.energy, energy > 0 {
                        HStack(spacing: 4) {
                            Image(systemName: "bolt.fill")
                                .font(.caption)
                                .foregroundColor(AppColors.energy)
                            Text("\(energy)")
                                .font(.appBody)
                                .foregroundColor(AppColors.primaryText)
                        }
                    }

                    if let money = quest.reward.money, money > 0 {
                        HStack(spacing: 4) {
                            Image(systemName: "dollarsign.circle.fill")
                                .font(.caption)
                                .foregroundColor(AppColors.money)
                            Text("\(money)")
                                .font(.appBody)
                                .foregroundColor(AppColors.primaryText)
                        }
                    }
                }

                Spacer()

                // Claim button with warm golden styling
                if quest.canClaim {
                    Button(action: onClaim) {
                        HStack(spacing: 6) {
                            Image(systemName: "gift.fill")
                                .font(.caption)
                            Text("Claim")
                                .font(.system(size: 16, weight: .semibold, design: .rounded))
                        }
                        .foregroundColor(.white)
                        .padding(.horizontal, AppSpacing.md)
                        .padding(.vertical, AppSpacing.sm)
                        .background(
                            LinearGradient(
                                colors: [
                                    Color(red: 1.0, green: 0.65, blue: 0.0),
                                    Color(red: 0.85, green: 0.5, blue: 0.0)
                                ],
                                startPoint: .topLeading,
                                endPoint: .bottomTrailing
                            )
                        )
                        .cornerRadius(AppSpacing.pillCornerRadius)
                        .shadow(
                            color: Color(red: 1.0, green: 0.65, blue: 0.0).opacity(0.4),
                            radius: 8,
                            x: 0,
                            y: 4
                        )
                    }
                }
            }
        }
        .padding(AppSpacing.md)
        .background(backgroundColor)
        .cornerRadius(AppSpacing.cornerRadius)
        .overlay(
            RoundedRectangle(cornerRadius: AppSpacing.cornerRadius)
                .stroke(borderColor, lineWidth: quest.completed && !quest.claimed ? 2 : 1)
        )
        .shadow(
            color: Color.black.opacity(quest.completed && !quest.claimed ? 0.1 : 0.05),
            radius: AppSpacing.Shadow.radiusSoft,
            x: 0,
            y: AppSpacing.Shadow.offsetY
        )
    }

    var categoryColor: Color {
        switch quest.category {
        case .social:
            return AppColors.loveInterest
        case .career:
            return AppColors.info
        case .activities:
            return AppColors.success
        case .education:
            return AppColors.intelligence
        case .wealth:
            return AppColors.money
        }
    }

    var statusIcon: String {
        switch cardState {
        case .claimed:
            return "checkmark.seal.fill"
        case .completed:
            return "star.fill"
        case .inProgress:
            return "chart.bar.fill"
        }
    }

    var statusBadge: some View {
        Group {
            if quest.claimed {
                HStack(spacing: 4) {
                    Image(systemName: "checkmark.circle.fill")
                        .font(.caption)
                    Text("Claimed")
                        .font(.appCaption)
                }
                .foregroundColor(AppColors.success)
                .padding(.horizontal, AppSpacing.sm)
                .padding(.vertical, 4)
                .background(AppColors.success.opacity(0.15))
                .cornerRadius(AppSpacing.smallCornerRadius)
            } else if quest.completed {
                HStack(spacing: 4) {
                    Image(systemName: "star.fill")
                        .font(.caption)
                    Text("Ready")
                        .font(.appCaption)
                }
                .foregroundColor(AppColors.accent)
                .padding(.horizontal, AppSpacing.sm)
                .padding(.vertical, 4)
                .background(AppColors.accent.opacity(0.15))
                .cornerRadius(AppSpacing.smallCornerRadius)
            } else {
                HStack(spacing: 4) {
                    Image(systemName: "clock.fill")
                        .font(.caption)
                    Text("Active")
                        .font(.appCaption)
                }
                .foregroundColor(AppColors.info)
                .padding(.horizontal, AppSpacing.sm)
                .padding(.vertical, 4)
                .background(AppColors.info.opacity(0.15))
                .cornerRadius(AppSpacing.smallCornerRadius)
            }
        }
    }

    var progressBarColor: LinearGradient {
        if quest.completed {
            return LinearGradient(
                colors: [AppColors.success, AppColors.success.opacity(0.7)],
                startPoint: .leading,
                endPoint: .trailing
            )
        } else {
            return LinearGradient(
                colors: [AppColors.primary, AppColors.primary.opacity(0.7)],
                startPoint: .leading,
                endPoint: .trailing
            )
        }
    }

    var backgroundColor: Color {
        switch cardState {
        case .claimed:
            return AppColors.success.opacity(0.05)
        case .completed:
            return AppColors.primary.opacity(0.1)
        case .inProgress:
            return AppColors.surfaceElevated
        }
    }

    var borderColor: Color {
        switch cardState {
        case .claimed:
            return AppColors.success.opacity(0.2)
        case .completed:
            return AppColors.primary
        case .inProgress:
            return AppColors.disabledText.opacity(0.2)
        }
    }
}

struct QuestInfoFooter: View {
    var body: some View {
        VStack(spacing: AppSpacing.xs) {
            Image(systemName: "sparkles")
                .font(.title3)
                .foregroundStyle(
                    LinearGradient(
                        colors: [
                            Color(red: 1.0, green: 0.84, blue: 0.0),
                            Color(red: 0.85, green: 0.65, blue: 0.13)
                        ],
                        startPoint: .topLeading,
                        endPoint: .bottomTrailing
                    )
                )

            Text("Quests reset daily at midnight")
                .font(.appCaption)
                .foregroundColor(AppColors.primaryText)
                .multilineTextAlignment(.center)

            Text("Every quest you complete brings you closer to greatness!")
                .font(.appSmall)
                .foregroundColor(AppColors.secondaryText)
                .multilineTextAlignment(.center)
                .italic()
        }
        .padding(AppSpacing.md)
        .background(
            LinearGradient(
                colors: [
                    Color(red: 1.0, green: 0.84, blue: 0.0).opacity(0.08),
                    Color(red: 1.0, green: 0.65, blue: 0.0).opacity(0.05)
                ],
                startPoint: .topLeading,
                endPoint: .bottomTrailing
            )
        )
        .cornerRadius(AppSpacing.cornerRadius)
        .overlay(
            RoundedRectangle(cornerRadius: AppSpacing.cornerRadius)
                .stroke(Color(red: 1.0, green: 0.84, blue: 0.0).opacity(0.3), lineWidth: 1)
        )
        .padding(.horizontal, AppSpacing.md)
    }
}

// MARK: - Preview
// Preview removed - requires backend connection
