//
//  ActivitiesListView.swift
//  lichunWebsocket
//
//  Main view for listing activities and habits with join/apply actions
//

import SwiftUI

struct ActivitiesListView: View {
    @EnvironmentObject var webSocketService: WebSocketService
    // INTEGRATION: Tooltip manager for contextual help
    @EnvironmentObject var tooltipManager: TooltipManager
    @State private var isActivityViewPresented = false
    @State private var selectedActivity: ActivityProtocol?
    @State private var isOccupationListPresented = false
    @State private var isExtracurricularListPresented = false
    @State private var appearedActivities: Set<String> = []
    @State private var appearedHabits: Set<Int> = []
    @State private var isPerformActivityPresented = false

    private var canJoinExtracurricular: Bool {
        webSocketService.person.ageYears >= 13
    }

    private var canApplyForJob: Bool {
        webSocketService.person.ageYears >= 15
    }

    private var shouldShowEmptyGuidance: Bool {
        webSocketService.person.activities.isEmpty
            && webSocketService.person.habits.isEmpty
            && !canJoinExtracurricular
            && !canApplyForJob
    }

    var body: some View {
        NavigationView {
            ZStack {
                // Warm gradient background
                LinearGradient(
                    colors: [
                        AppColors.background,
                        AppColors.background.opacity(0.95)
                    ],
                    startPoint: .top,
                    endPoint: .bottom
                )
                .ignoresSafeArea()

                ScrollView {
                    VStack(spacing: AppSpacing.xl) {
                        // Wave 2: proactive performActivity entry point
                        performActivityBanner

                        // Activities Section
                        activitySection

                        // Habits Section
                        habitSection

                        if shouldShowEmptyGuidance {
                            lockedActivitiesGuidance
                        }
                    }
                    .padding(AppSpacing.md)
                    .padding(.top, AppSpacing.sm) // Additional top spacing for header visibility
                    .padding(.bottom, AppSpacing.xl)
                }
                .scrollIndicators(.hidden)
            }
            .toolbar(.hidden, for: .navigationBar)
            // INTEGRATION: Show tooltip for first-time users
            .onAppear {
                tooltipManager.showTooltipIfNeeded(
                    "activities_intro",
                    title: "Activities",
                    message: "Choose activities to develop skills and advance your character!",
                    position: .bottom
                )
            }
        }
        .sheet(isPresented: $isActivityViewPresented) {
            if let activity = selectedActivity {
                ActivityView(activity: activity)
                    .environmentObject(webSocketService)
            }
        }
        .sheet(isPresented: $isPerformActivityPresented) {
            PerformActivityView()
                .environmentObject(webSocketService)
        }
    }

    // MARK: - Perform Activity Banner (Wave 2)
    private var performActivityBanner: some View {
        Button(action: {
            hapticFeedback(style: .light)
            isPerformActivityPresented = true
        }) {
            HStack(spacing: AppSpacing.md) {
                ZStack {
                    Circle()
                        .fill(AppColors.success.opacity(0.18))
                        .frame(width: 48, height: 48)
                    Image(systemName: "bolt.heart.fill")
                        .font(.system(size: 22))
                        .foregroundColor(AppColors.success)
                }
                VStack(alignment: .leading, spacing: 2) {
                    Text("Do an Activity")
                        .font(.appBodyBold)
                        .foregroundColor(AppColors.primaryText)
                    Text("Study, exercise, socialize, hustle, or hobby - your choice.")
                        .font(.appCaption)
                        .foregroundColor(AppColors.secondaryText)
                        .lineLimit(2)
                }
                Spacer()
                Image(systemName: "chevron.right")
                    .font(.system(size: 14, weight: .semibold))
                    .foregroundColor(AppColors.secondaryText)
            }
            .padding(AppSpacing.md)
            .background(AppColors.surfaceElevated)
            .cornerRadius(AppSpacing.cornerRadius)
            .overlay(
                RoundedRectangle(cornerRadius: AppSpacing.cornerRadius)
                    .stroke(AppColors.success.opacity(0.3), lineWidth: 1)
            )
        }
        .buttonStyle(PlainButtonStyle())
    }

