import SwiftUI
import NucleicProtocol

/// Attention-first home (UX_IOS §3): NEEDS YOU pinned at top, then RUNNING, then DONE. Archived
/// chats are hidden (matching the Mac sidebar); disposition splits "needs you" from "done".
struct SessionsView: View {
    @EnvironmentObject var store: RemoteStore
    @State private var showArchived = false

    private var grouped: [(title: String, rows: [WireSessionSummary])] {
        let pool = (showArchived ? store.sessions : store.liveSessions)
            .sorted {
                let a = StatusStyle.sortRank($0), b = StatusStyle.sortRank($1)
                return a == b ? $0.updatedAt > $1.updatedAt : a < b
            }
        let needs = pool.filter { $0.status.needsYou($0.disposition) }
        let running = pool.filter { $0.status == .running || $0.status == .provisioning || $0.status == .idle }
        let done = pool.filter { !needs.contains($0) && !running.contains($0) }
        return [("Needs you", needs), ("Running", running), ("Done", done)].filter { !$0.rows.isEmpty }
    }

    var body: some View {
        NavigationStack {
            Group {
                if store.liveSessions.isEmpty && !showArchived {
                    ContentUnavailableView(
                        "No sessions", systemImage: "square.stack.3d.up",
                        description: Text(store.connectivity.isLive
                            ? "Start a session from Home or the Mac to see it here."
                            : "Waiting to connect to \(store.hostName)…"))
                } else {
                    List {
                        ForEach(grouped, id: \.title) { group in
                            Section(group.title.uppercased()) {
                                ForEach(group.rows, id: \.sessionID) { summary in
                                    NavigationLink {
                                        SessionDetailView(sessionID: summary.sessionID)
                                    } label: {
                                        SessionRow(summary: summary)
                                    }
                                    .swipeActions(edge: .leading) {
                                        Button {
                                            store.setFavorite(summary.sessionID, !summary.favorite)
                                        } label: {
                                            Label("Favorite", systemImage: summary.favorite ? "star.slash" : "star.fill")
                                        }.tint(.yellow)
                                    }
                                    .swipeActions(edge: .trailing) {
                                        Button(role: .destructive) {
                                            store.deleteSession(summary.sessionID)
                                        } label: { Label("Delete", systemImage: "trash") }
                                        Button {
                                            store.setArchived(summary.sessionID, !summary.archived)
                                        } label: {
                                            Label(summary.archived ? "Unarchive" : "Archive",
                                                  systemImage: summary.archived ? "tray.and.arrow.up" : "archivebox")
                                        }.tint(.gray)
                                    }
                                }
                            }
                        }
                    }
                    .listStyle(.insetGrouped)
                    .refreshable { store.refreshSessions() }
                }
            }
            .navigationTitle("Sessions")
            .toolbar {
                ToolbarItem(placement: .topBarTrailing) {
                    Button {
                        showArchived.toggle()
                    } label: {
                        Image(systemName: showArchived ? "archivebox.fill" : "archivebox")
                    }
                }
            }
            .safeAreaInset(edge: .bottom) { ConnectionChip().padding(.bottom, 8) }
        }
    }
}

struct SessionRow: View {
    let summary: WireSessionSummary
    /// Show the project name as subtext. Suppressed when the row already lives inside
    /// its project's own section (e.g. `ProjectDetailView`), where the name is redundant.
    var showProjectName = true

    var body: some View {
        HStack(spacing: 12) {
            Image(systemName: StatusStyle.symbol(summary.status, disposition: summary.disposition))
                .foregroundStyle(Palette.status(summary.status, disposition: summary.disposition))
                .font(.title3)
                .frame(width: 24)
            VStack(alignment: .leading, spacing: 2) {
                HStack(spacing: 5) {
                    if summary.favorite {
                        Image(systemName: "star.fill").font(.caption2).foregroundStyle(.yellow)
                    }
                    Text(summary.title).font(.body.weight(.medium)).lineLimit(1)
                }
                if showProjectName {
                    Text(summary.projectName).font(.caption).foregroundStyle(.secondary)
                }
            }
            Spacer()
            VStack(alignment: .trailing, spacing: 2) {
                if summary.pendingApprovalCount > 0 {
                    Text("\(summary.pendingApprovalCount)")
                        .font(.caption2.bold())
                        .padding(.horizontal, 6).padding(.vertical, 2)
                        .background(Palette.attention, in: Capsule())
                        .foregroundStyle(.white)
                }
                if let diff = summary.diffStat, diff.filesChanged > 0 {
                    Text("+\(diff.added)/−\(diff.removed)")
                        .font(.caption.monospacedDigit())
                        .foregroundStyle(.secondary)
                }
            }
        }
        .padding(.vertical, 2)
    }
}
