//
//  PollCreationView.swift
//  SportsTime
//
//  View for creating a new trip poll
//

import SwiftUI

struct PollCreationView: View {
    @Environment(\.dismiss) private var dismiss
    @Environment(\.colorScheme) private var colorScheme
    @State private var viewModel = PollCreationViewModel()

    let trips: [Trip]
    var onPollCreated: ((TripPoll) -> Void)?

    var body: some View {
        NavigationStack {
            Form {
                Section {
                    TextField("Poll Title", text: $viewModel.title)
                        .textInputAutocapitalization(.words)
                        .accessibilityHint("Enter a descriptive name for your poll")
                } header: {
                    Text("Title")
                } footer: {
                    Text("Give your poll a name, like \"Summer Road Trip Options\"")
                }

                Section {
                    ForEach(trips) { trip in
                        TripSelectionRow(
                            trip: trip,
                            isSelected: viewModel.selectedTripIds.contains(trip.id)
                        ) {
                            viewModel.toggleTrip(trip.id)
                        }
                    }
                } header: {
                    Text("Select Trips (\(viewModel.selectedTripIds.count) selected)")
                } footer: {
                    if let message = viewModel.validationMessage {
                        Text(message)
                            .foregroundStyle(.secondary)
                    }
                }
            }
            .navigationTitle("Create Poll")
            .navigationBarTitleDisplayMode(.inline)
            .toolbar {
                ToolbarItem(placement: .cancellationAction) {
                    Button("Cancel") {
                        dismiss()
                    }
                }

                ToolbarItem(placement: .confirmationAction) {
                    Button("Create") {
                        Task {
                            await viewModel.createPoll(trips: trips)
                        }
                    }
                    .disabled(!viewModel.canCreate || viewModel.isLoading)
                }
            }
            .overlay {
                if viewModel.isLoading {
                    ProgressView()
                        .scaleEffect(1.2)
                        .frame(maxWidth: .infinity, maxHeight: .infinity)
                        .background(.ultraThinMaterial)
                }
            }
            .alert("Error", isPresented: .constant(viewModel.error != nil)) {
                Button("OK") {
                    viewModel.error = nil
                }
            } message: {
                if let error = viewModel.error {
                    Text(error.localizedDescription)
                }
            }
            .onChange(of: viewModel.createdPoll) { _, newPoll in
                if let poll = newPoll {
                    onPollCreated?(poll)
                    dismiss()
                }
            }
        }
    }
}

// MARK: - Trip Selection Row

private struct TripSelectionRow: View {
    let trip: Trip
    let isSelected: Bool
    let onTap: () -> Void

    var body: some View {
        Button(action: onTap) {
            HStack {
                VStack(alignment: .leading, spacing: 4) {
                    Text(trip.displayName)
                        .font(.headline)
                        .foregroundStyle(.primary)

                    Text(tripSummary)
                        .font(.subheadline)
                        .foregroundStyle(.secondary)
                }

                Spacer()

                Image(systemName: isSelected ? "checkmark.circle.fill" : "circle")
                    .font(.title2)
                    .foregroundStyle(isSelected ? Theme.warmOrange : .secondary)
                    .accessibilityHidden(true)
            }
            .contentShape(Rectangle())
        }
        .buttonStyle(.plain)
        .accessibilityValue(isSelected ? "Selected" : "Not selected")
        .accessibilityAddTraits(isSelected ? .isSelected : [])
    }

    private var tripSummary: String {
        let stopCount = trip.stops.count
        let gameCount = trip.stops.flatMap { $0.games }.count
        return "\(stopCount) stops, \(gameCount) games"
    }
}

#Preview {
    PollCreationView(trips: [])
}
