import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';

enum DialogPosition {
  top,
  center,
  bottom,
}

enum DialogAnimation {
  /// 全部位置都为渐隐动画
  fade,

  /// 全部位置都为缩放动画
  scale,

  /// 中间位置的为渐隐动画, 其他位置为位移动画
  centerFade_otherSlide,

  /// 中间位置的为缩放, 其他位置为位移动画
  centerScale_otherSlide,
}

class DialogEngine {
  //展示依附弹窗
  static Future showAttach({
    required BuildContext? targetContext,
    required Widget widget,
    DialogPosition position = DialogPosition.center,
    DialogAnimation? animType,
    VoidCallback? onDismiss,
    String? tag,
    Color maskColor = Colors.transparent,
    bool? clickMaskDismiss,
    bool? backDismiss,
    bool? keepSingle,
    bool usePenetrate = false,
  }) {
    Alignment alignment;
    if (position == DialogPosition.bottom) {
      alignment = Alignment.bottomCenter;
    } else if (position == DialogPosition.top) {
      alignment = Alignment.topCenter;
    } else {
      alignment = Alignment.center;
    }

    SmartAnimationType? smartAnimType;
    if (animType == DialogAnimation.fade) {
      smartAnimType = SmartAnimationType.fade;
    } else if (animType == DialogAnimation.scale) {
      smartAnimType = SmartAnimationType.scale;
    } else if (animType == DialogAnimation.centerFade_otherSlide) {
      smartAnimType = SmartAnimationType.centerFade_otherSlide;
    } else if (animType == DialogAnimation.centerScale_otherSlide) {
      smartAnimType = SmartAnimationType.centerScale_otherSlide;
    }

    return SmartDialog.showAttach(
      targetContext: targetContext,
      bindWidget: targetContext,
      builder: (context) => widget,
      usePenetrate: usePenetrate,
      debounce: true,
      clickMaskDismiss: clickMaskDismiss,
      backDismiss: backDismiss,
      animationType: smartAnimType,
      alignment: alignment,
      onDismiss: onDismiss,
      tag: tag,
      maskColor: maskColor,
      keepSingle: keepSingle,
    );
  }

  /// 展示默认弹窗
  static Future show({
    required Widget widget,
    DialogPosition position = DialogPosition.center,
    DialogAnimation? animType,
    VoidCallback? onDismiss,
    String? tag,
    Color? maskColor,
    bool? clickMaskDismiss,
    bool? backDismiss,
    bool? keepSingle,
    bool usePenetrate = false,
  }) {
    Alignment alignment;
    if (position == DialogPosition.bottom) {
      alignment = Alignment.bottomCenter;
    } else if (position == DialogPosition.top) {
      alignment = Alignment.topCenter;
    } else {
      alignment = Alignment.center;
    }

    SmartAnimationType? smartAnimationType;
    if (animType == DialogAnimation.fade) {
      smartAnimationType = SmartAnimationType.fade;
    } else if (animType == DialogAnimation.scale) {
      smartAnimationType = SmartAnimationType.scale;
    } else if (animType == DialogAnimation.centerFade_otherSlide) {
      smartAnimationType = SmartAnimationType.centerFade_otherSlide;
    } else if (animType == DialogAnimation.centerScale_otherSlide) {
      smartAnimationType = SmartAnimationType.centerScale_otherSlide;
    }

    return SmartDialog.show(
      builder: (context) => widget,
      alignment: alignment,
      usePenetrate: usePenetrate,
      debounce: true,
      clickMaskDismiss: clickMaskDismiss,
      backDismiss: backDismiss,
      animationType: smartAnimationType,
      onDismiss: onDismiss,
      tag: tag,
      maskColor: maskColor,
      keepSingle: keepSingle,
    );
  }

  // 隐藏
  static void dismiss({String? tag}) {
    SmartDialog.dismiss(status: SmartStatus.dialog, tag: tag);
  }

  //检查是否已经显示弹窗
  static bool checkIsExist({String? tag}) {
    return SmartDialog.checkExist(tag: tag);
  }
}
