//
//  DateActivitySelectionView.swift
//  lichunWebsocket
//
//  Grid/list of available date activities with costs and expected results
//

import SwiftUI

// MARK: - Data Models

class DateActivity: Identifiable, Decodable {
    let id: String
    let name: String
    let icon: String
    let energyCost: Int
    let moneyCost: Int
    let diamondCost: Int
    let minAffinityGain: Int
    let maxAffinityGain: Int
    let premium: Bool
    let hasMiniGame: Bool
    let description: String

    init(
        id: String,
        name: String,
        icon: String,
        energyCost: Int,
        moneyCost: Int,
        diamondCost: Int,
        minAffinityGain: Int,
        maxAffinityGain: Int,
        premium: Bool,
        hasMiniGame: Bool,
        description: String = ""
    ) {
        self.id = id
        self.name = name
        self.icon = icon
        self.energyCost = energyCost
        self.moneyCost = moneyCost
        self.diamondCost = diamondCost
        self.minAffinityGain = minAffinityGain
        self.maxAffinityGain = maxAffinityGain
        self.premium = premium
        self.hasMiniGame = hasMiniGame
        self.description = description
    }

    var affinityRange: String {
        return "\(minAffinityGain)-\(maxAffinityGain)"
    }
}

// MARK: - Date Activity Selection View

struct DateActivitySelectionView: View {
    @EnvironmentObject var webSocketService: WebSocketService
    @Environment(\.dismiss) var dismiss

    let partner: Person
    let onActivitySelected: ((DateActivity) -> Void)?

    @State private var selectedActivity: DateActivity?
    @State private var showAffordableOnly: Bool = false
    @State private var activities: [DateActivity] = []

    // Columns for grid layout
    private let columns = [
        GridItem(.flexible(), spacing: AppSpacing.sm),
        GridItem(.flexible(), spacing: AppSpacing.sm)
    ]

    var body: some View {
        ZStack {
            // Romantic gradient background
            LinearGradient(
                colors: [
                    Color(hex: 0xFFE8F0).opacity(0.4),
                    AppColors.background,
                    Color(hex: 0xF5E8FF).opacity(0.3),
                    AppColors.background
                ],
                startPoint: .topLeading,
                endPoint: .bottomTrailing
            )
            .ignoresSafeArea()

            VStack(spacing: 0) {
                // Header
                headerSection

                // Divider with romantic styling
                Rectangle()
                    .fill(
                        LinearGradient(
                            colors: [
                                AppColors.primary.opacity(0.0),
                                AppColors.primary.opacity(0.2),
                                AppColors.primary.opacity(0.0)
                            ],
                            startPoint: .leading,
                            endPoint: .trailing
                        )
                    )
                    .frame(height: 1)

                // Filter toggle
                filterSection

                // Activities grid
                ScrollView {
                    LazyVGrid(columns: columns, spacing: AppSpacing.md) {
                        ForEach(filteredActivities) { activity in
                            activityCard(activity)
                        }
                    }
                    .padding(AppSpacing.md)
                    .padding(.bottom, AppSpacing.xxl)
                }
            }
        }
        .onAppear {
            loadActivities()
        }
    }

    // MARK: - Header Section

