//
//  EnhancedProfileCard.swift
//  lichunWebsocket
//
//  Enhanced profile card with bio, compatibility, and interests
//

import SwiftUI

struct EnhancedProfileCard: View {
    @ObservedObject var person: Person
    let currentPersonInterests: [String]
    let onExplainCompatibility: (() -> Void)?

    init(
        person: Person,
        currentPersonInterests: [String] = [],
        onExplainCompatibility: (() -> Void)? = nil
    ) {
        self.person = person
        self.currentPersonInterests = currentPersonInterests
        self.onExplainCompatibility = onExplainCompatibility
    }

    // Calculate shared interests
    var sharedInterests: [String] {
        let personInterestsLower = person.interests.map { $0.lowercased() }
        let currentInterestsLower = currentPersonInterests.map { $0.lowercased() }
        return person.interests.filter { interest in
            currentInterestsLower.contains(interest.lowercased())
        }
    }

    var body: some View {
        BaseCard {
            VStack(spacing: 0) {
                // Avatar and basic info
                avatarSection

                // Compatibility badge
                CompatibilityBadge(
                    percentage: person.compatibilityScore,
                    showExplanation: true,
                    onTapExplanation: onExplainCompatibility
                )
                .padding(.horizontal, AppSpacing.md)
                .padding(.vertical, AppSpacing.sm)

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

                // Bio section
                if !person.bio.isEmpty {
                    bioSection
                    Divider()
                        .background(AppColors.secondaryText.opacity(0.2))
                }

                // Stats section
                statsSection
                    .padding(.vertical, AppSpacing.md)

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

                // Interests section
                if !person.interests.isEmpty {
                    interestsSection
                        .padding(.vertical, AppSpacing.md)
                        .padding(.horizontal, AppSpacing.md)
                }

                // Shared interests section
                if !sharedInterests.isEmpty {
                    Divider()
                        .background(AppColors.secondaryText.opacity(0.2))

                    sharedInterestsSection
                        .padding(.vertical, AppSpacing.md)
                        .padding(.horizontal, AppSpacing.md)
                }
            }
        }
    }

    // MARK: - Avatar Section
    private var avatarSection: some View {
        VStack(spacing: AppSpacing.sm) {
            CharacterAvatar(
                person: person,
                size: AppSpacing.avatarSizeXLarge,
                showBorder: true,
                showGlow: true
            )

            VStack(spacing: AppSpacing.xs) {
                Text("\(person.firstname) \(person.lastname)")
                    .font(.appLargeTitle)
                    .foregroundColor(AppColors.primaryText)

                HStack(spacing: AppSpacing.xs) {
                    Text("\(person.ageYears) years old")
                        .font(.appBody)
                        .foregroundColor(AppColors.secondaryText)

                    Text("•")
                        .foregroundColor(AppColors.secondaryText)

                    Text(person.sex)
                        .font(.appBody)
                        .foregroundColor(AppColors.secondaryText)
                }

                if !person.occupation.isEmpty {
                    Text(person.occupation)
                        .font(.appCaption)
                        .foregroundColor(AppColors.accent)
                }
            }
            .padding(.bottom, AppSpacing.sm)
        }
        .padding(.top, AppSpacing.lg)
    }

    // MARK: - Bio Section
    private var bioSection: some View {
        VStack(alignment: .leading, spacing: AppSpacing.xs) {
            Text("About")
                .font(.appHeadline)
                .foregroundColor(AppColors.primaryText)

            Text(person.bio)
                .font(.appBody)
                .foregroundColor(AppColors.secondaryText)
                .lineLimit(3)
                .multilineTextAlignment(.leading)
        }
        .frame(maxWidth: .infinity, alignment: .leading)
        .padding(.horizontal, AppSpacing.md)
        .padding(.vertical, AppSpacing.sm)
    }

    // MARK: - Stats Section
    private var statsSection: some View {
        HStack(spacing: AppSpacing.sm) {
            StatBadge(
                icon: "heart.fill",
                label: "Health",
                value: Int(person.health),
                color: AppColors.health
            )

            StatBadge(
                icon: "face.smiling",
                label: "Happy",
                value: person.happiness,
                color: AppColors.happiness
            )

            StatBadge(
                icon: "brain.head.profile",
                label: "Smart",
                value: person.intelligence,
                color: AppColors.intelligence
            )

            StatBadge(
                icon: "star.fill",
                label: "Prestige",
                value: person.prestige,
                color: AppColors.prestige
            )
        }
        .padding(.horizontal, AppSpacing.md)
    }

