import SwiftUI

struct HomeView: View {
    @EnvironmentObject private var store: SecureStore

    var body: some View {
        TabView {
            DashboardTab()
                .tabItem { Label("Home", systemImage: "house") }

            if store.hasPage("messages") {
                MessagesView()
                    .tabItem { Label("Messages", systemImage: "envelope") }
            }

            if store.hasPage("alerts") {
                AlertsView()
                    .tabItem { Label("Alerts", systemImage: "bell") }
            }

            AccountView()
                .tabItem { Label("Account", systemImage: "person.circle") }
        }
        .tint(ViewerTheme.accent)
    }
}

struct DashboardTab: View {
    @State private var stats: StatsResponse?
    @State private var unreadAlerts: [AlertItem] = []
    @State private var status = ""

    var body: some View {
        NavigationStack {
            ScrollView {
                VStack(spacing: 16) {
                    HStack(spacing: 14) {
                        StatCard(title: "Unread alerts", value: stats?.unread_alerts ?? unreadAlerts.filter { !($0.is_read ?? false) }.count)
                        StatCard(title: "Today's messages", value: stats?.today_messages ?? 0)
                    }

                    if unreadAlerts.isEmpty {
                        Text("No unread alerts.")
                            .foregroundStyle(ViewerTheme.muted)
                            .padding(.top, 20)
                    } else {
                        VStack(spacing: 10) {
                            ForEach(unreadAlerts) { alert in
                                AlertRow(alert: alert)
                            }
                        }
                    }

                    if !status.isEmpty {
                        Text(status).font(.footnote).foregroundStyle(.orange)
                    }
                }
                .padding(20)
            }
            .navigationTitle(store.displayAppName)
            .scrollContentBackground(.hidden)
            .background(ViewerTheme.pageBackground.ignoresSafeArea())
            .refreshable { await load() }
            .task { await load() }
        }
    }

    private func load() async {
        status = ""
        var loadedStats: StatsResponse?
        var loadedAlerts: [AlertItem] = []
        do {
            loadedStats = try await APIClient.shared.stats()
        } catch {
            // stats may 403 if the user lacks dashboard/messages/alerts pages
        }
        do {
            loadedAlerts = try await APIClient.shared.alerts()
        } catch {
            status = error.localizedDescription
        }
        if let s = loadedStats { stats = s }
        unreadAlerts = loadedAlerts.filter { !($0.is_read ?? false) }
        if loadedStats == nil && loadedAlerts.isEmpty && status.isEmpty {
            status = "Unable to load. Pull to refresh."
        }
    }
}

struct StatCard: View {
    let title: String
    let value: Int

    var body: some View {
        ViewerCard {
            VStack(alignment: .leading, spacing: 4) {
                Text(title)
                    .font(.caption)
                    .foregroundStyle(ViewerTheme.muted)
                Text("\(value)")
                    .font(.system(size: 30, weight: .bold))
                    .foregroundStyle(ViewerTheme.accent)
            }
        }
    }
}
