import 'package:path/path.dart' as path;

class SCPathUtils {
  /// 判断路径类型
  static PathType getPathType(String uri) {
    if (uri.isEmpty) return PathType.unknown;

    // 1. 检查网络地址
    if (_nt(uri)) return PathType.network;

    // 2. 检查 Asset 路径
    if (_as(uri)) return PathType.asset;

    // 3. 检查文件路径
    if (_fl(uri)) return PathType.file;

    return PathType.unknown;
  }

  // 检查是否是网络地址
  static bool _nt(String uri) {
    final uriPattern = RegExp(
      r'^(https?|ftp):\/\/' // 协议
      r'([\w\-]+(\.[\w\-]+)+)' // 域名
      r'(:\d+)?' // 端口
      r'(\/[^\s]*)?$', // 路径
      caseSensitive: false,
    );

    return uriPattern.hasMatch(uri) || uri.startsWith('http');
  }

  // 检查是否是 Asset 路径
  static bool _as(String uri) {
    // 排除包含特殊字符的情况
    if (uri.contains('://') || uri.contains('\\') || path.isAbsolute(uri)) {
      return false;
    }

    // 常见的 asset 路径特征
    final isDirectAsset =
        uri.startsWith('assets/') ||
        uri.startsWith('sc_images/') ||
        uri.startsWith('videos/');

    // 检查文件扩展名
    final ext = path.extension(uri).toLowerCase();
    final isSupportedAsset = [
      '.png',
      '.jpg',
      '.jpeg',
      '.gif',
      '.mp4',
      '.vap',
      '.svga',
    ].contains(ext);

    return isDirectAsset && isSupportedAsset;
  }

  // 检查是否是文件路径
  static bool _fl(String uri) {
    // 检查文件 URI 格式
    if (uri.startsWith('file://')) return true;

    // 检查绝对路径
    if (path.isAbsolute(uri)) return true;

    // 检查 Windows 路径
    if (uri.contains(':\\') || uri.contains(':/')) return true;

    // 检查常见文件扩展名
    final ext = path.extension(uri).toLowerCase();
    return [
      '.mp4',
      '.mov',
      '.avi',
      '.svga',
      '.png',
      '.jpg',
      '.txt',
      '.pdf',
    ].contains(ext);
  }

  /// 获取路径的文件名（无扩展名）
  static String getFileNameWithoutExtension(String filePath) {
    return path.basenameWithoutExtension(filePath);
  }

  /// 获取路径的文件扩展名
  static String getFileExtension(String filePath) {
    return path.extension(filePath).toLowerCase();
  }

  /// 从网络地址中提取文件名
  static String getFileNameFromUrl(String url) {
    try {
      final uri = Uri.parse(url);
      return path.basename(uri.path);
    } catch (e) {
      return 'unknown_file';
    }
  }

  static String getFileType(String filePath) {
    String extension = path.extension(filePath).toLowerCase();

    // 图片格式
    final imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp'];
    // 视频格式
    final videoExtensions = ['.mp4', '.avi', '.mov', '.wmv', '.flv', '.mkv'];

    if (imageExtensions.contains(extension)) {
      return 'image';
    } else if (videoExtensions.contains(extension)) {
      return 'video_pic';
    } else {
      return 'unknown';
    }
  }

  static bool fileTypeIsPicAndMP4(String filePath) {
    String extension = path.extension(filePath).toLowerCase();

    // 图片格式
    final imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp'];
    // 视频格式
    final videoExtensions = ['.mp4'];
    if (imageExtensions.contains(extension) ||
        videoExtensions.contains(extension)) {
      return true;
    }
    return false;
  }

  static bool fileTypeIsPic(String filePath) {
    String extension = path.extension(filePath).toLowerCase();

    // 图片格式
    // final imageExtensions = ['.jpg', '.jpeg', '.png', '.bmp', '.webp'];
    final imageExtensions = ['.jpg', '.jpeg', '.png'];
    if (imageExtensions.contains(extension)) {
      return true;
    }
    return false;
  }

  static bool fileTypeIsPic2(String filePath) {
    String extension = path.extension(filePath).toLowerCase();

    // 图片格式
    final imageExtensions = ['.jpg', '.jpeg', '.png', '.bmp', '.webp'];
    if (imageExtensions.contains(extension)) {
      return true;
    }
    return false;
  }
}

enum PathType {
  asset, // 资源文件 (assets/)
  file, // 本地文件路径
  network, // 网络地址
  unknown, // 未知类型
}