    // MARK: - Interests Section
    private var interestsSection: some View {
        VStack(alignment: .leading, spacing: AppSpacing.sm) {
            Text("Interests")
                .font(.appHeadline)
                .foregroundColor(AppColors.primaryText)

            FlowLayout(spacing: AppSpacing.xs) {
                ForEach(person.interests.prefix(8), id: \.self) { interest in
                    InterestTag(
                        interest: interest,
                        isShared: sharedInterests.contains(interest),
                        icon: interest.interestIcon()
                    )
                }

                if person.interests.count > 8 {
                    Text("+\(person.interests.count - 8) more")
                        .font(.appCaption)
                        .foregroundColor(AppColors.secondaryText)
                        .padding(.horizontal, AppSpacing.sm)
                        .padding(.vertical, AppSpacing.xs)
                }
            }
        }
        .frame(maxWidth: .infinity, alignment: .leading)
    }

    // MARK: - Shared Interests Section
    private var sharedInterestsSection: some View {
        VStack(alignment: .leading, spacing: AppSpacing.sm) {
            HStack {
                Image(systemName: "heart.circle.fill")
                    .foregroundColor(AppColors.primary)
                    .font(.appBody)

                Text("You both like")
                    .font(.appHeadline)
                    .foregroundColor(AppColors.primaryText)
            }

            FlowLayout(spacing: AppSpacing.xs) {
                ForEach(sharedInterests.prefix(5), id: \.self) { interest in
                    InterestTag(
                        interest: interest,
                        isShared: true,
                        icon: interest.interestIcon()
                    )
                }

                if sharedInterests.count > 5 {
                    Text("+\(sharedInterests.count - 5) more")
                        .font(.appCaption)
                        .foregroundColor(AppColors.primary)
                        .padding(.horizontal, AppSpacing.sm)
                        .padding(.vertical, AppSpacing.xs)
                }
            }
        }
        .frame(maxWidth: .infinity, alignment: .leading)
    }
}

// MARK: - Flow Layout for wrapping tags
struct FlowLayout: Layout {
    var spacing: CGFloat = 8

    func sizeThatFits(proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) -> CGSize {
        let result = FlowResult(
            in: proposal.replacingUnspecifiedDimensions().width,
            subviews: subviews,
            spacing: spacing
        )
        return result.size
    }

    func placeSubviews(in bounds: CGRect, proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) {
        let result = FlowResult(
            in: bounds.width,
            subviews: subviews,
            spacing: spacing
        )
        for (index, subview) in subviews.enumerated() {
            subview.place(at: CGPoint(x: bounds.minX + result.positions[index].x, y: bounds.minY + result.positions[index].y), proposal: .unspecified)
        }
    }

    struct FlowResult {
        var size: CGSize = .zero
        var positions: [CGPoint] = []

        init(in maxWidth: CGFloat, subviews: Subviews, spacing: CGFloat) {
            var x: CGFloat = 0
            var y: CGFloat = 0
            var lineHeight: CGFloat = 0

            for subview in subviews {
                let size = subview.sizeThatFits(.unspecified)

                if x + size.width > maxWidth && x > 0 {
                    x = 0
                    y += lineHeight + spacing
                    lineHeight = 0
                }

                positions.append(CGPoint(x: x, y: y))
                lineHeight = max(lineHeight, size.height)
                x += size.width + spacing
            }

            self.size = CGSize(width: maxWidth, height: y + lineHeight)
        }
    }
}

// MARK: - Preview
#if DEBUG
struct EnhancedProfileCard_Previews: PreviewProvider {
    static var previews: some View {
        let samplePerson = Person()
        samplePerson.id = "123"
        samplePerson.firstname = "Emma"
        samplePerson.lastname = "Johnson"
        samplePerson.ageYears = 28
        samplePerson.sex = "Female"
        samplePerson.occupation = "Software Engineer"
        samplePerson.image = "https://api.dicebear.com/7.x/avataaars/svg?seed=Emma"
        samplePerson.bio = "Passionate about technology and outdoor adventures. Love trying new restaurants and exploring hidden gems in the city."
        samplePerson.health = 85
        samplePerson.happiness = 92
        samplePerson.intelligence = 88
        samplePerson.prestige = 65
        samplePerson.compatibilityScore = 87
        samplePerson.interests = ["music", "hiking", "photography", "cooking", "travel", "tech", "yoga", "coffee"]

        let currentInterests = ["music", "travel", "cooking", "reading"]

        return ScrollView {
            EnhancedProfileCard(
                person: samplePerson,
                currentPersonInterests: currentInterests,
                onExplainCompatibility: {
                    print("Explain compatibility")
                }
            )
            .padding()
        }
        .background(AppColors.primaryBackground)
    }
}
#endif