    private var headerSection: some View {
        VStack(spacing: AppSpacing.sm) {
            HStack {
                // Close button with romantic styling
                Button(action: {
                    hapticFeedback(style: .light)
                    dismiss()
                }) {
                    ZStack {
                        Circle()
                            .fill(AppColors.cardBackground)
                            .frame(width: 36, height: 36)

                        Image(systemName: "xmark")
                            .font(.system(size: 16, weight: .semibold))
                            .foregroundColor(AppColors.secondaryText)
                    }
                }

                Spacer()

                // Title with romantic styling
                VStack(spacing: 4) {
                    HStack(spacing: AppSpacing.xs) {
                        Image(systemName: "heart.fill")
                            .font(.system(size: 18))
                            .foregroundStyle(
                                LinearGradient(
                                    colors: [
                                        AppColors.primary,
                                        AppColors.primaryDark
                                    ],
                                    startPoint: .top,
                                    endPoint: .bottom
                                )
                            )

                        Text("Choose Date Activity")
                            .font(.appTitle)
                            .foregroundColor(AppColors.primaryText)

                        Image(systemName: "heart.fill")
                            .font(.system(size: 18))
                            .foregroundStyle(
                                LinearGradient(
                                    colors: [
                                        AppColors.primary,
                                        AppColors.primaryDark
                                    ],
                                    startPoint: .top,
                                    endPoint: .bottom
                                )
                            )
                    }

                    HStack(spacing: 4) {
                        Text("with")
                            .font(.appCaption)
                            .foregroundColor(AppColors.secondaryText)

                        Text(partner.firstname)
                            .font(.appBody)
                            .foregroundColor(AppColors.primary)
                    }
                }

                Spacer()

                // Placeholder for symmetry
                Color.clear
                    .frame(width: 36, height: 36)
            }
        }
        .padding(.horizontal, AppSpacing.md)
        .padding(.vertical, AppSpacing.md)
        .background(AppColors.cardBackground.opacity(0.7))
    }

    // MARK: - Filter Section

    private var filterSection: some View {
        HStack {
            HStack(spacing: AppSpacing.xs) {
                Image(systemName: "sparkles")
                    .font(.system(size: 14))
                    .foregroundColor(AppColors.accent)

                Text("Show affordable only")
                    .font(.appBody)
                    .foregroundColor(AppColors.primaryText)
            }

            Spacer()

            Toggle("", isOn: $showAffordableOnly)
                .labelsHidden()
                .tint(AppColors.primary)
        }
        .padding(.horizontal, AppSpacing.md)
        .padding(.vertical, AppSpacing.md)
        .background(
            LinearGradient(
                colors: [
                    AppColors.cardBackground.opacity(0.6),
                    AppColors.primary.opacity(0.05)
                ],
                startPoint: .leading,
                endPoint: .trailing
            )
        )
    }

    // MARK: - Activity Card

