import Foundation

// App Group：主 app 与 Share Extension 共享容器，用于交接待发文件——扩展只把文件搬进收件箱、
// 不跑传输引擎（避 120MB jetsam，见 PLAN §I5 / 决策 D）。两 target 共用此文件（xcodegen 多
// target 引用）。
//
// 收件箱布局：每个待发文件放进独立的 <uuid> 子目录，文件本身保留原名（发送时直接用作传输
// 文件名）；发送 / 取消后删掉该子目录即清理。
enum AppGroup
{
    static let identifier = "group.net.commilitia.Commilitia-Drop"

    // 共享收件箱根目录。容器不存在（App Group 未生效）时返回 nil，调用方降级为静默不交接。
    static func inboxURL() -> URL?
    {
        guard let base = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: identifier)
        else { return nil }
        let inbox = base.appendingPathComponent("SharedInbox", isDirectory: true)
        try? FileManager.default.createDirectory(at: inbox, withIntermediateDirectories: true)
        return inbox
    }

    // 为一个原名分配新的暂存目标 URL（<inbox>/<uuid>/<originalName>），并建好父目录。
    static func stagedDestination(originalName: String) -> URL?
    {
        guard let inbox = inboxURL() else { return nil }
        let dir = inbox.appendingPathComponent(UUID().uuidString, isDirectory: true)
        try? FileManager.default.createDirectory(at: dir, withIntermediateDirectories: true)
        let safeName = originalName.isEmpty ? "file" : originalName
        return dir.appendingPathComponent(safeName)
    }

    // 收件箱内现存的待发文件（主 app 处理分享时扫描，发送后逐个 remove）。
    static func inboxFiles() -> [URL]
    {
        guard let inbox = inboxURL() else { return [] }
        let dirs = (try? FileManager.default.contentsOfDirectory(at: inbox, includingPropertiesForKeys: nil)) ?? []
        return dirs.compactMap
        { dir in
            guard dir.hasDirectoryPath else { return nil }
            let inner = (try? FileManager.default.contentsOfDirectory(at: dir, includingPropertiesForKeys: nil)) ?? []
            return inner.first { !$0.hasDirectoryPath }
        }
    }

    // 发送 / 取消后清理：删掉该文件所在的 <uuid> 子目录。
    static func removeStaged(_ fileURL: URL)
    {
        try? FileManager.default.removeItem(at: fileURL.deletingLastPathComponent())
    }

    // 清理陈旧暂存：发送是异步读取暂存文件的，故发送后不立即删；改由此惰性回收超期子目录
    // （默认 6 小时——远超任何传输时长），避免收件箱无限累积。主 app 每次导入分享时调用。
    static func pruneStale(olderThan seconds: TimeInterval = 6 * 60 * 60)
    {
        guard let inbox = inboxURL() else { return }
        let dirs = (try? FileManager.default.contentsOfDirectory(
            at: inbox, includingPropertiesForKeys: [ .creationDateKey ])) ?? []
        let cutoff = Date().addingTimeInterval(-seconds)
        for dir in dirs
        {
            let created = (try? dir.resourceValues(forKeys: [ .creationDateKey ]).creationDate) ?? .distantPast
            if created < cutoff { try? FileManager.default.removeItem(at: dir) }
        }
    }
}
