import SwiftUI
import NucleicProtocol

/// Start a new chat in a project, straight from Home (control scope — mirrors the Mac's home
/// composer). Picks a project, types a prompt, optionally toggles Auto.
struct StartChatComposer: View {
    @EnvironmentObject var store: RemoteStore
    @State private var projectID: ProjectID?
    @State private var draft = ""
    @State private var auto = false
    @State private var model: String?
    @State private var effort = MobileEfforts.fallback

    private var projects: [WireProject] { store.dashboard.projects }
    private var selected: WireProject? {
        projects.first { $0.id == projectID } ?? projects.first
    }
    private var controlled: Bool { selected?.isNucleicControlled ?? false }

    var body: some View {
        VStack(alignment: .leading, spacing: 10) {
            Text("New chat").font(.headline)
            HStack {
                Menu {
                    ForEach(projects) { project in
                        Button(project.name) { projectID = project.id }
                    }
                } label: {
                    Label(selected?.name ?? "Select a project", systemImage: "folder")
                        .font(.subheadline)
                }
                Spacer()
                Toggle(isOn: $auto) {
                    Label("Auto", systemImage: auto ? "bolt.fill" : "bolt.slash")
                }
                .toggleStyle(.button)
                .tint(Palette.accent)
                .font(.caption)
            }
            HStack {
                // The model also selects the backend, so the home composer offers every provider.
                ModelMenu(model: $model, catalog: store.modelCatalog, backend: nil)
                Spacer()
                EffortMenu(effort: $effort, catalog: store.modelCatalog, modelSKU: model, controlled: controlled)
            }
            HStack(alignment: .bottom, spacing: 8) {
                TextField("Describe a task…", text: $draft, axis: .vertical)
                    .textFieldStyle(.roundedBorder)
                    .lineLimit(1...5)
                    .orchestraGlow(active: MobileEfforts.isOrchestra(effort) && controlled)
                    .keyboardDismissable()
                Button {
                    if let project = selected {
                        store.startChat(in: project.id, message: draft, model: model, effort: effort, auto: auto)
                        draft = ""
                    }
                } label: {
                    Image(systemName: "arrow.up.circle.fill").font(.title)
                }
                .disabled(selected == nil || draft.trimmingCharacters(in: .whitespaces).isEmpty || !store.canControl)
            }
            if !store.canControl {
                Text("This device is view-only.").font(.caption2).foregroundStyle(.secondary)
            }
        }
        .card()
        // Switching to a model with a lower effort cap can't leave an unsupported level selected.
        .onChange(of: model) { _, newModel in
            let levels = store.modelCatalog.offeredEfforts(forModel: newModel)
            let sentinel = store.modelCatalog.orchestraSentinelOrFallback
            if effort.caseInsensitiveCompare(sentinel) != .orderedSame, !levels.contains(effort) {
                effort = levels.last ?? MobileEfforts.fallback
            }
        }
    }
}

/// A compact peek at open ideas with inline capture; the full inbox is the To-Dos tab.
struct QuickTodos: View {
    @EnvironmentObject var store: RemoteStore
    @State private var draft = ""

    private var open: [WireTodo] { store.dashboard.todos.filter { $0.status == .open } }

    var body: some View {
        VStack(alignment: .leading, spacing: 10) {
            HStack {
                Text("To-dos").font(.headline)
                Spacer()
                if !open.isEmpty { Text("\(open.count)").foregroundStyle(.secondary) }
            }
            HStack {
                TextField("Capture an idea…", text: $draft)
                    .textFieldStyle(.roundedBorder)
                    .onSubmit(capture)
                    .keyboardDismissable()
                Button(action: capture) { Image(systemName: "plus.circle.fill").font(.title3) }
                    .disabled(draft.trimmingCharacters(in: .whitespaces).isEmpty || !store.canControl)
            }
            ForEach(open.prefix(3)) { todo in
                HStack(spacing: 10) {
                    Button { store.completeTodo(todo.id) } label: {
                        Image(systemName: "circle").foregroundStyle(.secondary)
                    }.buttonStyle(.plain)
                    Text(todo.summary?.isEmpty == false ? todo.summary! : todo.text)
                        .font(.subheadline).lineLimit(1)
                    Spacer()
                    if let name = todo.projectName {
                        Text(name).font(.caption2).foregroundStyle(.secondary)
                    }
                }
            }
        }
        .card()
    }

    private func capture() {
        store.captureTodo(draft, projectID: nil)
        draft = ""
    }
}
