interface ResultType {
  success: boolean;
  message?: string;
  result?: any;
}

type Pagination<T = any> = T & {
  pageNumber?: number;
  pageSize?: number;
  fetchAll?: boolean;
};

type CameraParams = {
  distanceFactor?: number;
  flyTime?: number;
  rotation?: { pitch?: number; yaw?: number };
};

type NodeSearchType = Pagination & { keywordType: 0 | 1 };

type NodeCoordType = 'top' | 'center' | 'bottom';
type NodeInfoType = 'element' | 'space';

declare class BimController {
  /** @deprecated */
  get IsReady(): boolean;
  get isReady(): boolean;
  get apiVersion(): string | null;
  get sdkVersion(): string | null;
  GetVersion(): Promise<ResultType>;
  /**
   * 获取模型列表
   * @param {string}keyword 搜索关键词，默认为空
   * @param {Pagination} pager 分页参数
   */
  GetModelList(keyword?: string, pager?: Pagination): Promise<ResultType>;
  /**
   * 获取资产列表
   * @param keyword
   * @param pager
   */
  GetAssetList(keyword?: string, pager?: Pagination): Promise<ResultType>;
  /** 获取模型大纲 */
  GetOfflineList(): Promise<ResultType>;
  /**
   * 显隐Gizmo枢轴
   * @param {boolean} status true: 显示, false: 隐藏。default: true
   */
  SetGizmo(status?: boolean): Promise<ResultType>;
  /**
   * 模型点击事件: 描边&Gizmo
   * @param {boolean} status true: 开启, false: 关闭。default: true
   */
  SetDefaultEvent(status?: boolean): Promise<ResultType>;
  /**
   * 设置构件点击开关
   * @param {boolean} status true: 开启, false: 关闭。default: true
   */
  SetNodeClickEnable(status?: boolean): Promise<ResultType>;
  /**
   * 构件点击响应事件
   * @param {boolean} highlight 高亮 default: true
   * @param {boolean} hidden 显隐 default: false
   */
  SetNodeClickEvent(highlight?: boolean, hidden?: boolean): Promise<ResultType>;
  /**
   * 设置构件高亮默认样式
   * @param {string} color 颜色HEX值
   * @param {number} opacity 高亮透明度, 取值范围：[0-1]。default: 0.5
   */
  SetNodeDefaultHighLightStyle(color: string, opacity?: number): Promise<ResultType>;
  /** 获取构件高亮默认样式 */
  GetNodeDefaultHighLightStyle(): Promise<ResultType>;
  /**
   * 清除构件高亮
   */
  ClearNodeHighlight(): Promise<ResultType>;
  GetModelsByMetadata: (args: { [x: string]: string | string[] }) => Promise<ResultType>;
  GetNodesByProperties: (
    args: { [x: string]: string | string[] },
    type?: NodeInfoType | NodeInfoType[]
  ) => Promise<ResultType>;
  GetRoomsByProperties: (args: { [x: string]: string | string[] }) => Promise<ResultType>;
}

export type SectionType = {
  coordZRef: 'ground' | 'surface' | 'altitude';
  strokeColor: string;
  strokeWeight: number; //被切物体描边宽度[0~1]
  invert: boolean; //被切物体(true:内部可见; false:外部可见)
  transform: {
    location?: [x: number, y: number, z: number];
    rotator?: {
      pitch: number; //俯仰角, 参考(-180~180)
      yaw: number; //偏航角, 参考(0正北, -180~180)
      roll: number; //翻滚角, 参考(-180~180)
    };
    size?: [x: number, y: number, z: number];
  };
  showLocation: boolean; //true:显示剖切参考顶角location; false:隐藏剖切参考顶角location
  status: boolean; //true:开启剖切; false:关闭剖切
};

export type { AssetInfo, ModelInfo, NodeTree } from '@sdk/daas';

export type ModelOption = {
  assetId?: string;
  entityName?: string;
  customId?: string;
  customData?: any;
  seedId: string;
  location?: [x: number, y: number, z: number];
};

export declare class Hierarchy {
  constructor(opt: ModelOption);
  get eid(): string | null;
  get seedId(): string | null;
  get assetId(): string | null;
  get assetName(): string | null;
  get bVisible(): boolean;
  get entityName(): string;
  get customId(): string;
  get customData(): any;
  get index(): string;
  get isDisassembly(): boolean;
  get hideNodeIds(): string[];
  get pickNodeId(): string | null;
  get rootNodeId(): string | null;

  GetLocation(): Promise<ResultType>;
  SetLocation(location: [x?: number, y?: number, z?: number]): Promise<ResultType>;
  GetRotator(): Promise<ResultType>;
  SetRotator(rotator: { pitch?: number; yaw?: number; roll?: number }): Promise<ResultType>;
  GetScale3d(): Promise<ResultType>;
  SetScale3d(scale3d: [x?: number, y?: number, z?: number]): Promise<ResultType>;
  GetVisible(): Promise<ResultType>;
  SetVisible(bVisible?: boolean): Promise<ResultType>;
  /** 模型卸载 */
  Delete(): Promise<ResultType>;

