//
//  CloudDriveFormatter.swift
//  suixinkan
//

import Foundation
import UIKit

/// 云盘展示格式化工具。
enum CloudDriveFormatter {
    /// 文件类型名称。
    static func typeName(_ type: Int) -> String {
        switch type {
        case 1:
            "视频"
        case 2:
            "图片"
        case 99:
            "文件夹"
        default:
            "文件"
        }
    }

    /// 文件描述。
    static func fileDescription(_ file: CloudFile) -> String {
        let createdDate = dateOnly(file.createdAt)
        if file.isFolder {
            return "\(createdDate) | \(file.childNum)个项目"
        }
        return "\(createdDate) | \(fileSize(file.fileSize))"
    }

    /// 文件大小展示。
    static func fileSize(_ bytes: Int64) -> String {
        guard bytes > 0 else { return "0 B" }
        let units = ["B", "KB", "MB", "GB", "TB"]
        var value = Double(bytes)
        var index = 0
        while value >= 1024, index < units.count - 1 {
            value /= 1024
            index += 1
        }
        return String(format: "%.2f %@", value, units[index])
    }

    /// 将后端时间转换为 Android 列表使用的 yyyy-MM-dd 日期。
    static func dateOnly(_ value: String) -> String {
        guard !value.isEmpty else { return "" }
        if value.count >= 10 {
            let endIndex = value.index(value.startIndex, offsetBy: 10)
            return String(value[..<endIndex])
        }
        return value
    }

    /// URL 或文件名的后缀。
    static func fileExtension(_ value: String) -> String {
        let ext = URL(string: value)?.pathExtension ?? URL(fileURLWithPath: value).pathExtension
        return ext.isEmpty ? typeName(0) : ext.uppercased()
    }
}

/// 云盘 Android 同名图片资源访问工具。
enum CloudDriveAsset {
    /// 返回云盘图片资源，缺失时使用系统图标兜底。
    static func image(named name: String, fallbackSystemName: String) -> UIImage? {
        UIImage(named: name)?.withRenderingMode(.alwaysOriginal) ?? UIImage(systemName: fallbackSystemName)
    }

    /// 返回缩放到指定点尺寸的云盘图标。
    static func resizedImage(named name: String, fallbackSystemName: String, size: CGSize) -> UIImage? {
        guard let source = image(named: name, fallbackSystemName: fallbackSystemName) else { return nil }
        let renderer = UIGraphicsImageRenderer(size: size)
        return renderer.image { _ in
            source.draw(in: CGRect(origin: .zero, size: size))
        }.withRenderingMode(.alwaysOriginal)
    }
}
