//
//  SessionTokenStore.swift
//  suixinkan
//
//  Created by Codex on 2026/6/20.
//

import Foundation

/// 正式登录 token 存储服务，封装 UserDefaults 读写并保持业务层不接触缓存细节。
final class SessionTokenStore {
    private let defaults: UserDefaults
    private let key: String

    /// 初始化 token 存储服务，默认按 App Bundle 和账号名隔离 UserDefaults 键。
    init(
        defaults: UserDefaults = .standard,
        key: String? = nil,
        service: String = Bundle.main.bundleIdentifier ?? "com.yuanzhixiang.suixinkan",
        account: String = "session.token"
    ) {
        self.defaults = defaults
        self.key = key ?? "suixinkan.session.token.\(service).\(account)"
    }

    /// 保存正式 token，空 token 会被视为清空凭证。
    func save(_ token: String) throws {
        let trimmedToken = token.trimmingCharacters(in: .whitespacesAndNewlines)
        guard !trimmedToken.isEmpty else {
            try clear()
            return
        }

        defaults.set(trimmedToken, forKey: key)
    }

    /// 读取本地正式 token，读取失败或无值时返回 nil。
    func load() -> String? {
        guard let token = defaults.string(forKey: key)?
                .trimmingCharacters(in: .whitespacesAndNewlines),
              !token.isEmpty else {
            return nil
        }
        return token
    }

    /// 清空本地正式 token。
    func clear() throws {
        defaults.removeObject(forKey: key)
    }
}