  GetSeedId(): Promise<ResultType>;
  SetSeedId(seedId: string | null): Promise<ResultType>;
  /**
   * 模型激活
   * @param {boolean} status true: 是, false: 取消。default: true
   */
  Active(status?: boolean): Promise<ResultType>;
  /** 模型聚焦 */
  SetFocus(cameraParams?: CameraParams): Promise<ResultType>;
  /** 模型落地 */
  SetGround(params?: { type?: 'surface' | 'ground' | 'altitude'; offset?: 0 }): Promise<ResultType>;
  /** 设置当前模型的 Gizmo位置 */
  SetGizmo(location: [x?: number, y?: number, z?: number] | 'center' | 'reset'): Promise<ResultType>;
  /** 开始模型剖切 */
  StartModelSection(option: Partial<SectionType>): Promise<ResultType>;
  /** 重置模型剖切 */
  ResetModelSection(): Promise<ResultType>;
  /** 结束模型剖切 */
  EndModelSection(): Promise<ResultType>;
  /** 模型分层 */
  SetDisassembly(): Promise<ResultType>;
  // SetBuildLayers(nodeIds: string | string[]): Promise<ResultType>;

  /**
   * 构件聚焦
   * @param {string} nodeId 构件ID
   * @param {boolean} highlight 是否同时高亮
   * @param opt
   */
  SetNodeFocus(
    nodeId: string,
    opt?: { cameraParams?: CameraParams }
  ): Promise<ResultType>;
  /**
   * 设置构件显隐
   * @param {string} nodeId 构件ID
   * @param {boolean} visible 状态值 true: 显示, false: 隐藏。default: true
   */
  SetNodeVisibility(nodeId: string | string[], visible?: boolean): Promise<ResultType>;
  /** 显示全部构件 */
  SetNodeShowAll(): Promise<ResultType>;
  /**
   * 构件反选显隐
   * @param nodeIds 构件ID
   * @param visible 状态 true: 仅显示指定的构件, false: 取消指定构件反向。default: true
   */
  SetOtherNodesVisibility(nodeIds: string | string[], visible?: boolean): Promise<ResultType>;
  /**
   * 构件高亮
   * @param {string} nodeId 构件ID
   * @param {boolean} status 是否高亮, true: 是, false: 否。default: true
   * @param {boolean} unique 是否唯一高亮, true: 是, false: 否。default: true
   * @param style
   */
  SetNodeHighLight(
    nodeId: string,
    status?: boolean,
    unique?: boolean,
    style?: { color: string; opacity?: number }
  ): Promise<ResultType>;
  /**
   * 清除构件高亮
   */
  ClearNodeHighlight(): Promise<ResultType>;
  /** 获取构件坐标 */
  GetNodeLocation(nodeId: string, coordType?: NodeCoordType): Promise<ResultType>;
  /** 获取构件坐标 */
  GetNodeCoord(args: { nodeId: string; coordType?: NodeCoordType }): Promise<ResultType>;
  /** @deprecated */
  SetNodeDefaultHighLightStyle(color: string, opacity?: number): Promise<ResultType>;
  /** @deprecated */
  GetNodeDefaultHighLightStyle(): Promise<ResultType>;

  /** 获取构件树 */
  GetNodeTree(nodeId?: string, pager?: Pagination): Promise<ResultType>;
  /** 构件树列表搜索 */
  GetNodeListBySearch(keyword: string, args?: NodeSearchType): Promise<ResultType>;
  /** 构件树搜索 */
  GetNodeTreeBySearch(keyword: string, args?: NodeSearchType): Promise<ResultType>;
  /** 通过构件ID获取构件树 */
  GetNodeTreeById(nodeId: string): Promise<ResultType>;
  /** 获取指定构件ID的父级nodeId */
  GetNodeParentId(nodeId: string): Promise<ResultType>;
  /**
   * @deprecated please use GetNodeInfo instead.
   */
  GetNodeAttr(nodeId: string): Promise<ResultType>;
  /** 获取指定构件详细信息 */
  GetNodeInfo(nodeId: string): Promise<ResultType>;
  SetRoomHighLight(args: {
    roomIds: string[];
    transform?: boolean;
    bVisible?: boolean;
    colorStyle?: {
      color?: string;
      opacity?: number;
    };
  }): Promise<ResultType>;
  SetRoomsFocus(
    args: {
      roomIds: string[];
      transform?: boolean;
    } & CameraParams
  ): Promise<ResultType>;
}

export default class BimApi {
  DCP: BimController;
  Hierarchy: typeof Hierarchy;
}
