//
//  ContentView.swift
//  Waterfall_UI
//
//  Created by Jacky Jack on 06/01/2025.
//

import SwiftUI
import SwiftData

private struct DeviceChoose: Identifiable {
    let deviceName: String
    var id: String { deviceName }
}

private let deviceList: [DeviceChoose] = [
    DeviceChoose(deviceName:"RtlSDR   SN:00000000"),
    DeviceChoose(deviceName:"BladeRF  SN:00000000"),
    DeviceChoose(deviceName:"AirSpy   SN:00000000"),
    DeviceChoose(deviceName:"AirSpyHF SN:00000000")
]

private struct SampleRateChoose: Identifiable {
    let sampleRate: Int
    var id: String { String(sampleRate) }
}

private let sampleRateList: [SampleRateChoose] = [
    SampleRateChoose(sampleRate:1000),
    SampleRateChoose(sampleRate:100000)
]

private struct FFTOptions: Identifiable {
    let binsize: Int
    var id: String { String(binsize) }
}

private let fftBinsList: [FFTOptions] = [
    FFTOptions(binsize: 512),
    FFTOptions(binsize: 1024),
    FFTOptions(binsize: 2048),
    FFTOptions(binsize: 4096),
]

struct ContentView: View {
    @Environment(\.modelContext) private var modelContext
    
    @EnvironmentObject var sdrSpectrum: SDRSpectrum
    
    @Query private var items: [Item]
    
    @State private var selectedDevice: String = deviceList[0].deviceName
    @State private var selectedSampleRate: String  = String(sampleRateList[0].sampleRate)
    @State private var setFrequency: Int = 100000000
    @State private var toggleAGC: Bool = false
    @State private var selectorFFTBin: String = String(fftBinsList[0].binsize)
    @State private var statusMessage: String = ""
    
    
    var body: some View {
        /*
        NavigationSplitView {
            List {
                ForEach(items) { item in
                    NavigationLink {
                        Text("Item at \(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard))")
                    } label: {
                        Text(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard))
                    }
                }
                .onDelete(perform: deleteItems)
            }
            .navigationSplitViewColumnWidth(min: 180, ideal: 200)
            .toolbar {
                ToolbarItem {
                    Button(action: addItem) {
                        Label("Add Item", systemImage: "plus")
                    }
                }
            }
        } detail: {
            Text("Select an item")
        }
        */
        HStack {
            VStack {
                Text("Hardware")//.border(.red)
                Picker("Device", selection:$selectedDevice) {
                    ForEach(deviceList) { device in
                        Text("\(device.deviceName)")
                    }
                }
                .onChange(of: selectedDevice) {
                    statusMessage = "selected \(selectedDevice)"
                }
                Picker("SampleRate", selection:$selectedSampleRate) {
                    ForEach(sampleRateList) { samplerate in
                        Text("\(samplerate.sampleRate)")
                    }
                }.onChange(of:selectedSampleRate) {
                    statusMessage = "selected \(selectedSampleRate)"
                }
                Divider()
                HStack {
                    Text("Control")
                    Button("Start") {
                        print("Start")
                        statusMessage = "Running"
                    }
                    Button("Stop") {
                        print("Stop")
                        statusMessage = "Idle"
                    }
                }
                Divider()
                Text("Config")
                HStack {
                    Text("Frequency: ")
                    TextField("Frquency: ", value: $setFrequency, format: .number)
                        .onChange(of: setFrequency) {
                            statusMessage = "frequency \(setFrequency)"
                        }
                        .onSubmit {
                            statusMessage = "frequency submit"
                        }
                    Text("Hz")
                }
                Toggle("AGC",isOn: $toggleAGC)
                    .onChange(of: toggleAGC) {
                        if (self.toggleAGC) {
                            statusMessage = "AGC on"
                        } else {
                            statusMessage = "AGC off"
                        }
                    }
                Divider()
                Text("FFT View")
                Picker("FFT bins", selection:$selectorFFTBin) {
                    ForEach(fftBinsList) { binssize in
                        Text("\(binssize.binsize)")
                    }
                }
                    .onChange(of: selectorFFTBin) {
                        statusMessage = "set fft bins \(selectorFFTBin)"
                    }
                Spacer()
                Divider()//.border(.red)
                
                HStack {
                    Text("Version: \(software_version)")//.border(.red)
                    Spacer()
                }
            }
            Divider()
            VStack {
                //Text("Right")//.border(.red)
                Divider()
                Image(decorative: sdrSpectrum.outputImage,
                                  scale: 1,
                                  orientation: .left)
                            .resizable()
                            .scaledToFit()
                .rotationEffect(Angle(degrees: 90))
                Spacer()
                Divider()//.border(.red)
                
                HStack {
                    Spacer()
                    Text("Status message: \(statusMessage)")//.border(.red)
                }
            }
        }
    }

    private func addItem() {
        withAnimation {
            let newItem = Item(timestamp: Date())
            modelContext.insert(newItem)
        }
    }

    private func deleteItems(offsets: IndexSet) {
        withAnimation {
            for index in offsets {
                modelContext.delete(items[index])
            }
        }
    }
}

#Preview {
    ContentView()
        .modelContainer(for: Item.self, inMemory: true)
}