//
//  Color+Handle.swift
//  map_amap_ios
//
//  Created by 诺诺诺的言 on 2025/7/22.
//

import Foundation

extension UIColor {
    /// 从十六进制字符串初始化颜色（支持 #RGB、#RGBA、#RRGGBB、#RRGGBBAA 格式）
    /// - Parameter hex: 十六进制颜色字符串，例如 "#15CBA1"、"FF0088"、"#F0F"
    convenience init?(hex: String) {
        // 1. 预处理：移除空格、换行，并转为大写（避免大小写问题）
        let cleanedHex = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()
        // 2. 处理带 # 的情况
        let hexString = cleanedHex.hasPrefix("#") ? String(cleanedHex.dropFirst()) : cleanedHex
        let length = hexString.count
        
        // 3. 验证格式是否合法（支持 3、4、6、8 位）
        guard [3, 4, 6, 8].contains(length) else {
            print("无效的十六进制颜色格式：\(hex)")
            return nil
        }
        
        // 4. 扫描十六进制数值
        let scanner = Scanner(string: hexString)
        var rgbValue: UInt64 = 0
        guard scanner.scanHexInt64(&rgbValue) else {
            print("无法扫描十六进制值：\(hex)")
            return nil
        }
        
        // 5. 根据长度解析 RGB 和透明度
        switch length {
        case 3: // #RGB -> 扩展为 #RRGGBB（如 #F0F -> #FF00FF）
            let r = CGFloat((rgbValue & 0xF00) >> 8) / 15.0
            let g = CGFloat((rgbValue & 0x0F0) >> 4) / 15.0
            let b = CGFloat(rgbValue & 0x00F) / 15.0
            self.init(red: r, green: g, blue: b, alpha: 1.0)
        case 4: // #RGBA -> 扩展为 #RRGGBBAA
            let r = CGFloat((rgbValue & 0xF000) >> 12) / 15.0
            let g = CGFloat((rgbValue & 0x0F00) >> 8) / 15.0
            let b = CGFloat((rgbValue & 0x00F0) >> 4) / 15.0
            let a = CGFloat(rgbValue & 0x000F) / 15.0
            self.init(red: r, green: g, blue: b, alpha: a)
        case 6: // #RRGGBB（如 #15CBA1）
            let r = CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0
            let g = CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0
            let b = CGFloat(rgbValue & 0x0000FF) / 255.0
            self.init(red: r, green: g, blue: b, alpha: 1.0)
        case 8: // #RRGGBBAA
            let a = CGFloat((rgbValue & 0xFF000000) >> 24) / 255.0
            let r = CGFloat((rgbValue & 0x00FF0000) >> 16) / 255.0
            let g = CGFloat((rgbValue & 0x0000FF00) >> 8) / 255.0
            let b = CGFloat(rgbValue & 0x000000FF) / 255.0
            self.init(red: r, green: g, blue: b, alpha: a)
        default:
            return nil
        }
    }
}
