import 'dart:math';

import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:octo_image/octo_image.dart';

import 'string_util.dart';

class ImageWidget {
  static String domain = "";

  static const String imagePath = "assets/images/";

  /// 加载网络图片widget
  static Widget loadNetImage(
    String? url, {
    String? domain,
    ImageTransformerType? type,
    double? width,
    double? height,
    BoxFit fit = BoxFit.cover,
    Widget? placeholder,
    Widget? errorWidget,
    bool signature = false,
    int? maxHeight,
    int? maxWidth,
  }) {
    var domainUrl = domain ?? ImageWidget.domain;
    if (url != null && !url.startsWith("http")) {
      url = domainUrl + url;
    }
    if (signature) {
      url =
          url != null && url.isNotEmpty ? "$url?${Random().nextDouble()}" : "";
    }
    if (StringUtil.isEmpty(url)) {
      return const SizedBox();
    }
    return OctoImage(
      // 拼接Random,修复图片地址固定,无法展示最新图片问题
      image: CachedNetworkImageProvider(url!,
          maxWidth: maxWidth, maxHeight: maxHeight),
      imageBuilder: MyOctoImageTransformer.getOctoImageBuilder(type),
      placeholderBuilder:
          ImageWidget.placeholderBuilder(placeholder: placeholder),
      errorBuilder: ImageWidget.errorBuilder(errorWidget: placeholder),
      fit: fit,
      width: width,
      height: height,
    );
  }

  /// 加载本地图片widget
  static Widget loadAssetImage(
    String image, {
    double? width,
    double? height,
    int? cacheWidth,
    int? cacheHeight,
    BorderRadiusGeometry borderRadius=BorderRadius.zero,
    BoxFit? fit,
    String format = 'png',
    Color? color,
    String? package,
  }) {
    return ClipRRect(
      borderRadius: borderRadius,
      child: Image.asset(
        "$imagePath$image.$format",
        height: height,
        width: width,
        cacheWidth: cacheWidth,
        cacheHeight: cacheHeight,
        fit: fit,
        color: color,
        package: package,

        /// 忽略图片语义
        excludeFromSemantics: true,
      ),
    );
  }

  //加载头像默认图片
  static Widget loadHeadPlaceHolder() {
    return ImageWidget.loadAssetImage(
      "head",
    );
  }

  //加载头像默认图片-方形头像
  static Widget loadHeadPlaceHolderSquare() {
    return ImageWidget.loadAssetImage(
      "head_square",
    );
  }

  //缓存 本地图片
  static void cacheAssetImage(
    context,
    String image, {
    String format = 'png',
  }) {
    precacheImage(AssetImage("$imagePath$image.$format"), context);
  }

  //缓存 网络图片
  static void cacheNetImage(
    context,
    String url, {
    String? domain,
  }) {
    var domainUrl = domain ?? ImageWidget.domain;
    if (url.isNotEmpty && !url.startsWith("http")) {
      url = domainUrl + url;
    }
    precacheImage(CachedNetworkImageProvider(url), context);
  }

  //返回 network imageprovider
  static ImageProvider getNetImageProvider(
    String url, {
    String? domain,
  }) {
    var domainUrl = domain ?? ImageWidget.domain;
    if (url.isNotEmpty && !url.startsWith("http")) {
      url = domainUrl + url;
    }
    return CachedNetworkImageProvider(url);
  }

  static OctoErrorBuilder errorBuilder({
    Widget? errorWidget,
  }) {
    return (context, error, stacktrace) => errorWidget != null
        ? SizedBox(
            width: double.infinity,
            height: double.infinity,
            child: errorWidget,
          )
        : const Icon(
            Icons.error_outline_outlined,
            color: Colors.grey,
          );
  }

  static OctoPlaceholderBuilder? placeholderBuilder({
    Widget? placeholder,
  }) {
    return placeholder != null
        ? (context) => SizedBox(
              width: double.infinity,
              height: double.infinity,
              child: placeholder,
            )
        : null;
  }
}

class MyOctoImageTransformer {
  static OctoImageBuilder radiusAvatar() {
    return (context, child) => Center(
          child: AspectRatio(
            aspectRatio: 1.0,
            child: ClipRRect(
              borderRadius: BorderRadius.circular(5.0),
              child: child,
            ),
          ),
        );
  }

  static OctoImageBuilder circleAvatar() {
    return (context, child) => Center(
          child: AspectRatio(
            aspectRatio: 1.0,
            child: ClipOval(
              child: child,
            ),
          ),
        );
  }

  // 根据type返回 OctoImageBuilder

  static OctoImageBuilder getOctoImageBuilder(ImageTransformerType? type) {
    switch (type) {
      case ImageTransformerType.rect:
        return radiusAvatar();
      case ImageTransformerType.circle:
        return circleAvatar();
      default:
        return (context, child) => child;
    }
  }
}

enum ImageTransformerType {
  rect, // 矩形
  circle, // 圆形
}