import AppKit
import Foundation

// Run against the unchanged v1.0.0 sources. All file operations use this process's
// temporary directory. Drive toggles stay disabled; the real Desktop is never used.
UserDefaults.standard.set(true, forKey: "migratedFromHideDesktop")
let settings = Settings.shared
settings.hideDrives = false
settings.drivesHiddenByUs = false
settings.trackedNames = []
settings.isHiding = false
let fm = FileManager.default
let root = fm.temporaryDirectory.appendingPathComponent("BareEvidence-" + UUID().uuidString)
let desktop = root.appendingPathComponent("Desktop")
try fm.createDirectory(at: desktop, withIntermediateDirectories: true)
let hider = DesktopHider(desktop: desktop)
func flags(_ url: URL) -> UInt32 {
    var st = stat()
    precondition(lstat(url.path, &st) == 0)
    return st.st_flags
}
func setFlags(_ url: URL, _ value: UInt32) {
    precondition(lchflags(url.path, value) == 0)
}
func hidden(_ url: URL) -> Bool { flags(url) & UInt32(UF_HIDDEN) != 0 }
func check(_ condition: @autoclosure () -> Bool, _ name: String) {
    precondition(condition(), name)
    print("PASS: " + name)
}
let capture = desktop.appendingPathComponent("Screenshot demo.png")
let document = desktop.appendingPathComponent("Plan.txt")
let folder = desktop.appendingPathComponent("Project")
let previouslyHidden = desktop.appendingPathComponent("Already hidden.txt")
let bytes = Data("Controlled fixture; no personal content.".utf8)
try bytes.write(to: capture)
try bytes.write(to: document)
try bytes.write(to: previouslyHidden)
try fm.createDirectory(at: folder, withIntermediateDirectories: false)
setFlags(previouslyHidden, UInt32(UF_HIDDEN))
setFlags(capture, UInt32(UF_NODUMP))
settings.enabledCategories = [.screenshots]
settings.isHiding = true
hider.apply()
check(hidden(capture) && !hidden(document) && !hidden(folder), "screenshot category hides capture and leaves document/folder visible")
check(!settings.trackedNames.contains(previouslyHidden.lastPathComponent), "pre-existing hidden file is not tracked")
check(flags(capture) & UInt32(UF_NODUMP) != 0, "other file flags survive hiding")
check(try! Data(contentsOf: capture) == bytes, "file bytes remain unchanged")
settings.isHiding = false
hider.apply()
check(!hidden(capture) && hidden(previouslyHidden), "Show restores Bare-owned item and preserves pre-existing hidden item")
check(flags(capture) & UInt32(UF_NODUMP) != 0, "other file flags survive restoration")

let target = root.appendingPathComponent("Target.txt")
let link = desktop.appendingPathComponent("Target alias")
try bytes.write(to: target)
try fm.createSymbolicLink(at: link, withDestinationURL: target)
settings.enabledCategories = [.apps]
settings.isHiding = true
hider.apply()
check(hidden(link) && !hidden(target), "symlink is hidden without changing target flags")
settings.isHiding = false
hider.apply()
check(!hidden(link), "symlink restoration clears its hidden flag")

settings.enabledCategories = [.screenshots]
settings.isHiding = true
hider.apply()
hider.apply(forceShow: true)
check(!hidden(capture) && settings.isHiding, "forceShow restores visibility without resetting saved hiding mode")
hider.apply()
check(hidden(capture), "applying saved hiding mode hides the item again")

let renamed = desktop.appendingPathComponent("Screenshot renamed.png")
try fm.moveItem(at: capture, to: renamed)
hider.apply(forceShow: true)
check(hidden(renamed) && !settings.trackedNames.contains(renamed.lastPathComponent), "renamed hidden item is not restored by name-based bookkeeping")
setFlags(renamed, flags(renamed) & ~UInt32(UF_HIDDEN))

settings.trackedNames = ["Previously tracked.txt"]
let missing = DesktopHider(desktop: root.appendingPathComponent("Missing"))
missing.apply(forceShow: true)
check(missing.lastError != nil && settings.trackedNames.contains("Previously tracked.txt"), "failed directory scan preserves tracked names")
settings.trackedNames = []
settings.enabledCategories = [.screenshots]
settings.isHiding = true
settings.autoHideNew = true
hider.startWatching()
let arrival = desktop.appendingPathComponent("Screenshot arrival.png")
try bytes.write(to: arrival)
let deadline = Date().addingTimeInterval(2)
while !hidden(arrival) && Date() < deadline {
    RunLoop.current.run(until: Date().addingTimeInterval(0.05))
}
hider.stopWatching()
check(hidden(arrival), "directory watcher hides a new matching capture within the two-second test window")
settings.isHiding = false
hider.apply()
print("Fixtures retained for inspection at: " + root.path)