    // MARK: - Activity Section
    private var activitySection: some View {
        VStack(spacing: AppSpacing.md) {
            if !webSocketService.person.activities.isEmpty {
                sectionHeader(
                    title: "Enrolled",
                    icon: "briefcase.fill",
                    count: webSocketService.person.activities.count
                )
            }

            ForEach(Array(webSocketService.person.activities.enumerated()), id: \.element.id) { (index: Int, activity) in
                // Match by record id OR locationId: education records carry a
                // distinct record id and store the school/activity id in
                // `location` (locationId). Jobs have an empty `location`, so the
                // extra clause is a no-op for them.
                let matchingRecord = webSocketService.person.activityRecords.first { $0.id == activity.id || $0.location == activity.id }
                ActivityButton(activity: activity, matchingRecord: matchingRecord) {
                    self.selectedActivity = activity
                    self.isActivityViewPresented = true
                }
                .opacity(appearedActivities.contains(activity.id) ? 1 : 0)
                .offset(y: appearedActivities.contains(activity.id) ? 0 : 6)
                .scaleEffect(appearedActivities.contains(activity.id) ? 1 : 0.98)
                .onAppear {
                    withAnimation(.easeOut(duration: 0.12).delay(Double(index) * 0.02)) {
                        _ = appearedActivities.insert(activity.id)
                    }
                }
            }

            // Action Buttons
            VStack(spacing: AppSpacing.md) {
                // Join Extracurricular (ages 13+)
                if canJoinExtracurricular {
                    cozyActionButton(
                        title: "Join Extracurricular",
                        icon: "star.fill",
                        gradient: [AppColors.secondary, AppColors.secondaryDark]
                    ) {
                        self.isExtracurricularListPresented = true
                    }
                    .sheet(isPresented: $isExtracurricularListPresented) {
                        ExtracurricularList()
                            .environmentObject(webSocketService)
                    }
                }

                // Apply for Job (ages 15+)
                if canApplyForJob {
                    cozyActionButton(
                        title: "Apply for a Job",
                        icon: "briefcase.fill",
                        gradient: [AppColors.primary, AppColors.primaryDark]
                    ) {
                        self.isOccupationListPresented = true
                    }
                    .sheet(isPresented: $isOccupationListPresented) {
                        OccupationList()
                            .environmentObject(webSocketService)
                    }
                }
            }
            .padding(.top, AppSpacing.sm)
        }
    }

    // MARK: - Locked Activities Guidance
    private var lockedActivitiesGuidance: some View {
        BaseCard(
            backgroundColor: AppColors.surfaceElevated,
            borderColor: AppColors.accent.opacity(0.25),
            showShadow: true
        ) {
            VStack(alignment: .leading, spacing: AppSpacing.md) {
                HStack(spacing: AppSpacing.sm) {
                    Image(systemName: "lock.open.fill")
                        .font(.system(size: 20, weight: .semibold))
                        .foregroundColor(AppColors.accent)

                    Text("More unlocks as you grow")
                        .font(.appHeadline)
                        .foregroundColor(AppColors.primaryText)
                }

                Text("Keep playing through life events. New things open up as you get older:")
                    .font(.appBody)
                    .foregroundColor(AppColors.secondaryText)
                    .lineSpacing(3)

                // T014: visible age-unlock timeline so a young character has a
                // concrete sense of what's coming and when.
                VStack(alignment: .leading, spacing: AppSpacing.sm) {
                    ForEach(ageUnlocks, id: \.age) { unlock in
                        unlockRow(unlock)
                    }
                }
                .padding(.top, AppSpacing.xs)
            }
        }
    }

    // MARK: - Age Unlock Timeline (T014)

    private struct AgeUnlock {
        let age: Int
        let icon: String
        let title: String
    }

    private var ageUnlocks: [AgeUnlock] {
        [
            AgeUnlock(age: 13, icon: "star.fill", title: "Clubs & extracurriculars"),
            AgeUnlock(age: 15, icon: "briefcase.fill", title: "Part-time jobs"),
            AgeUnlock(age: 16, icon: "heart.fill", title: "Dating"),
        ]
    }

