import Foundation
import SwiftData
import OSLog

private let logger = Logger(subsystem: "nahbar", category: "AppGroup")

/// Gemeinsame App-Group-Konfiguration für Hauptapp und Share Extension.
enum AppGroup {
    static let identifier = "group.nahbar.shared"

    // MARK: - UserDefaults

    /// Shared UserDefaults für die Kommunikation zwischen Hauptapp und Extension.
    /// Gibt NIEMALS UserDefaults.standard zurück – lieber einen klaren Fehler loggen,
    /// damit Konfigurationsprobleme auffallen statt still ignoriert werden.
    static var userDefaults: UserDefaults {
        if let ud = UserDefaults(suiteName: identifier) {
            return ud
        }
        // App-Group nicht konfiguriert oder Entitlements fehlen.
        // Share Extension wird dann nicht mit der Hauptapp kommunizieren können.
        logger.critical("App Group '\(identifier)' nicht verfügbar – Share Extension funktioniert nicht")
        return .standard
    }

    // MARK: - iCloud-Sync Key

    static let icloudSyncKey = "icloudSyncEnabled"

    // MARK: - Pending Moments Queue
    // Die Share Extension speichert Momente in der App Group.
    // Die Hauptapp importiert diese beim Vordergrundwechsel.
    // Jeder Eintrag enthält personID (UUID-String) als primären Identifier
    // sowie personName als Fallback (für den Fall dass ID nicht gefunden wird).

    static func enqueueMoment(
        personID: UUID,
        personName: String,
        text: String,
        type: String,
        source: String? = nil,
        createdAt: Date = Date()
    ) {
        var queue = pendingMoments
        var entry: [String: String] = [
            "personID":   personID.uuidString,
            "personName": personName,
            "text":       text,
            "type":       type,
            "createdAt":  ISO8601DateFormatter().string(from: createdAt)
        ]
        if let source { entry["source"] = source }
        queue.append(entry)

        guard let data = try? JSONSerialization.data(withJSONObject: queue) else {
            logger.error("pendingMoments konnte nicht serialisiert werden")
            return
        }
        userDefaults.set(data, forKey: "pendingMoments")
        logger.debug("Moment eingereiht für \(personName) (ID: \(personID.uuidString))")
    }

    static var pendingMoments: [[String: String]] {
        guard let data = userDefaults.data(forKey: "pendingMoments"),
              let array = try? JSONSerialization.jsonObject(with: data) as? [[String: String]]
        else { return [] }
        return array
    }

    static func clearPendingMoments() {
        userDefaults.removeObject(forKey: "pendingMoments")
    }

    // MARK: - Personenliste für Extension

    /// Hauptapp schreibt beim Start/Änderung die Personenliste in die App Group,
    /// damit die Extension sie ohne Store-Zugriff lesen kann.
    /// Enthält ID + Name + Tag für jede Person.
    static func savePeopleList(_ people: [Person]) {
        let list = people.map { [
            "id":   $0.id.uuidString,
            "name": $0.name,
            "tag":  $0.tagRaw
        ]}
        guard let data = try? JSONSerialization.data(withJSONObject: list) else {
            logger.warning("Personenliste konnte nicht in App Group gespeichert werden")
            return
        }
        userDefaults.set(data, forKey: "cachedPeople")
    }

    static var cachedPeople: [[String: String]] {
        guard let data = userDefaults.data(forKey: "cachedPeople"),
              let array = try? JSONSerialization.jsonObject(with: data) as? [[String: String]]
        else { return [] }
        return array
    }

    // MARK: - Abo-Status (Hauptapp schreibt, Extension liest)

    /// Hauptapp schreibt nach jeder Status-Aktualisierung den Pro-Status in die App Group,
    /// damit die Share Extension ihn ohne StoreKit-Zugriff prüfen kann.
    static func saveProStatus(_ isPro: Bool) {
        userDefaults.set(isPro, forKey: "isPro")
    }

    static var isProUser: Bool {
        userDefaults.bool(forKey: "isPro")
    }
}
