import SwiftUI

struct MessagesView: View {
    @State private var messages: [MessageRow] = []
    @State private var status = ""
    @State private var isLoading = false

    var body: some View {
        NavigationStack {
            ScrollView {
                if messages.isEmpty {
                    Text(status.isEmpty ? "No messages." : status)
                        .foregroundStyle(ViewerTheme.muted)
                        .padding(.top, 40)
                } else {
                    LazyVStack(spacing: 10) {
                        ForEach(messages) { row in
                            NavigationLink(value: row.id) {
                                MessageRowView(row: row)
                            }
                        }
                    }
                    .padding(20)
                }
            }
            .navigationTitle("Messages")
            .scrollContentBackground(.hidden)
            .background(ViewerTheme.pageBackground.ignoresSafeArea())
            .refreshable { await load() }
            .task { await load() }
            .navigationDestination(for: Int.self) { id in
                MessageDetailView(id: id)
            }
        }
    }

    private func load() async {
        guard !isLoading else { return }
        isLoading = true
        defer { isLoading = false }
        do {
            let page = try await APIClient.shared.messages(page: 1, perPage: 50)
            messages = page.data
            status = ""
        } catch {
            status = error.localizedDescription
        }
    }
}

struct MessageRowView: View {
    let row: MessageRow

    var body: some View {
        ViewerCard {
            VStack(alignment: .leading, spacing: 6) {
                HStack {
                    Text(row.sender ?? "Unknown")
                        .font(.headline)
                        .foregroundStyle(ViewerTheme.ink)
                    Spacer()
                    Text(row.message_type ?? "—")
                        .font(.caption)
                        .foregroundStyle(ViewerTheme.accent)
                }
                Text(row.device?.device_name ?? "—")
                    .font(.caption)
                    .foregroundStyle(ViewerTheme.muted)
                Text(row.received_at ?? "—")
                    .font(.caption2)
                    .foregroundStyle(ViewerTheme.muted)
            }
        }
    }
}

struct MessageDetailView: View {
    let id: Int
    @State private var detail: MessageDetail?
    @State private var status = ""

    var body: some View {
        ScrollView {
            VStack(alignment: .leading, spacing: 12) {
                if let detail {
                    Text(detail.sender ?? "—").font(.title3.weight(.bold)).foregroundStyle(ViewerTheme.ink)
                    Text(detail.message_type ?? "—").font(.caption).foregroundStyle(ViewerTheme.accent)
                    Text(detail.received_at ?? "—").font(.caption).foregroundStyle(ViewerTheme.muted)
                    Text(detail.device?.device_name ?? "—").font(.caption).foregroundStyle(ViewerTheme.muted)
                    Divider().padding(.vertical, 6)
                    if detail.message_redacted ?? false || detail.message == nil {
                        Text("Details hidden — no permission.")
                            .foregroundStyle(.orange)
                    } else {
                        Text(detail.message ?? "")
                            .foregroundStyle(ViewerTheme.ink)
                    }
                } else {
                    Text(status.isEmpty ? "Loading…" : status).foregroundStyle(ViewerTheme.muted)
                }
            }
            .padding(20)
        }
        .navigationTitle("Message")
        .scrollContentBackground(.hidden)
        .background(ViewerTheme.pageBackground.ignoresSafeArea())
        .task { await load() }
    }

    private func load() async {
        do {
            detail = try await APIClient.shared.message(id: id)
        } catch {
            status = error.localizedDescription
        }
    }
}
