import SwiftUI

// MARK: - RecommendedBadge

/// Badge der anzeigt, dass ein Element zum Persönlichkeitsprofil passt.
/// Nur rendern wenn PersonalityStore.shared.hasCompletedQuiz == true.
struct RecommendedBadge: View {
    enum Variant {
        /// Kompakt: "Passend für dich"
        case small
        /// Mit individueller Begründung
        case full(reason: String)
    }

    let variant: Variant

    var body: some View {
        HStack(spacing: 4) {
            Image(systemName: "brain")
                .font(NahbarInsightStyle.badgeFont)
                .accessibilityHidden(true)
            Text(labelText)
                .font(NahbarInsightStyle.badgeFont)
        }
        .padding(.horizontal, 8)
        .padding(.vertical, 4)
        .background(NahbarInsightStyle.recommendedTint)
        .foregroundStyle(NahbarInsightStyle.accentPetrol)
        .clipShape(Capsule())
        .accessibilityLabel(accessibilityText)
    }

    private var labelText: String {
        switch variant {
        case .small:            return "Passend für dich"
        case .full(let reason): return reason
        }
    }

    private var accessibilityText: String {
        switch variant {
        case .small:            return "Persönlichkeitsempfehlung: Passend für dich"
        case .full(let reason): return "Persönlichkeitsempfehlung: \(reason)"
        }
    }
}

// MARK: - QuizPromptCard

/// Karte im Ich-Tab, die das Persönlichkeitsquiz bewirbt,
/// wenn es noch nicht abgeschlossen wurde.
struct QuizPromptCard: View {
    let onStart: () -> Void

    var body: some View {
        VStack(alignment: .leading, spacing: 16) {
            HStack(spacing: 12) {
                Image(systemName: "person.text.rectangle")
                    .font(.title2)
                    .foregroundStyle(NahbarInsightStyle.accentPetrol)
                    .accessibilityHidden(true)

                VStack(alignment: .leading, spacing: 4) {
                    Text("Wie tickst du?")
                        .font(.headline)
                    Text("Personalisierte Vorschläge in 2 Minuten")
                        .font(.subheadline)
                        .foregroundStyle(.secondary)
                }

                Spacer()
            }

            PrivacyBadgeView(context: .localOnly)

            Button(action: onStart) {
                Text("Quiz starten")
                    .font(.subheadline.weight(.medium))
                    .frame(maxWidth: .infinity)
                    .padding(.vertical, 10)
                    .background(NahbarInsightStyle.accentPetrol)
                    .foregroundStyle(.white)
                    .clipShape(RoundedRectangle(cornerRadius: 8))
            }
            .accessibilityLabel("Persönlichkeitsquiz starten")
        }
        .padding(NahbarInsightStyle.cardPadding)
        .background(NahbarInsightStyle.cardBackground)
        .clipShape(RoundedRectangle(cornerRadius: NahbarInsightStyle.cardCornerRadius))
    }
}

// MARK: - PersonalityProfileCard

/// Karte im Ich-Tab, die das Persönlichkeitsprofil zeigt,
/// wenn das Quiz abgeschlossen wurde.
struct PersonalityProfileCard: View {
    let profile: PersonalityProfile
    let onRetake: () -> Void
    let onShowDetails: () -> Void

    @State private var showRetakeConfirmation = false

    var body: some View {
        VStack(alignment: .leading, spacing: 16) {
            HStack(alignment: .top, spacing: 16) {
                // Mini-Pentagon (80 × 80 pt, ohne Achsenbeschriftungen)
                PentagonChartView(profile: profile, size: 80, showLabels: false)
                    .frame(width: 80, height: 80)
                    .accessibilityLabel("Mini-Persönlichkeitsprofil-Diagramm")

                VStack(alignment: .leading, spacing: 6) {
                    Text("Dein Profil")
                        .font(.headline)
                    Text(shortSummary)
                        .font(.caption)
                        .foregroundStyle(.secondary)
                        .lineLimit(3)
                }
            }

            HStack(spacing: 10) {
                Button(action: onShowDetails) {
                    Text("Details")
                        .font(.subheadline.weight(.medium))
                        .frame(maxWidth: .infinity)
                        .padding(.vertical, 10)
                        .background(NahbarInsightStyle.accentPetrol)
                        .foregroundStyle(.white)
                        .clipShape(RoundedRectangle(cornerRadius: 8))
                }
                .accessibilityLabel("Persönlichkeitsprofil-Details anzeigen")

                Button {
                    showRetakeConfirmation = true
                } label: {
                    Text("Erneut")
                        .font(.subheadline)
                        .foregroundStyle(.secondary)
                        .frame(maxWidth: .infinity)
                        .padding(.vertical, 10)
                        .background(Color.secondary.opacity(0.1))
                        .clipShape(RoundedRectangle(cornerRadius: 8))
                }
                .accessibilityLabel("Quiz erneut ausfüllen")
            }
        }
        .padding(NahbarInsightStyle.cardPadding)
        .background(NahbarInsightStyle.cardBackground)
        .clipShape(RoundedRectangle(cornerRadius: NahbarInsightStyle.cardCornerRadius))
        .confirmationDialog(
            "Quiz erneut ausfüllen?",
            isPresented: $showRetakeConfirmation,
            titleVisibility: .visible
        ) {
            Button("Erneut ausfüllen", role: .destructive) {
                PersonalityStore.shared.reset()
                onRetake()
            }
            Button("Abbrechen", role: .cancel) {}
        } message: {
            Text("Dein bestehendes Profil wird dabei überschrieben.")
        }
    }

    /// Erste zwei Sätze des Zusammenfassungstexts.
    private var shortSummary: String {
        let sentences = profile.summaryText
            .components(separatedBy: ". ")
            .filter { !$0.isEmpty }
        let first2 = sentences.prefix(2).joined(separator: ". ")
        return first2.hasSuffix(".") ? first2 : first2 + "."
    }
}
