// dudu 主 App 入口（14B/14D/14E）：
// NavigationStack 路由（首页 / 购买 / 反馈）+ 登录 sheet + 听写全屏页 + deep link
// （dudu://login | dudu://purchase | dudu://settings | dudu://dictate，键盘扩展跳入）
// + 前台激活时刷新账户（App Group 重读 + GET /v1/me）+ 批量上报打点队列。
import SwiftUI

/// 路由器：NavigationStack path + 登录 sheet + 听写全屏页 + deep link 分发。
@MainActor
final class AppRouter: ObservableObject {
    enum Route: Hashable {
        case purchase
        case feedback
    }

    @Published var path = NavigationPath()
    @Published var showLogin = false
    /// 14D deep link 听写页（fullScreenCover）
    @Published var showDictation = false

    /// 键盘扩展 deep link：dudu://login（guest 态）| dudu://purchase（quota 态）
    /// | dudu://settings | dudu://dictate（14D 听写，MicBar 按一下跳入）
    func handle(_ url: URL, loggedIn: Bool) {
        guard url.scheme == "dudu" else { return }
        switch url.host() {
        case "login":
            path = NavigationPath()
            showLogin = true
        case "purchase":
            if loggedIn {
                path = NavigationPath([Route.purchase])
            } else {
                path = NavigationPath()
                showLogin = true // 先登录，登录后用户自己再进购买
            }
        case "dictate":
            // 14D：键盘扩展发起听写。iOS 不允许键盘扩展携带"可自动跳回宿主 App"的
            // return 上下文（无公开 API），听写完成后只能引导用户手动切回原 App，
            // 由键盘读 App Group pending_text 自动上屏（剪贴板双保险）。
            // guest/quota 拦截在 DictationView 内做（带"去登录/去充值"引导）。
            showLogin = false
            showDictation = true
        default:
            path = NavigationPath() // settings 等：回首页（含权限自检与引导）
        }
    }
}

@main
struct DuduApp: App {
    @StateObject private var account = AccountStore()
    @StateObject private var router = AppRouter()
    @Environment(\.scenePhase) private var scenePhase

    var body: some Scene {
        WindowGroup {
            NavigationStack(path: $router.path) {
                HomeView()
                    .navigationDestination(for: AppRouter.Route.self) { route in
                        switch route {
                        case .purchase: PurchaseView()
                        case .feedback: FeedbackView()
                        }
                    }
            }
            .environmentObject(account)
            .environmentObject(router)
            .sheet(isPresented: $router.showLogin) {
                LoginView()
            }
            .fullScreenCover(isPresented: $router.showDictation) {
                DictationView() // 14D deep link 听写页（深色玻璃全屏）
            }
            .onOpenURL { url in
                router.handle(url, loggedIn: account.token != nil)
            }
            .onChange(of: scenePhase) { _, phase in
                guard phase == .active else { return }
                // 键盘扩展可能改写过 App Group（kb 标记、14D 的 usage 帧），回前台时重读
                account.reload()
                refreshMe()
                // 打点批量上报：键盘扩展只写队列，由主 App 前台时 flush（设计 9.3）
                Task { await MetricsQueue.shared.flush() }
            }
        }
    }

    /// 前台拉一次 /v1/me 刷新余额；token 失效则登出回 guest，网络失败保留本地缓存值。
    private func refreshMe() {
        guard let token = account.token else { return }
        Task {
            do {
                account.applyMe(try await Api.client.me(token: token))
            } catch let apiErr as ApiError where apiErr.code == ApiError.unauthorized {
                account.logout()
            } catch {
                // 网络抖动等：什么都不做，用 App Group 里的缓存值
            }
        }
    }
}
