//
//  StatusHeaderCard.swift
//  lichunWebsocket
//
//  Status header card displaying character info, time, season, and resources.
//
//  NOTE (T014): This card is NOT wired into the live Home screen — HomeView uses
//  the merged CharacterCard + GameControlsCard + LifeTimelineCard layout, and the
//  persistent HeaderView owns the resource readout. StatusHeaderCard is retained
//  only as a reusable building block / reference. Its speed readout now uses the
//  unified named scale (Constants.GameSpeed.label) instead of a raw "500x" so it
//  stays consistent if ever revived.
//

import SwiftUI

struct StatusHeaderCard: View {
    @EnvironmentObject var webSocketService: WebSocketService

    @State private var gaugeRotation: Double = 0
    @State private var isPulsing = false

    // MARK: - Computed Properties

    /// Season icon based on current season
    private var seasonIcon: String {
        switch webSocketService.player.season.lowercased() {
        case "spring": return "leaf.fill"
        case "summer": return "sun.max.fill"
        case "autumn", "fall": return "leaf.fill"
        case "winter": return "snowflake"
        default: return "calendar"
        }
    }

    /// Formatted time string (e.g., "Wed 03:45 pm")
    private var formattedDateTime: String {
        if !webSocketService.player.date.isEmpty {
            let dateFormatter = DateFormatter()
            dateFormatter.dateFormat = "MM-dd"

            if let date = dateFormatter.date(from: webSocketService.player.date) {
                dateFormatter.dateFormat = "EEE"
                let formattedDate = dateFormatter.string(from: date)

                let hour = webSocketService.player.hourOfDay
                let minute = webSocketService.player.minuteOfHour

                let formattedTime: String
                if hour < 12 {
                    formattedTime = String(format: "%02d:%02d am", hour, minute)
                } else {
                    formattedTime = String(format: "%02d:%02d pm", hour % 12 == 0 ? 12 : hour % 12, minute)
                }

                return "\(formattedDate) \(formattedTime)"
            }
        }

        return ""
    }

    /// Date with emoji and month abbreviation (e.g., "Jan 15 🌼")
    private var monthEmojiAndAbbreviation: String {
        let dateParts = webSocketService.player.date.split(separator: "-").map(String.init)

        let monthAbbreviations = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
        let seasonEmojis = ["☃️", "☃️", "🌼", "🌼", "🌼", "☀️", "☀️", "☀️", "🍁", "🍁", "🍁", "☃️"]

        if dateParts.count >= 2,
           let monthStr = dateParts.first,
           let month = Int(monthStr),
           month > 0 && month <= 12 {
            let dayStr = dateParts[1]
            return "\(monthAbbreviations[month - 1]) \(dayStr) \(seasonEmojis[month - 1])"
        } else {
            return ""
        }
    }

    /// Seasonal gradient background based on current season
    private var seasonalGradient: LinearGradient {
        AppColors.cozySeasonGradient(webSocketService.player.season)
    }

    /// Character full name
    private var characterName: String {
        "\(webSocketService.person.firstname) \(webSocketService.person.lastname)"
    }

    // MARK: - Body