    private func activityCard(_ activity: DateActivity) -> some View {
        Button(action: {
            hapticFeedback(style: .medium)
            selectActivity(activity)
        }) {
            VStack(spacing: AppSpacing.sm) {
                // Icon and premium badge with romantic styling
                ZStack(alignment: .topTrailing) {
                    ZStack {
                        // Glow effect for icon
                        Circle()
                            .fill(
                                RadialGradient(
                                    colors: [
                                        (activity.premium ? AppColors.diamond : AppColors.primary).opacity(0.15),
                                        Color.clear
                                    ],
                                    center: .center,
                                    startRadius: 10,
                                    endRadius: 40
                                )
                            )
                            .frame(width: 80, height: 80)

                        Text(activity.icon)
                            .font(.system(size: 52))
                            .frame(height: 70)
                    }

                    if activity.premium {
                        HStack(spacing: 2) {
                            Image(systemName: "diamond.fill")
                                .font(.system(size: 8))

                            Text("PREMIUM")
                                .font(.system(size: 8, weight: .bold))
                        }
                        .foregroundColor(.white)
                        .padding(.horizontal, 6)
                        .padding(.vertical, 3)
                        .background(
                            LinearGradient(
                                colors: [
                                    AppColors.diamond,
                                    AppColors.diamond.opacity(0.8)
                                ],
                                startPoint: .leading,
                                endPoint: .trailing
                            )
                        )
                        .cornerRadius(8)
                        .shadow(color: AppColors.diamond.opacity(0.4), radius: 4, x: 0, y: 2)
                    }
                }

                // Activity name
                Text(activity.name)
                    .font(.appHeadline)
                    .foregroundColor(AppColors.primaryText)
                    .multilineTextAlignment(.center)
                    .lineLimit(2)
                    .frame(height: 40)

                // Romantic divider
                Rectangle()
                    .fill(
                        LinearGradient(
                            colors: [
                                AppColors.primary.opacity(0.0),
                                AppColors.primary.opacity(0.3),
                                AppColors.primary.opacity(0.0)
                            ],
                            startPoint: .leading,
                            endPoint: .trailing
                        )
                    )
                    .frame(height: 1)

                // Costs with romantic icons
                VStack(spacing: AppSpacing.xs) {
                    if activity.energyCost > 0 {
                        costRow(
                            icon: "bolt.fill",
                            color: AppColors.energy,
                            value: "\(activity.energyCost)"
                        )
                    }

                    if activity.moneyCost > 0 {
                        costRow(
                            icon: "dollarsign.circle.fill",
                            color: AppColors.money,
                            value: "\(activity.moneyCost)"
                        )
                    }

                    if activity.diamondCost > 0 {
                        costRow(
                            icon: "diamond.fill",
                            color: AppColors.diamond,
                            value: "\(activity.diamondCost)"
                        )
                    }
                }
                .frame(height: 60, alignment: .top)

                // Affinity gain with romantic styling
                HStack(spacing: AppSpacing.xs) {
                    Image(systemName: "heart.fill")
                        .foregroundStyle(
                            LinearGradient(
                                colors: [
                                    AppColors.primary,
                                    AppColors.primaryDark
                                ],
                                startPoint: .top,
                                endPoint: .bottom
                            )
                        )
                        .font(.system(size: 14))

                    Text("\(activity.affinityRange)")
                        .font(.appCaptionBold)
                        .foregroundColor(AppColors.primary)
                }
                .padding(.horizontal, AppSpacing.sm)
                .padding(.vertical, AppSpacing.xs)
                .background(AppColors.primary.opacity(0.1))
                .cornerRadius(AppSpacing.smallCornerRadius)
            }
            .padding(AppSpacing.md)
            .frame(maxWidth: .infinity)
            .background(
                ZStack {
                    // Subtle romantic gradient
                    LinearGradient(
                        colors: [
                            AppColors.cardBackground,
                            (activity.premium ? AppColors.diamond : AppColors.primary).opacity(0.05)
                        ],
                        startPoint: .topLeading,
                        endPoint: .bottomTrailing
                    )

                    // Border
                    RoundedRectangle(cornerRadius: AppSpacing.cornerRadius)
                        .stroke(
                            selectedActivity?.id == activity.id
                                ? LinearGradient(
                                    colors: [
                                        AppColors.primary,
                                        AppColors.primaryDark
                                    ],
                                    startPoint: .topLeading,
                                    endPoint: .bottomTrailing
                                )
                                : LinearGradient(
                                    colors: [
                                        AppColors.secondaryText.opacity(0.2),
                                        AppColors.secondaryText.opacity(0.2)
                                    ],
                                    startPoint: .topLeading,
                                    endPoint: .bottomTrailing
                                ),
                            lineWidth: selectedActivity?.id == activity.id ? 2 : 1
                        )
                }
            )
            .cornerRadius(AppSpacing.cornerRadius)
            .shadow(
                color: (selectedActivity?.id == activity.id ? AppColors.primary : AppColors.secondaryText).opacity(0.2),
                radius: selectedActivity?.id == activity.id ? 8 : 4,
                x: 0,
                y: selectedActivity?.id == activity.id ? 4 : 2
            )
        }
        .disabled(!canAfford(activity))
        .opacity(canAfford(activity) ? 1.0 : 0.5)
    }

    // MARK: - Cost Row

    private func costRow(icon: String, color: Color, value: String) -> some View {
        HStack(spacing: AppSpacing.xs) {
            Image(systemName: icon)
                .foregroundColor(color)
                .font(.system(size: AppSpacing.iconSizeSmall))

            Text(value)
                .font(.appCaption)
                .foregroundColor(AppColors.primaryText)
        }
        .frame(maxWidth: .infinity, alignment: .leading)
    }

