import UIKit

/// 8×8 average-pHash 计算器
///
/// 算法步骤：
/// 1. 将图像缩放至 8×8 像素
/// 2. 转灰度（luminance = 0.299R + 0.587G + 0.114B）
/// 3. 计算 64 像素均值
/// 4. 每个像素 ≥ 均值为 1，< 均值为 0，生成 64 位 bit 向量
/// 5. 按 big-endian 转为 8 字节，hex 编码为 16 字符小写字符串
///
/// 选择 average-pHash 而非 DCT-pHash：纯 Swift 实现更轻量，满足 ≤50KB 包体积约束。
enum PHashCalculator {

    /// 计算 pHash
    ///
    /// - Parameter data: JPEG 图片数据
    /// - Returns: 16 字符小写 hex 字符串；解码失败返回 `""`
    static func calculate(_ data: Data) -> String {
        guard let source = UIImage(data: data),
              let cgSource = source.cgImage else { return "" }

        // Step 1: 缩放为 8×8 灰度像素
        var pixels = [UInt8](repeating: 0, count: 64)
        let colorSpace = CGColorSpaceCreateDeviceGray()
        guard let ctx = CGContext(
            data: &pixels,
            width: 8, height: 8,
            bitsPerComponent: 8,
            bytesPerRow: 8,
            space: colorSpace,
            bitmapInfo: CGImageAlphaInfo.none.rawValue
        ) else { return "" }

        ctx.interpolationQuality = .low
        ctx.draw(cgSource, in: CGRect(x: 0, y: 0, width: 8, height: 8))

        // Step 2: 计算均值
        let total = pixels.reduce(0) { $0 + Int($1) }
        let mean  = total / 64

        // Step 3: 生成 64 位哈希
        var hash: UInt64 = 0
        for (i, pixel) in pixels.enumerated() where Int(pixel) >= mean {
            hash |= (1 << (63 - i))
        }

        // Step 4: 转 16 字符小写 hex
        return String(format: "%016llx", hash)
    }
}
