import SwiftUI

// MARK: - Quote Model

private struct ZitatResponse: Decodable {
    let quote: String
    let authorName: String
}

// MARK: - Fallback Quotes

private struct LocalQuote {
    let text: String
    let author: String
}

private let fallbackQuotes: [LocalQuote] = [
    LocalQuote(text: "Der Mensch ist dem Menschen am nötigsten.", author: "Lucius Annaeus Seneca"),
    LocalQuote(text: "Glück ist nur real, wenn es geteilt wird.", author: "Christopher McCandless"),
    LocalQuote(text: "Man reist nicht, um anzukommen, sondern um zu reisen.", author: "Johann Wolfgang von Goethe"),
    LocalQuote(text: "Freundschaft ist wie Gesundheit: Ihren Wert kennt man erst, wenn man sie verloren hat.", author: "Unbekannt"),
    LocalQuote(text: "Ein Freund ist jemand, der dich kennt und trotzdem mag.", author: "Elbert Hubbard"),
    LocalQuote(text: "Das Geheimnis der menschlichen Existenz liegt nicht nur darin, am Leben zu bleiben, sondern auch einen Grund zum Leben zu finden.", author: "Fjodor Dostojewski"),
    LocalQuote(text: "Wer einen Freund hat, hat einen Schatz.", author: "Sprichwort"),
    LocalQuote(text: "Nähe entsteht nicht durch Distanz.", author: "Unbekannt"),
    LocalQuote(text: "Der beste Spiegel ist ein alter Freund.", author: "George Herbert"),
    LocalQuote(text: "Manche Menschen kommen in unser Leben und hinterlassen Fußspuren in unseren Herzen.", author: "Unbekannt"),
    LocalQuote(text: "Echte Freundschaft zeigt sich in schwierigen Zeiten.", author: "Aristoteles"),
    LocalQuote(text: "Das Leben wird vorwärts gelebt und rückwärts verstanden.", author: "Søren Kierkegaard"),
    LocalQuote(text: "Verbindung ist das, worum es im Leben geht.", author: "Brené Brown"),
    LocalQuote(text: "Kleine Gesten der Fürsorge können das Leben eines Menschen verändern.", author: "Unbekannt"),
    LocalQuote(text: "Zeit ist das Wertvollste, das ein Mensch verschenken kann.", author: "Unbekannt"),
]

// MARK: - SplashView

struct SplashView: View {
    @Environment(\.nahbarTheme) private var theme
    var onFinished: () -> Void

    @State private var quoteText: String = ""
    @State private var authorName: String = ""
    @State private var logoScale: CGFloat = 0.85
    @State private var logoOpacity: CGFloat = 0
    @State private var quoteShownAt: Date? = nil

    var body: some View {
        ZStack {
            theme.backgroundPrimary.ignoresSafeArea()

            VStack(spacing: 0) {
                Spacer()

                // App Logo
                Image("AppLogo")
                    .resizable()
                    .frame(width: 140, height: 140)
                    .clipShape(RoundedRectangle(cornerRadius: 32, style: .continuous))
                    .scaleEffect(logoScale)
                    .opacity(logoOpacity)

                Spacer()

                // Quote
                if !quoteText.isEmpty {
                    VStack(spacing: 10) {
                        Text("\u{201E}\(quoteText)\u{201C}")
                            .font(.system(.title3, design: theme.displayDesign))
                            .foregroundStyle(theme.contentSecondary)
                            .multilineTextAlignment(.center)
                            .fixedSize(horizontal: false, vertical: true)

                        if !authorName.isEmpty && authorName != "Unbekannt" {
                            Text("— \(authorName)")
                                .font(.system(.subheadline, design: theme.displayDesign))
                                .foregroundStyle(theme.contentTertiary)
                        }
                    }
                    .padding(.horizontal, 36)
                    .padding(.bottom, 52)
                    .transition(.opacity.combined(with: .move(edge: .bottom)))
                }
            }
        }
        .onAppear {
            withAnimation(.spring(duration: 0.6)) {
                logoScale = 1.0
                logoOpacity = 1.0
            }
            Task {
                // API mit 1s Timeout probieren, sonst Fallback
                if let apiQuote = await fetchQuote() {
                    showQuote(text: apiQuote.quote, author: apiQuote.authorName)
                } else {
                    showFallbackQuote()
                }

                // Mindestens 4 Sekunden Zitat sichtbar lassen
                let elapsed = quoteShownAt.map { Date().timeIntervalSince($0) } ?? 0
                let remaining = max(0, 5.0 - elapsed)
                if remaining > 0 {
                    try? await Task.sleep(for: .seconds(remaining))
                }

                withAnimation(.easeInOut(duration: 0.4)) {
                    onFinished()
                }
            }
        }
    }

    private func showQuote(text: String, author: String) {
        withAnimation(.easeIn(duration: 0.5)) {
            quoteText = text
            authorName = author
        }
        quoteShownAt = Date()
    }

    private func showFallbackQuote() {
        guard let local = fallbackQuotes.randomElement() else { return }
        showQuote(text: local.text, author: local.author)
    }

    private func fetchQuote() async -> ZitatResponse? {
        guard let url = URL(string: "https://api.zitat-service.de/v1/quote?language=de") else { return nil }
        let request = URLRequest(url: url, timeoutInterval: 1)
        do {
            let (data, _) = try await URLSession.shared.data(for: request)
            return try JSONDecoder().decode(ZitatResponse.self, from: data)
        } catch {
            return nil
        }
    }
}