    // MARK: - Filtered Activities

    private var filteredActivities: [DateActivity] {
        if showAffordableOnly {
            return activities.filter { canAfford($0) }
        }
        return activities
    }

    // MARK: - Helper Methods

    private func canAfford(_ activity: DateActivity) -> Bool {
        let hasEnoughEnergy = webSocketService.person.calcEnergy >= activity.energyCost
        let hasEnoughMoney = webSocketService.person.money >= activity.moneyCost
        let hasEnoughDiamonds = webSocketService.person.diamonds >= activity.diamondCost

        return hasEnoughEnergy && hasEnoughMoney && hasEnoughDiamonds
    }

    private func selectActivity(_ activity: DateActivity) {
        guard canAfford(activity) else { return }

        selectedActivity = activity

        // Send to WebSocket
        webSocketService.sendMessage(message: WebSocketCommands.startDate(
            activityId: activity.id,
            partnerId: partner.id
        ))

        // Callback
        onActivitySelected?(activity)

        // Dismiss after short delay
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
            dismiss()
        }
    }

    private func loadActivities() {
        // In a real app, this would load from webSocketService
        // For now, we create sample activities
        activities = [
            DateActivity(
                id: "dinner",
                name: "Dinner",
                icon: "🍽️",
                energyCost: 10,
                moneyCost: 0,
                diamondCost: 0,
                minAffinityGain: 3,
                maxAffinityGain: 8,
                premium: false,
                hasMiniGame: true,
                description: "Enjoy a nice meal together"
            ),
            DateActivity(
                id: "movie",
                name: "Movie",
                icon: "🎬",
                energyCost: 15,
                moneyCost: 50,
                diamondCost: 0,
                minAffinityGain: 5,
                maxAffinityGain: 12,
                premium: false,
                hasMiniGame: true,
                description: "Watch a movie at the cinema"
            ),
            DateActivity(
                id: "concert",
                name: "Concert",
                icon: "🎵",
                energyCost: 20,
                moneyCost: 100,
                diamondCost: 0,
                minAffinityGain: 8,
                maxAffinityGain: 15,
                premium: false,
                hasMiniGame: true,
                description: "Enjoy live music together"
            ),
            DateActivity(
                id: "weekend_trip",
                name: "Weekend Trip",
                icon: "🏖️",
                energyCost: 30,
                moneyCost: 200,
                diamondCost: 50,
                minAffinityGain: 15,
                maxAffinityGain: 25,
                premium: true,
                hasMiniGame: true,
                description: "Get away for the weekend"
            ),
            DateActivity(
                id: "luxury_restaurant",
                name: "Luxury Restaurant",
                icon: "🥂",
                energyCost: 15,
                moneyCost: 300,
                diamondCost: 75,
                minAffinityGain: 20,
                maxAffinityGain: 30,
                premium: true,
                hasMiniGame: true,
                description: "Fine dining experience"
            ),
            DateActivity(
                id: "adventure",
                name: "Adventure",
                icon: "🧗",
                energyCost: 40,
                moneyCost: 80,
                diamondCost: 0,
                minAffinityGain: 10,
                maxAffinityGain: 18,
                premium: false,
                hasMiniGame: true,
                description: "Exciting outdoor activities"
            )
        ]
    }
}

// MARK: - Preview

#if DEBUG
struct DateActivitySelectionView_Previews: PreviewProvider {
    static var previews: some View {
        let samplePerson = Person()
        samplePerson.id = "partner123"
        samplePerson.firstname = "Sarah"
        samplePerson.lastname = "Johnson"

        return DateActivitySelectionView(
            partner: samplePerson,
            onActivitySelected: { activity in
                print("Selected: \(activity.name)")
            }
        )
        .environmentObject(WebSocketService(
            urlSession: URLSession.shared,
            delegateQueue: OperationQueue()
        ))
    }
}
#endif
