//
//  SceneDelegate.swift
//  Lanu
//
//  Created by OneeChan on 2025/11/6.
//

import UIKit
import Combine

#if DEBUG
import DoraemonKit
#endif

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?
    
    func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
        handleUniversalLink(userActivity: userActivity)
    }
    
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        guard let sceneWindow = (scene as? UIWindowScene) else { return }
        
        window = UIWindow(windowScene: sceneWindow)
        window?.backgroundColor = .white
        window?.overrideUserInterfaceStyle = .light
        window?.makeKeyAndVisible()
        window?.rootViewController = LNNavigationController(rootViewController: LNMainViewController())
        
        LNEventDeliver.addObserver(self)
        
        autoLoginIfNeed()
        
        #if DEBUG
        DoraemonManager.shareInstance().install()
        #endif
        
        if let userActivity = connectionOptions.userActivities.first {
            handleUniversalLink(userActivity: userActivity)
        }
    }

    func sceneDidDisconnect(_ scene: UIScene) {
        // Called as the scene is being released by the system.
        // This occurs shortly after the scene enters the background, or when its session is discarded.
        // Release any resources associated with this scene that can be re-created the next time the scene connects.
        // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
    }

    func sceneDidBecomeActive(_ scene: UIScene) {
        // Called when the scene has moved from an inactive state to an active state.
        // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
    }

    func sceneWillResignActive(_ scene: UIScene) {
        // Called when the scene will move from an active state to an inactive state.
        // This may occur due to temporary interruptions (ex. an incoming phone call).
    }

    func sceneWillEnterForeground(_ scene: UIScene) {
        // Called as the scene transitions from the background to the foreground.
        // Use this method to undo the changes made on entering the background.
    }

    func sceneDidEnterBackground(_ scene: UIScene) {
        // Called as the scene transitions from the foreground to the background.
        // Use this method to save data, release shared resources, and store enough scene-specific state information
        // to restore the scene back to its current state.
    }
    
    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
        if let urlContext = URLContexts.first {
            let url = urlContext.url
            LNDeeplinkManager.shared.handleDeepLink(url)
        }
    }
}

extension SceneDelegate: LNNetworkMonitorNotify {
    func onNetworkStateChanged(state: LNNetworkState) {
        if state == .available {
            autoLoginIfNeed()
        } else {
            Log.d("network invailable")
        }
    }
}

extension SceneDelegate: LNAppMainEvent {
    func onAppLanguageChanged(newLanguage: LNAppLanguage) {
        let nav = LNNavigationController(rootViewController: LNMainViewController())
        window?.rootViewController = nav
        nav.viewControllers.append(LNSettingsViewController())
        
        LNProfileManager.shared.reportCurrentLanguage(code: newLanguage.languageCode) { _ in }
    }
}

extension SceneDelegate: LNAccountManagerNotify {
    func onUserLogout() {
        window?.rootViewController = LNNavigationController(rootViewController: LNMainViewController())
    }
    
    func onUserLogin() {
        guard let nav = window?.rootViewController as? UINavigationController else {
            return
        }
        
        if let index = nav.viewControllers.lastIndex(where: {
            !($0 is LNLoginPhoneInputViewController
              || $0 is LNLoginCaptchaInputViewController) }) {
            let viewControllers = Array(nav.viewControllers[0...index])
            nav.setViewControllers(viewControllers, animated: true)
        }
    }
}

extension SceneDelegate {
    private func autoLoginIfNeed() {
        guard LNAccountManager.shared.wasLogin,
              LNNetworkMonitor.curState == .available else { return }
        
        LNAccountManager.shared.loginByToken()
    }
    
    private func handleUniversalLink(userActivity: NSUserActivity) {
        // 验证是否为 Universal Link
        guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
              let url = userActivity.webpageURL else {
            return
        }
        
        LNDeeplinkManager.shared.handleDeepLink(url)
    }
}
