import SwiftUI

struct ContentView: View {
    @StateObject private var model = AppModel()
    private let orange = Color(red: 242/255, green: 118/255, blue: 34/255)

    var body: some View {
        ScrollView {
            VStack(alignment: .leading, spacing: 16) {
                Text("FILYX // IRL TRACKER").font(.caption.bold()).tracking(2.4).foregroundStyle(orange)
                Text("Ton GPS. Ton overlay.\nAucun panel à garder ouvert.").font(.system(size: 30, weight: .black, design: .rounded)).foregroundStyle(.white)
                Text("Associe cet iPhone une fois, autorise la localisation toujours, puis démarre le suivi.").foregroundStyle(.secondary)
                statusCard
                if !model.paired { pairingCard }
                trackingCard
                Text("iOS affiche l’indicateur de localisation pendant le suivi. L’anti-dox, le délai et le trajet public restent appliqués par le serveur FilyX avant l’affichage OBS.").font(.footnote).foregroundStyle(.secondary)
            }.padding(24)
        }.background(Color(red: 9/255, green: 11/255, blue: 16/255).ignoresSafeArea()).preferredColorScheme(.dark)
    }

    private var statusCard: some View {
        VStack(alignment: .leading, spacing: 6) {
            Text(model.paired ? "ASSOCIÉ À \(model.channelName.uppercased())" : "NON ASSOCIÉ").font(.caption.bold()).foregroundStyle(orange)
            Text(model.tripLabel).font(.headline)
            if !model.message.isEmpty { Text(model.message).font(.footnote).foregroundStyle(.secondary) }
            if !model.tracker.error.isEmpty { Text(model.tracker.error).font(.footnote).foregroundStyle(.orange) }
        }.frame(maxWidth: .infinity, alignment: .leading).padding(16).background(.white.opacity(0.06), in: RoundedRectangle(cornerRadius: 16))
    }

    private var pairingCard: some View {
        VStack(spacing: 12) {
            TextField("Code FilyX (8 caractères)", text: $model.code).textInputAutocapitalization(.characters).autocorrectionDisabled().textFieldStyle(.roundedBorder)
            TextField("Nom de l’iPhone", text: $model.deviceName).textFieldStyle(.roundedBorder)
            Button("Associer à FilyX") { Task { await model.pair() } }.buttonStyle(FilyXButtonStyle(primary: true)).disabled(model.busy)
        }.padding(16).background(.white.opacity(0.04), in: RoundedRectangle(cornerRadius: 16))
    }

    private var trackingCard: some View {
        VStack(spacing: 12) {
            Button(model.tracker.running ? "Suivi GPS actif" : "Démarrer le suivi GPS") { model.tracker.start() }.buttonStyle(FilyXButtonStyle(primary: true)).disabled(!model.paired || model.tracker.running)
            Button("Demander l’autorisation Toujours") { model.tracker.requestPermission() }.buttonStyle(FilyXButtonStyle(primary: false)).disabled(!model.paired)
            Button("Arrêter le suivi") { model.tracker.stop() }.buttonStyle(FilyXButtonStyle(primary: false)).disabled(!model.tracker.running)
            Button("Dissocier cet iPhone", role: .destructive) { model.unpair() }.buttonStyle(FilyXButtonStyle(primary: false)).disabled(!model.paired)
        }.padding(16).background(.white.opacity(0.04), in: RoundedRectangle(cornerRadius: 16))
    }
}

private struct FilyXButtonStyle: ButtonStyle {
    let primary: Bool
    func makeBody(configuration: Configuration) -> some View {
        configuration.label.frame(maxWidth: .infinity).font(.headline).padding(.vertical, 13)
            .foregroundStyle(primary ? Color.black : Color.white)
            .background(primary ? Color(red: 242/255, green: 118/255, blue: 34/255) : Color.white.opacity(0.09), in: RoundedRectangle(cornerRadius: 12))
            .opacity(configuration.isPressed ? 0.72 : 1)
    }
}
