/**
 *
 *    Copyright (c) 2020-2022 Project CHIP Authors
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */


import SwiftUI

struct CommissioningView: View {
    var selectedCommissioner: DiscoveredNodeData?
    
    @StateObject var viewModel = CommissioningViewModel();
    
    init(_selectedCommissioner: DiscoveredNodeData?) {
        self.selectedCommissioner = _selectedCommissioner
    }
    
    var body: some View {
        VStack(alignment: .leading) {
            if(viewModel.commisisoningWindowOpened == true) {
                Text("Commissioning window opened.").padding()
                
                Text("Onboarding PIN: " + String((CastingServerBridge.getSharedInstance()?.getOnboardingPaylod().setupPasscode)!))
                    .border(Color.blue, width: 1)
                    .padding()
                Text("Discriminator: " + String((CastingServerBridge.getSharedInstance()?.getOnboardingPaylod().setupDiscriminator)!))
                    .border(Color.blue, width: 1)
                    .padding()

                if(self.selectedCommissioner != nil)
                {
                    if(viewModel.udcRequestSent == true)
                    {
                        Text("Complete commissioning on " + (selectedCommissioner?.deviceName)!)
                            .padding()
                    }
                    else if(viewModel.udcRequestSent == false) {
                        Text("Could not send user directed commissioning request to " + (selectedCommissioner?.deviceName)! + "! Complete commissioning manually!")
                            .foregroundColor(Color.red)
                            .padding()
                    }
                }
                else{
                    Text("Complete commissioning with a commissioner manually!").padding()
                }
            }
            else if(viewModel.commisisoningWindowOpened == false) {
                Text("Failed to open Commissioning window!")
                    .foregroundColor(Color.red)
                    .padding()
            }
            
            if(viewModel.commisisoningComplete == true)
            {
                Text("Commissioning finished!").padding()
                
                if let connectionSuccess = viewModel.connectionSuccess
                {
                    if let connectionStatus = viewModel.connectionStatus
                    {
                        Text(connectionStatus).padding()
                    }
                    
                    if(connectionSuccess)
                    {
                        NavigationLink(
                            destination: ClusterSelectorView(),
                            label: {
                                Text("Next")
                                    .frame(width: 100, height: 30, alignment: .center)
                                    .border(Color.black, width: 1)
                            }
                        ).background(Color.blue)
                            .foregroundColor(Color.white)
                            .frame(maxHeight: .infinity, alignment: .bottom)
                            .padding()
                    }
                }
            }
            else if(viewModel.commisisoningComplete == false)
            {
                Text("Commissioning failure!")
                    .foregroundColor(Color.red)
                    .padding()
            }
        }
        .navigationTitle("Commissioning...")
        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .top)
        .onAppear(perform: {
            viewModel.prepareForCommissioning(selectedCommissioner: self.selectedCommissioner)
        })
    }
}

struct CommissioningView_Previews: PreviewProvider {
    static var previews: some View {
        CommissioningView(_selectedCommissioner: nil)
    }
}
