import AVFoundation
import UIKit

/// Small JPEG thumbnails stored per clip ID. Captured at import time so a clip
/// still has a recognizable image after its reference breaks — the relink
/// confirmation shows it next to the candidate's thumbnail.
enum ThumbnailService {
    private static let directory: URL = {
        let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
            .appendingPathComponent("Thumbnails", isDirectory: true)
        try? FileManager.default.createDirectory(at: dir, withIntermediateDirectories: true)
        return dir
    }()

    static func generate(from asset: AVAsset) async -> UIImage? {
        let generator = AVAssetImageGenerator(asset: asset)
        generator.appliesPreferredTrackTransform = true
        generator.maximumSize = CGSize(width: 400, height: 400)
        let time = CMTime(seconds: 0.5, preferredTimescale: 600)
        if let result = try? await generator.image(at: time) {
            return UIImage(cgImage: result.image)
        }
        if let result = try? await generator.image(at: .zero) {
            return UIImage(cgImage: result.image)
        }
        return nil
    }

    static func save(_ image: UIImage, for clipID: UUID) {
        guard let data = image.jpegData(compressionQuality: 0.7) else { return }
        try? data.write(to: url(for: clipID))
    }

    static func load(for clipID: UUID) -> UIImage? {
        UIImage(contentsOfFile: url(for: clipID).path)
    }

    static func delete(for clipID: UUID) {
        try? FileManager.default.removeItem(at: url(for: clipID))
    }

    private static func url(for clipID: UUID) -> URL {
        directory.appendingPathComponent("\(clipID.uuidString).jpg")
    }
}
