//
//  RelationshipDetailView.swift
//  lichunWebsocket
//
//  Comprehensive view of a specific relationship with timeline, stats, and milestones
//

import SwiftUI

// MARK: - Relationship Detail View

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

    let relationshipId: String

    @State private var showDateSelection: Bool = false
    @State private var showGiftSelection: Bool = false
    @State private var showBreakupConfirmation: Bool = false

    // Computed properties
    private var relationship: Relationship? {
        return webSocketService.player.relData.first { $0.id == relationshipId }
    }

    private var partner: Person? {
        guard let rel = relationship else { return nil }
        let partnerId = rel.person1 == webSocketService.person.id ? rel.person2 : rel.person1
        return webSocketService.player.r.first { $0.id == partnerId }
    }

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

            ScrollView {
                if let partner = partner, let relationship = relationship {
                    VStack(spacing: AppSpacing.lg) {
                        // Partner header
                        partnerHeaderSection(partner: partner, relationship: relationship)

                        // Status card
                        statusCard(relationship: relationship)

                        // Stats card
                        statsCard(relationship: relationship)

                        // Timeline
                        timelineCard(relationship: relationship)

                        // Shared interests
                        if !relationship.commonInterests.isEmpty {
                            sharedInterestsCard(relationship: relationship)
                        }

                        // Challenges
                        if !relationship.challenges.isEmpty {
                            challengesCard(relationship: relationship)
                        }

                        // Future plans
                        if !relationship.futurePlans.isEmpty {
                            futurePlansCard(relationship: relationship)
                        }

                        // Action buttons
                        actionButtonsSection(partner: partner)
                    }
                    .padding(AppSpacing.md)
                    .padding(.bottom, AppSpacing.xxl)
                } else {
                    // Error state with romantic styling
                    VStack(spacing: AppSpacing.lg) {
                        ZStack {
                            Circle()
                                .fill(AppColors.error.opacity(0.15))
                                .frame(width: 120, height: 120)

                            Image(systemName: "heart.slash")
                                .font(.system(size: 64))
                                .foregroundStyle(
                                    LinearGradient(
                                        colors: [
                                            AppColors.error,
                                            AppColors.error.opacity(0.7)
                                        ],
                                        startPoint: .top,
                                        endPoint: .bottom
                                    )
                                )
                        }

                        Text("Relationship not found")
                            .font(.appTitle)
                            .foregroundColor(AppColors.primaryText)

                        Text("This relationship may have ended or doesn't exist")
                            .font(.appBody)
                            .foregroundColor(AppColors.secondaryText)
                            .multilineTextAlignment(.center)
                    }
                    .frame(maxWidth: .infinity, maxHeight: .infinity)
                    .padding(AppSpacing.lg)
                }
            }
        }
        .navigationTitle("Relationship Details")
        .navigationBarTitleDisplayMode(.inline)
    }

    // MARK: - Partner Header Section

    private func partnerHeaderSection(partner: Person, relationship: Relationship) -> some View {
        BaseCard {
            ZStack {
                // Romantic gradient background
                LinearGradient(
                    colors: [
                        AppColors.primary.opacity(0.08),
                        Color(hex: 0xFFE8F0).opacity(0.15),
                        AppColors.primary.opacity(0.05)
                    ],
                    startPoint: .topLeading,
                    endPoint: .bottomTrailing
                )
                .cornerRadius(AppSpacing.cornerRadius)

                VStack(spacing: AppSpacing.md) {
                    // Avatar with romantic border
                    CharacterAvatar(
                        person: partner,
                        size: AppSpacing.avatarSizeXLarge,
                        showBorder: true,
                        borderGradient: [AppColors.primary, AppColors.primaryDark],
                        borderWidth: 4,
                        showGlow: true
                    )

                    // Name and age with romantic styling
                    VStack(spacing: AppSpacing.xs) {
                        Text("\(partner.firstname) \(partner.lastname)")
                            .font(.appLargeTitle)
                            .foregroundColor(AppColors.primaryText)
                            .shadow(color: AppColors.primary.opacity(0.1), radius: 2, x: 0, y: 1)

                        HStack(spacing: AppSpacing.xs) {
                            Image(systemName: "calendar")
                                .font(.system(size: 12))
                                .foregroundColor(AppColors.secondaryText)

                            Text("\(partner.ageYears) years old")
                                .font(.appBody)
                                .foregroundColor(AppColors.secondaryText)
                        }

                        if !partner.occupation.isEmpty {
                            HStack(spacing: AppSpacing.xs) {
                                Image(systemName: "briefcase.fill")
                                    .font(.system(size: 12))
                                    .foregroundColor(AppColors.accent)

                                Text(partner.occupation)
                                    .font(.appBody)
                                    .foregroundColor(AppColors.accent)
                            }
                            .padding(.horizontal, AppSpacing.sm)
                            .padding(.vertical, AppSpacing.xs)
                            .background(AppColors.accent.opacity(0.15))
                            .cornerRadius(AppSpacing.smallCornerRadius)
                        }
                    }

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

                            Text("Affinity: \(partner.affinity)")
                                .font(.appHeadline)
                                .foregroundColor(AppColors.primaryText)
                        }

                        // Enhanced affinity bar with romantic gradient
                        GeometryReader { geometry in
                            ZStack(alignment: .leading) {
                                // Background
                                RoundedRectangle(cornerRadius: 6)
                                    .fill(AppColors.secondaryText.opacity(0.15))
                                    .frame(height: 12)

                                // Progress with romantic gradient
                                RoundedRectangle(cornerRadius: 6)
                                    .fill(
                                        LinearGradient(
                                            colors: [
                                                AppColors.primary.opacity(0.8),
                                                AppColors.primary,
                                                AppColors.primaryDark
                                            ],
                                            startPoint: .leading,
                                            endPoint: .trailing
                                        )
                                    )
                                    .frame(
                                        width: geometry.size.width * min(CGFloat(partner.affinity) / 100.0, 1.0),
                                        height: 12
                                    )
                                    .shadow(color: AppColors.primary.opacity(0.5), radius: 4, x: 0, y: 2)
                            }
                        }
                        .frame(height: 12)
                    }
                }
                .padding(AppSpacing.lg)
            }
        }
    }

    // MARK: - Status Card

    private func statusCard(relationship: Relationship) -> some View {
        BaseCard {
            VStack(alignment: .leading, spacing: AppSpacing.sm) {
                Text("Relationship Status")
                    .font(.appHeadline)
                    .foregroundColor(AppColors.primaryText)

                Divider()
                    .background(AppColors.secondaryText.opacity(0.3))

                statusRow(label: "Status", value: relationship.relationshipStatus, color: statusColor(relationship.relationshipStatus))
                statusRow(label: "Started", value: formatDate(relationship.startDate))
                statusRow(label: "Duration", value: calculateDuration(from: relationship.startDate))
            }
        }
    }

    // MARK: - Stats Card

    private func statsCard(relationship: Relationship) -> some View {
        BaseCard {
            VStack(alignment: .leading, spacing: AppSpacing.sm) {
                Text("Relationship Stats")
                    .font(.appHeadline)
                    .foregroundColor(AppColors.primaryText)

                Divider()
                    .background(AppColors.secondaryText.opacity(0.3))

                HStack(spacing: AppSpacing.md) {
                    statBadge(icon: "calendar", label: "Dates", value: countEventType(relationship: relationship, type: "date"))
                    statBadge(icon: "message", label: "Chats", value: countEventType(relationship: relationship, type: "conversation"))
                    statBadge(icon: "gift", label: "Gifts", value: countEventType(relationship: relationship, type: "gift"))
                }

                Divider()
                    .background(AppColors.secondaryText.opacity(0.3))

                HStack(spacing: AppSpacing.xs) {
                    Image(systemName: "chart.line.uptrend.xyaxis")
                        .foregroundColor(AppColors.primary)

                    Text("Relationship Score: \(relationship.relationshipScore)")
                        .font(.appBodyBold)
                        .foregroundColor(AppColors.primaryText)
                }
            }
        }
    }

    // MARK: - Timeline Card

    private func timelineCard(relationship: Relationship) -> some View {
        BaseCard {
            VStack(alignment: .leading, spacing: AppSpacing.sm) {
                Text("Timeline")
                    .font(.appHeadline)
                    .foregroundColor(AppColors.primaryText)

                Divider()
                    .background(AppColors.secondaryText.opacity(0.3))

                if relationship.eventsLog.isEmpty {
                    Text("No events yet")
                        .font(.appCaption)
                        .foregroundColor(AppColors.secondaryText)
                        .padding(.vertical, AppSpacing.sm)
                } else {
                    VStack(alignment: .leading, spacing: AppSpacing.sm) {
                        ForEach(relationship.eventsLog.prefix(5), id: \.self) { event in
                            timelineItem(event: event)
                        }

                        if relationship.eventsLog.count > 5 {
                            Text("+\(relationship.eventsLog.count - 5) more events")
                                .font(.appCaption)
                                .foregroundColor(AppColors.primary)
                        }
                    }
                }
            }
        }
    }

    // MARK: - Shared Interests Card

    private func sharedInterestsCard(relationship: Relationship) -> some View {
        BaseCard {
            VStack(alignment: .leading, spacing: AppSpacing.sm) {
                HStack {
                    Image(systemName: "heart.circle.fill")
                        .foregroundColor(AppColors.primary)

                    Text("Shared Interests (\(relationship.commonInterests.count))")
                        .font(.appHeadline)
                        .foregroundColor(AppColors.primaryText)
                }

                Divider()
                    .background(AppColors.secondaryText.opacity(0.3))

                FlowLayout(spacing: AppSpacing.xs) {
                    ForEach(relationship.commonInterests, id: \.self) { interest in
                        HStack(spacing: AppSpacing.xs) {
                            Image(systemName: interest.interestIcon())
                                .font(.system(size: AppSpacing.iconSizeSmall))
                                .foregroundColor(AppColors.primary)

                            Text(interest)
                                .font(.appCaption)
                                .foregroundColor(AppColors.primaryText)
                        }
                        .padding(.horizontal, AppSpacing.sm)
                        .padding(.vertical, AppSpacing.xs)
                        .background(AppColors.primary.opacity(0.2))
                        .cornerRadius(AppSpacing.smallCornerRadius)
                    }
                }
            }
        }
    }

    // MARK: - Challenges Card

    private func challengesCard(relationship: Relationship) -> some View {
        BaseCard {
            VStack(alignment: .leading, spacing: AppSpacing.sm) {
                HStack {
                    Image(systemName: "exclamationmark.triangle")
                        .foregroundColor(AppColors.warning)

                    Text("Challenges")
                        .font(.appHeadline)
                        .foregroundColor(AppColors.primaryText)
                }

                Divider()
                    .background(AppColors.secondaryText.opacity(0.3))

                VStack(alignment: .leading, spacing: AppSpacing.xs) {
                    ForEach(relationship.challenges, id: \.self) { challenge in
                        HStack(alignment: .top, spacing: AppSpacing.xs) {
                            Text("•")
                                .foregroundColor(AppColors.warning)

                            Text(challenge)
                                .font(.appBody)
                                .foregroundColor(AppColors.primaryText)
                                .fixedSize(horizontal: false, vertical: true)
                        }
                    }
                }
            }
        }
    }

    // MARK: - Future Plans Card

    private func futurePlansCard(relationship: Relationship) -> some View {
        BaseCard {
            VStack(alignment: .leading, spacing: AppSpacing.sm) {
                HStack {
                    Image(systemName: "sparkles")
                        .foregroundColor(AppColors.accent)

                    Text("Future Plans")
                        .font(.appHeadline)
                        .foregroundColor(AppColors.primaryText)
                }

                Divider()
                    .background(AppColors.secondaryText.opacity(0.3))

                VStack(alignment: .leading, spacing: AppSpacing.xs) {
                    ForEach(relationship.futurePlans, id: \.self) { plan in
                        HStack(alignment: .top, spacing: AppSpacing.xs) {
                            Image(systemName: "checkmark.circle")
                                .foregroundColor(AppColors.success)
                                .font(.system(size: AppSpacing.iconSizeSmall))

                            Text(plan)
                                .font(.appBody)
                                .foregroundColor(AppColors.primaryText)
                                .fixedSize(horizontal: false, vertical: true)
                        }
                    }
                }
            }
        }
    }

    // MARK: - Action Buttons Section

    private func actionButtonsSection(partner: Person) -> some View {
        VStack(spacing: AppSpacing.md) {
            // Schedule Date button with romantic styling
            Button(action: {
                hapticFeedback(style: .medium)
                showDateSelection = true
            }) {
                HStack(spacing: AppSpacing.xs) {
                    Image(systemName: "calendar.badge.plus")
                        .font(.system(size: 18))

                    Text("Schedule Date")
                        .font(.appHeadline)
                        .minimumScaleFactor(0.8)
                        .lineLimit(1)

                    Spacer()

                    Image(systemName: "heart.fill")
                        .font(.system(size: 14))
                }
                .foregroundColor(.white)
                .padding(.horizontal, AppSpacing.md)
                .padding(.vertical, AppSpacing.md)
                .background(
                    LinearGradient(
                        colors: [
                            AppColors.primary,
                            AppColors.primaryDark
                        ],
                        startPoint: .leading,
                        endPoint: .trailing
                    )
                )
                .cornerRadius(AppSpacing.cornerRadius)
                .shadow(color: AppColors.primary.opacity(0.4), radius: 8, x: 0, y: 4)
            }

            // Send Gift button with warm styling
            Button(action: {
                hapticFeedback(style: .medium)
                showGiftSelection = true
            }) {
                HStack(spacing: AppSpacing.xs) {
                    Image(systemName: "gift.fill")
                        .font(.system(size: 18))

                    Text("Send Gift")
                        .font(.appHeadline)
                        .minimumScaleFactor(0.8)
                        .lineLimit(1)

                    Spacer()

                    Image(systemName: "sparkles")
                        .font(.system(size: 14))
                }
                .foregroundColor(.white)
                .padding(.horizontal, AppSpacing.md)
                .padding(.vertical, AppSpacing.md)
                .background(
                    LinearGradient(
                        colors: [
                            AppColors.accent,
                            AppColors.accentDark
                        ],
                        startPoint: .leading,
                        endPoint: .trailing
                    )
                )
                .cornerRadius(AppSpacing.cornerRadius)
                .shadow(color: AppColors.accent.opacity(0.4), radius: 8, x: 0, y: 4)
            }

            // Break Up button with softer error styling
            Button(action: {
                hapticFeedback(style: .heavy)
                showBreakupConfirmation = true
            }) {
                HStack(spacing: AppSpacing.xs) {
                    Image(systemName: "heart.slash.fill")
                        .font(.system(size: 16))

                    Text("End Relationship")
                        .font(.appBody)
                        .minimumScaleFactor(0.8)
                        .lineLimit(1)
                }
                .foregroundColor(AppColors.error)
                .padding(.horizontal, AppSpacing.md)
                .padding(.vertical, AppSpacing.sm)
                .background(AppColors.error.opacity(0.1))
                .cornerRadius(AppSpacing.cornerRadius)
                .overlay(
                    RoundedRectangle(cornerRadius: AppSpacing.cornerRadius)
                        .stroke(AppColors.error.opacity(0.3), lineWidth: 1)
                )
            }
            .padding(.top, AppSpacing.md)
        }
        .sheet(isPresented: $showDateSelection) {
            DateActivitySelectionView(
                partner: partner,
                onActivitySelected: { _ in }
            )
        }
        .alert("End Relationship", isPresented: $showBreakupConfirmation) {
            Button("Cancel", role: .cancel) { }
            Button("End Relationship", role: .destructive) {
                breakUp()
            }
        } message: {
            Text("Are you sure you want to end this relationship with \(partner.firstname)? This decision is permanent and cannot be undone.")
        }
    }

    // MARK: - Helper Views

    private func statusRow(label: String, value: String, color: Color = AppColors.primaryText) -> some View {
        HStack {
            Text(label)
                .font(.appBody)
                .foregroundColor(AppColors.secondaryText)

            Spacer()

            Text(value)
                .font(.appBodyBold)
                .foregroundColor(color)
        }
    }

    private func statBadge(icon: String, label: String, value: Int) -> some View {
        VStack(spacing: AppSpacing.xs) {
            Image(systemName: icon)
                .foregroundColor(AppColors.primary)
                .font(.system(size: AppSpacing.iconSizeMedium))

            Text("\(value)")
                .font(.appHeadline)
                .foregroundColor(AppColors.primaryText)

            Text(label)
                .font(.appCaption)
                .foregroundColor(AppColors.secondaryText)
        }
        .frame(maxWidth: .infinity)
    }

    private func timelineItem(event: String) -> some View {
        HStack(alignment: .top, spacing: AppSpacing.sm) {
            Image(systemName: "circle.fill")
                .font(.system(size: 8))
                .foregroundColor(AppColors.primary)
                .padding(.top, 6)

            Text(event)
                .font(.appBody)
                .foregroundColor(AppColors.secondaryText)
                .fixedSize(horizontal: false, vertical: true)
        }
    }

    // MARK: - Helper Methods

    private func statusColor(_ status: String) -> Color {
        switch status.lowercased() {
        case "dating": return AppColors.primary
        case "engaged": return AppColors.accent
        case "married": return AppColors.success
        default: return AppColors.secondaryText
        }
    }

    private func formatDate(_ dateString: String) -> String {
        // Simple date formatting - in production, use proper date formatting
        return dateString
    }

    private func calculateDuration(from dateString: String) -> String {
        // Calculate duration - simplified for now
        return "10 months"
    }

    private func countEventType(relationship: Relationship, type: String) -> Int {
        return relationship.eventsLog.filter { $0.lowercased().contains(type) }.count
    }

    private func breakUp() {
        guard let partner = partner else { return }

        webSocketService.sendMessage(message: WebSocketCommands.breakUp(partnerId: partner.id))

        dismiss()
    }
}

