/**
 *
 *    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
import os.log

@main
struct TvCastingApp: App {
    let Log = Logger(subsystem: "com.matter.casting",
                     category: "TvCastingApp")
    @State
    var firstAppActivation: Bool = true

    var body: some Scene {
        WindowGroup {
            ContentView()
                .onAppear(perform: {
                    if let castingServerBridge = CastingServerBridge.getSharedInstance()
                    {
                        let appParameters: AppParameters = AppParameters()
                        
                        var rotatingDeviceIdUniqueId: [UInt8] = [UInt8](repeating: 0, count: 16 )
                        for i in (0...15)
                        {
                            rotatingDeviceIdUniqueId[i] = UInt8.random(in: 0..<255)
                        }
                        appParameters.rotatingDeviceIdUniqueId = Data(rotatingDeviceIdUniqueId)
                        
                        let onboardingParameters: OnboardingPayload = OnboardingPayload()
                        onboardingParameters.setupPasscode = 20202021
                        onboardingParameters.setupDiscriminator = 3840
                        
                        appParameters.onboardingPayload = onboardingParameters
                        
                        let err = castingServerBridge.initializeApp(appParameters, clientQueue: DispatchQueue.main, initAppStatusHandler: { (result: Bool) -> () in
                            self.Log.info("initializeApp result \(result)")
                        })
                        self.Log.info("initializeApp return value \(err)")
                    }
                })
                .onReceive(NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification)) { _ in
                    self.Log.info("TvCastingApp: UIApplication.willResignActiveNotification")
                    if let castingServerBridge = CastingServerBridge.getSharedInstance()
                    {
                        castingServerBridge.stopMatterServer()
                    }
                }
                .onReceive(NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)) { _ in
                    self.Log.info("TvCastingApp: UIApplication.didBecomeActiveNotification")
                    if(!firstAppActivation)
                    {
                        if let castingServerBridge = CastingServerBridge.getSharedInstance()
                        {
                            castingServerBridge.startMatterServer(DispatchQueue.main, startMatterServerCompletionCallback: { (error: MatterError) -> () in
                                DispatchQueue.main.async {
                                    self.Log.info("TvCastingApp.startMatterServerCompletionCallback called with \(error)")
                                }
                            })
                        }
                    }
                    firstAppActivation = false
                }
                .onReceive(NotificationCenter.default.publisher(for: UIApplication.didEnterBackgroundNotification)) { _ in
                    self.Log.info("TvCastingApp: UIApplication.didEnterBackgroundNotification")
                }
                .onReceive(NotificationCenter.default.publisher(for: UIApplication.didFinishLaunchingNotification)) { _ in
                    self.Log.info("TvCastingApp: UIApplication.didFinishLaunchingNotification")
                }
                .onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in
                    self.Log.info("TvCastingApp: UIApplication.willEnterForegroundNotification")
                }
                .onReceive(NotificationCenter.default.publisher(for: UIApplication.willTerminateNotification)) { _ in
                    self.Log.info("TvCastingApp: UIApplication.willTerminateNotification")
                }
        }
    }
}
