import { CSSProperties } from 'react';
import { ModalKey } from './registry';

export interface GlobalModalConfig<T = any> {
  title?: string;
  w?: number | string;
  h?: number;
  /** 显示标题栏 */
  showHeader?: boolean;
  /** 自定义标题栏左侧内容 */
  headerLeft?: React.ReactNode | (() => React.ReactNode);
  /** 自定义标题栏右侧内容 */
  headerRight?: React.ReactNode | (() => React.ReactNode);
  /** 自定义弹窗内容 */
  /**
   *
   * 自定义组件
   * @description 父级会默认传入当前的props
   *
   *  */
  component?: React.FC<any> | React.ReactElement;
  // 是否保持弹窗状态，默认为false，弹窗关闭后会自动销毁,目前无用
  keepalive?: boolean;

  props?: T;
  /** 会附加到弹窗的 */
  style?: CSSProperties;
}

export type ModalMapping = {
  modal?: (props: GlobalModalConfig['props']) => JSX.Element;
  defaultProps?: any;
  defaultConfig?: Partial<GlobalModalConfig>;
};

/** 全局弹窗方法 */
export type GlobalModalServicesModalMethods = {
  /**
   * 推送一个弹窗
   * @param modalKey 弹窗类型,如果弹窗key值未注册，且未传入components,则会抛出异常
   * @param config 弹窗参数
   * @param thread 当前弹窗的线程，注意，后push的弹窗默认都在之前的弹窗之上
   * @returns modalId 弹窗id,使用modalId进行后续操作
   *  */
  push: (
    modalKey: ModalKey,
    config?: GlobalModalConfig,
    thread?: number,
  ) => any;

  /**
   * 关闭一个弹窗
   * @params modalId 弹窗id
   * @description 弹窗关闭后，会自动销毁
   * */
  remove: (modalId: string) => void;

  /**
   * 跳转一个弹窗
   * @params modalId 弹窗id
   * @description 跳转到指定的弹窗，如果弹窗不存在，则会自动创建
   * */
  go: (modalId: string) => void;
  /**
   * 清空所有弹窗
   * */
  clear: () => void;
  /** 设置弹窗基础信息 */
  setOptionsById?: (modalId: string, config: GlobalModalConfig) => void;
};

export interface ChildrenModalMethods extends GlobalModalServicesModalMethods {
  /**
   * 设置弹窗参数
   * 仅限定 弹窗内调用
   *  */
  setOptions(options: Partial<GlobalModalConfig>): void;

  /**
   * 返回上一页,仅限同一维度调用
   * @param thread 弹窗层级
   *  */
  goBack(thread?: number): void;
}

export interface ModalStackType extends GlobalModalConfig, ModalMapping {
  modalKey: string;
  modalId: string;
  /** 线程维度 */
  thread: string;
  /** zIndex */
  zIndex?: number;
}