    var body: some View {
        BaseCard(
            backgroundColor: .clear,
            borderColor: AppColors.primary.opacity(0.3),
            showShadow: true
        ) {
            VStack(spacing: AppSpacing.md) {
                // Time and Season Row
                HStack {
                    // Season badge with icon
                    HStack(spacing: AppSpacing.xs) {
                        Image(systemName: seasonIcon)
                            .font(.appIconLabel)
                            .foregroundColor(AppColors.primaryText)
                        Text(monthEmojiAndAbbreviation)
                            .font(.appCaptionBold)
                            .foregroundColor(AppColors.primaryText)
                    }
                    .padding(.horizontal, AppSpacing.cardInnerSpacing)
                    .padding(.vertical, AppSpacing.sm)
                    .background(AppColors.surfaceElevated.opacity(0.8))
                    .cornerRadius(AppSpacing.cornerRadius)

                    Spacer()

                    // Time badge
                    Text(formattedDateTime)
                        .font(.appSmallBold)
                        .foregroundColor(AppColors.primaryText)
                        .padding(.horizontal, AppSpacing.cardInnerSpacing)
                        .padding(.vertical, AppSpacing.sm)
                        .background(AppColors.surfaceElevated.opacity(0.8))
                        .cornerRadius(AppSpacing.cornerRadius)

                    Spacer()

                    // Speed Indicator
                    speedIndicator
                }

                // Character Name
                Text(characterName)
                    .font(.appTitle)
                    .foregroundColor(AppColors.primaryText)
                    .frame(maxWidth: .infinity, alignment: .leading)

                // Resource Pills
                HStack(spacing: AppSpacing.sm) {
                    ResourcePill(
                        icon: "bolt.fill",
                        value: "\(webSocketService.person.calcEnergy)",
                        color: AppColors.energy
                    )

                    ResourcePill(
                        icon: "dollarsign.circle.fill",
                        value: formatMoney(webSocketService.person.money),
                        color: AppColors.money
                    )

                    ResourcePill(
                        icon: "gem.fill",
                        value: "\(webSocketService.person.diamonds)",
                        color: AppColors.diamond
                    )

                    ResourcePill(
                        icon: "heart.fill",
                        value: "\(Int(webSocketService.person.health))%",
                        color: AppColors.health
                    )
                }
            }
        }
        .background(
            seasonalGradient
                .cornerRadius(AppSpacing.largeCornerRadius)
        )
    }

    // MARK: - Speed Indicator

    private var speedIndicator: some View {
        HStack(spacing: AppSpacing.xxs) {
            Image(systemName: "gauge")
                .font(.appMicro)
                .foregroundColor(AppColors.accent)
                .rotationEffect(.degrees(gaugeRotation))

            Text(Constants.GameSpeed.label(for: webSocketService.player.gameSpeed))
                .font(.appMicroBold)
                .foregroundColor(AppColors.primaryText)
                .lineLimit(1)
                .minimumScaleFactor(0.7)
        }
        .padding(.horizontal, AppSpacing.sm)
        .padding(.vertical, AppSpacing.xs)
        .background(AppColors.accent.opacity(isPulsing ? 0.3 : 0.2))
        .cornerRadius(AppSpacing.smallCornerRadius)
        .scaleEffect(isPulsing ? 1.05 : 1.0)
        .shadow(color: AppColors.accent.opacity(isPulsing ? 0.3 : 0.15), radius: 6, x: 0, y: 2)
        .onChange(of: webSocketService.player.gameSpeed) { newValue in
            // Animate gauge when speed changes
            withAnimation(.spring(response: 0.4, dampingFraction: 0.6)) {
                gaugeRotation = Double(newValue * 15) // Rotate based on speed
                isPulsing = true
            }

            // Haptic feedback
            let generator = UIImpactFeedbackGenerator(style: .light)
            generator.impactOccurred()

            // Reset pulse
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
                withAnimation(.spring(response: 0.4, dampingFraction: 0.7)) {
                    isPulsing = false
                }
            }
        }
        .onAppear {
            // Initial gauge position
            gaugeRotation = Double(webSocketService.player.gameSpeed * 15)
        }
    }

    // MARK: - Helper Methods

    /// Format money with commas and dollar sign
    private func formatMoney(_ amount: Int) -> String {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        formatter.groupingSeparator = ","

        if let formatted = formatter.string(from: NSNumber(value: amount)) {
            return "$\(formatted)"
        }

        return "$\(amount)"
    }
}

// MARK: - Preview

#Preview {
    let service: WebSocketService = {
        let service = WebSocketService(urlSession: URLSession.shared, delegateQueue: OperationQueue())
        service.person.firstname = "Emma"
        service.person.lastname = "Chen"
        service.person.calcEnergy = 65
        service.person.money = 1250
        service.person.diamonds = 42
        service.person.health = 85
        service.player.date = "03-15"
        service.player.hourOfDay = 15
        service.player.minuteOfHour = 30
        service.player.season = "Spring"
        service.player.gameSpeed = 2
        return service
    }()

    StatusHeaderCard()
        .environmentObject(service)
        .padding()
        .background(AppColors.background)
}
