/**
 * 面板小程序的通用 TS 类型
 */

/// 一些 TTT 通用工具泛型 ///
type GetTTTAllParams<Fn> = Parameters<Fn>['0'];
type GetTTTParams<Fn> = Omit<GetTTTAllParams<Fn>, 'complete' | 'success' | 'fail'>;
type GetTTTCompleteData<Fn> = Parameters<GetTTTAllParams<Fn>['complete']>['0'];
type GetTTTSuccessData<Fn> = Parameters<GetTTTAllParams<Fn>['success']>['0'];
type GetTTTFailData<Fn> = Parameters<GetTTTAllParams<Fn>['fail']>['0'];
type GetTTTEventListener<Fn> = Parameters<Fn>['0'];
type GetTTTEventListenerParams<Fn> = Parameters<GetTTTEventListener<Fn>>['0'];
///                   ///

/**
 * TTT 方法统一错误码
 */
type TTTCommonErrorCode = GetTTTFailData<typeof import('@ray-js/api').getDeviceInfo>;

/**
 * 功能点描述信息
 */
interface DpSchema {
  attr: number;
  canTrigger: boolean;
  /**
   * 功能点标识码,如 switch
   */
  code: string;
  defaultRecommend: boolean;
  editPermission: boolean;
  executable: boolean;
  extContent: string;
  iconname: string;
  /**
   * 功能点 ID
   */
  id: number;
  /**
   * 功能点模式类型
   * rw: 可下发可上报(可读可写)
   * ro: 只可上报(仅可读)
   * wr: 只可下发(仅可写)
   */
  mode: 'rw' | 'ro' | 'wr';
  /**
   * 功能点名称,一般用于语音等场景
   */
  name: string;
  /**
   * 功能点属性
   */
  property: {
    /**
     * 功能点类型
     */
    type: 'bool' | 'value' | 'enum' | 'bitmap' | 'string' | 'raw';
    range?: string[];
    label?: string[];
    maxlen: number;
    unit: string;
    min: number;
    max: number;
    scale: number;
    step: number;
    [key: string]: number | string | string[];
  };
  type: string;
}

type DeviceInfo = GetTTTSuccessData<typeof import('@ray-js/api').getDeviceInfo>;

/**
 * 设备信息
 */
type DevInfo = Omit<DeviceInfo, 'schema' | 'panelConfig'> & {
  schema: DpSchema[];
  idCodes: Record<string, string>;
  codeIds: Record<string, string>;
  panelConfig: PanelConfig;
};

/**
 * 设备物模型信息
 */
type ThingModelInfo = GetTTTSuccessData<typeof import('@ray-js/api').getDeviceThingModelInfo>;

type DeviceInfoUpdatedHandler = GetTTTEventListener<
  typeof import('@ray-js/api').onDeviceInfoUpdated
>;

type DpDataChangeHandler = GetTTTEventListener<typeof import('@ray-js/api').onDpDataChange>;

type DeviceOnlineStatusUpdateHandler = GetTTTEventListener<
  typeof import('@ray-js/api').onDeviceOnlineStatusUpdate
>;

type NetworkStatusChangeHandler = GetTTTEventListener<
  typeof import('@ray-js/api').onNetworkStatusChange
>;

type NetworkStatus = GetTTTEventListenerParams<typeof import('@ray-js/api').onNetworkStatusChange>;

type BluetoothAdapterStateChangeHandler = GetTTTEventListener<
  typeof import('@ray-js/api').onBluetoothAdapterStateChange
>;

type BluetoothState = GetTTTEventListenerParams<
  typeof import('@ray-js/api').onBluetoothAdapterStateChange
>;