// MARK: - Preview

#if DEBUG
struct RelationshipDetailView_Previews: PreviewProvider {
    static var previews: some View {
        NavigationView {
            RelationshipDetailView(relationshipId: "rel123")
                .environmentObject({
                    let ws = WebSocketService(
                        urlSession: URLSession.shared,
                        delegateQueue: OperationQueue()
                    )

                    // Mock data
                    let partner = Person()
                    partner.id = "partner123"
                    partner.firstname = "Sarah"
                    partner.lastname = "Johnson"
                    partner.ageYears = 28
                    partner.occupation = "Software Engineer"
                    partner.image = "https://api.dicebear.com/7.x/avataaars/svg?seed=Sarah"
                    partner.affinity = 85

                    ws.player.r = [partner]
                    ws.player.relData = [
                        Relationship(
                            id: "rel123",
                            person1: "player123",
                            person2: "partner123",
                            startDate: "Jan 15, 2024",
                            relationshipStatus: "Dating",
                            relationshipNotes: "Met at a coffee shop",
                            eventsLog: [
                                "Mar 2024: First Date",
                                "Apr 2024: Became Official",
                                "Jul 2024: Anniversary",
                                "Sep 2024: Met each other's families"
                            ],
                            relationshipScore: 87,
                            commonInterests: ["music", "hiking", "cooking", "travel", "tech"],
                            challenges: ["Long distance occasionally", "Different work schedules"],
                            futurePlans: ["Move in together", "Travel to Europe", "Get a pet"]
                        )
                    ]

                    ws.person.id = "player123"

                    return ws
                }())
        }
    }
}
#endif
