import SwiftUI
import CoreBluetooth

struct ServicesView: View {
    @EnvironmentObject var ble: BluetoothManager
    @Environment(\.dismiss) private var dismiss

    var body: some View {
        NavigationView {
            List {
                ForEach(ble.services, id: \.uuid) { service in
                    Section(header: Text(serviceLabel(service)).font(.caption)) {
                        ForEach(service.characteristics ?? [], id: \.uuid) { char in
                            CharacteristicRow(char: char)
                                .environmentObject(ble)
                        }
                    }
                }
            }
            .navigationTitle("Services")
            .navigationBarTitleDisplayMode(.inline)
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button("Done") { dismiss() }
                }
            }
        }
    }

    private func serviceLabel(_ service: CBService) -> String {
        let known: [String: String] = [
            "1800": "Generic Access",
            "1801": "Generic Attribute",
            "180A": "Device Information",
            "180F": "Battery",
            "6E400001-B5A4-F393-E0A9-E50E24DCCA9E": "Nordic UART"
        ]
        return known[service.uuid.uuidString] ?? service.uuid.uuidString
    }
}

struct CharacteristicRow: View {
    @EnvironmentObject var ble: BluetoothManager
    let char: CBCharacteristic

    private var isSelectedForWrite: Bool { ble.selectedWriteCharacteristic?.uuid == char.uuid }
    private var isSubscribed: Bool { ble.subscribedCharacteristics.contains { $0.uuid == char.uuid } }

    var body: some View {
        VStack(alignment: .leading, spacing: 4) {
            HStack {
                Text(char.uuid.uuidString)
                    .font(.system(.caption, design: .monospaced))
                    .foregroundColor(isSelectedForWrite ? .accentColor : .primary)
                Spacer()
                if isSelectedForWrite {
                    Image(systemName: "pencil.circle.fill").foregroundColor(.accentColor)
                }
                if isSubscribed {
                    Image(systemName: "bell.fill").foregroundColor(.green)
                }
            }

            Text(propsText)
                .font(.caption2)
                .foregroundColor(.secondary)
        }
        .contentShape(Rectangle())
        .contextMenu {
            if char.properties.contains(.write) || char.properties.contains(.writeWithoutResponse) {
                Button("Set as TX (write target)") {
                    ble.selectedWriteCharacteristic = char
                }
            }
            if char.properties.contains(.notify) || char.properties.contains(.indicate) {
                if isSubscribed {
                    Button("Unsubscribe") { ble.setNotify(char, enabled: false) }
                } else {
                    Button("Subscribe (notify)") { ble.setNotify(char, enabled: true) }
                }
            }
            if char.properties.contains(.read) {
                Button("Read value") { ble.readValue(char) }
            }
        }
    }

    private var propsText: String {
        var p = [String]()
        if char.properties.contains(.read)                 { p.append("read") }
        if char.properties.contains(.write)                { p.append("write") }
        if char.properties.contains(.writeWithoutResponse) { p.append("writeNoRsp") }
        if char.properties.contains(.notify)               { p.append("notify") }
        if char.properties.contains(.indicate)             { p.append("indicate") }
        return p.joined(separator: " · ")
    }
}