    private func unlockRow(_ unlock: AgeUnlock) -> some View {
        let currentAge = webSocketService.person.ageYears
        let isUnlocked = currentAge >= unlock.age
        return HStack(spacing: AppSpacing.sm) {
            ZStack {
                Circle()
                    .fill((isUnlocked ? AppColors.success : AppColors.accent).opacity(0.15))
                    .frame(width: 36, height: 36)
                Text("\(unlock.age)")
                    .font(.system(size: 14, weight: .bold, design: .rounded))
                    .foregroundColor(isUnlocked ? AppColors.success : AppColors.accent)
            }

            HStack(spacing: AppSpacing.xs) {
                Image(systemName: unlock.icon)
                    .font(.system(size: 14, weight: .semibold))
                    .foregroundColor(AppColors.secondaryText)
                Text(unlock.title)
                    .font(.appBody)
                    .foregroundColor(AppColors.primaryText)
            }

            Spacer()

            Image(systemName: isUnlocked ? "checkmark.circle.fill" : "lock.fill")
                .font(.system(size: 16))
                .foregroundColor(isUnlocked ? AppColors.success : AppColors.disabledText.opacity(0.6))
        }
        .accessibilityElement(children: .combine)
        .accessibilityLabel("\(unlock.title), unlocks at age \(unlock.age)\(isUnlocked ? ", unlocked" : "")")
    }

    // MARK: - Habit Section
    private var habitSection: some View {
        VStack(spacing: AppSpacing.md) {
            if !webSocketService.person.habits.isEmpty {
                sectionHeader(
                    title: "Habits",
                    icon: "repeat.circle.fill",
                    count: webSocketService.person.habits.count
                )

                ForEach(Array(webSocketService.person.habits.enumerated()), id: \.offset) { (index: Int, habit) in
                    HabitRow(habit: habit, webSocketService: webSocketService)
                        .opacity(appearedHabits.contains(index) ? 1 : 0)
                        .offset(y: appearedHabits.contains(index) ? 0 : 6)
                        .scaleEffect(appearedHabits.contains(index) ? 1 : 0.98)
                        .onAppear {
                            withAnimation(.easeOut(duration: 0.12).delay(Double(index) * 0.02)) {
                                _ = appearedHabits.insert(index)
                            }
                        }
                }
            }
        }
    }

    // MARK: - Section Header
    private func sectionHeader(title: String, icon: String, count: Int) -> some View {
        HStack(spacing: AppSpacing.sm) {
            Image(systemName: icon)
                .font(.system(size: 20, weight: .semibold))
                .foregroundColor(AppColors.accent)

            Text(title)
                .font(.appTitle)
                .foregroundColor(AppColors.primaryText)

            Spacer()

            Text("\(count)")
                .font(.appBodyBold)
                .foregroundColor(AppColors.primaryText)
                .padding(.horizontal, 12)
                .padding(.vertical, 6)
                .background(
                    AppColors.accent.opacity(0.15)
                )
                .cornerRadius(AppSpacing.pillCornerRadius)
        }
    }

    // MARK: - Cozy Action Button
    private func cozyActionButton(title: String, icon: String, gradient: [Color], action: @escaping () -> Void) -> some View {
        Button(action: {
            hapticFeedback(style: .medium)
            action()
        }) {
            HStack(spacing: AppSpacing.sm) {
                Image(systemName: icon)
                    .font(.system(size: 18, weight: .semibold))

                Text(title)
                    .font(.appHeadline)

                Spacer()

                Image(systemName: "arrow.right.circle.fill")
                    .font(.system(size: 20))
            }
            .foregroundColor(.white)
            .padding(.horizontal, AppSpacing.lg)
            .padding(.vertical, AppSpacing.md)
            .background(
                LinearGradient(
                    colors: gradient,
                    startPoint: .leading,
                    endPoint: .trailing
                )
            )
            .cornerRadius(AppSpacing.largeCornerRadius)
            .shadow(
                color: gradient[0].opacity(0.3),
                radius: AppSpacing.Shadow.radiusSoft,
                x: 0,
                y: AppSpacing.Shadow.offsetY
            )
        }
        .buttonStyle(SquishButtonStyle())
    }
}

// Backward compatibility alias
typealias ActivityButtonsView = ActivitiesListView

// MARK: - Preview
#if DEBUG
// MARK: - Preview
// Preview removed - requires backend connection
#endif
