import type { EmsActionResponse, EmsDateValue, EmsDecimalValue, EmsId } from '@/api/ems/types';

/**
 * 物联环境监测设备类型编码。
 * 这里与后端 IotEnvMonitorTypeEnum 保持一致，方便页面按类型做字段收敛。
 */
export type IotEnvMonitorTypeCode = 5 | 6 | 7 | 8 | 9 | 10 | -1;

/**
 * 振动设备可选的单一测点字段。
 * 前端如果只想画某一个振动指标的曲线，可以直接复用这个联合类型。
 */
export type IotEnvVibrationParam =
  | 'vibrationSpeed'
  | 'vibrationDisplacement'
  | 'vibrationAcceleration'
  | 'vibrationTemp';

/**
 * 按日分表查询的基础参数。
 * 除 latestAll 外，其余接口都基于这一组字段做裁剪。
 */
export interface IotEnvMonitorQueryBase {
  date: string;
  monitorId?: string;
  monitorIds?: string[];
  monitorType?: IotEnvMonitorTypeCode | number;
  startTime?: string;
  endTime?: string;
  vibrationParam?: IotEnvVibrationParam;
}

/**
 * 查询单设备指定日期最新值。
 */
export interface IotEnvMonitorLatestQuery extends Pick<IotEnvMonitorQueryBase, 'date' | 'vibrationParam'> {
  monitorId: string;
}

/**
 * 查询指定日期数据列表。
 * 当 monitorIds 非空时，后端会优先使用 monitorIds，忽略 monitorId。
 */
export interface IotEnvMonitorListQuery extends IotEnvMonitorQueryBase {}

/**
 * 批量查询多个设备在指定日期的最新值。
 */
export interface IotEnvMonitorLatestBatchQuery extends Pick<IotEnvMonitorQueryBase, 'date' | 'vibrationParam'> {
  monitorIds: string[];
}

/**
 * 按设备类型查询指定日期数据。
 */
export interface IotEnvMonitorByTypeQuery
  extends Pick<IotEnvMonitorQueryBase, 'date' | 'startTime' | 'endTime' | 'vibrationParam'> {
  monitorType: IotEnvMonitorTypeCode | number;
}

/**
 * 所有接口公共返回字段。
 * 因为 latestAll 在缺少实时数据时也会返回设备骨架，所以测量值与时间字段都允许为 null。
 */
export interface IotEnvMonitorCommonVO {
  objid?: EmsId | null;
  monitorId?: string;
  monitorCode?: string;
  monitorName?: string;
  monitorType?: IotEnvMonitorTypeCode | number | null;
  energyName?: string;
  collectTime?: EmsDateValue | null;
  recodeTime?: EmsDateValue | null;
}

export interface TemperatureMonitorDataVO extends IotEnvMonitorCommonVO {
  monitorType?: 5;
  energyName?: '温度';
  temperature?: EmsDecimalValue | null;
}

export interface TemperatureHumidityMonitorDataVO extends IotEnvMonitorCommonVO {
  monitorType?: 6;
  energyName?: '温湿度';
  temperature?: EmsDecimalValue | null;
  humidity?: EmsDecimalValue | null;
}

export interface NoiseMonitorDataVO extends IotEnvMonitorCommonVO {
  monitorType?: 7;
  energyName?: '噪声';
  noise?: EmsDecimalValue | null;
}

export interface IlluminanceMonitorDataVO extends IotEnvMonitorCommonVO {
  monitorType?: 8;
  energyName?: '照度';
  illuminance?: EmsDecimalValue | null;
}

export interface ConcentrationMonitorDataVO extends IotEnvMonitorCommonVO {
  monitorType?: 9;
  energyName?: '气体浓度';
  concentration?: EmsDecimalValue | null;
}

export interface VibrationMonitorDataVO extends IotEnvMonitorCommonVO {
  monitorType?: 10;
  energyName?: '振动';
  vibrationSpeed?: EmsDecimalValue | null;
  vibrationDisplacement?: EmsDecimalValue | null;
  vibrationAcceleration?: EmsDecimalValue | null;
  vibrationTemp?: EmsDecimalValue | null;
}

/**
 * 未识别设备类型的兜底结构。
 * 后端会返回全量测点字段，前端在做兼容展示时可以直接读取。
 */
export interface UnknownMonitorDataVO extends IotEnvMonitorCommonVO {
  monitorType?: -1 | number | null;
  temperature?: EmsDecimalValue | null;
  humidity?: EmsDecimalValue | null;
  illuminance?: EmsDecimalValue | null;
  noise?: EmsDecimalValue | null;
  concentration?: EmsDecimalValue | null;
  vibrationSpeed?: EmsDecimalValue | null;
  vibrationDisplacement?: EmsDecimalValue | null;
  vibrationAcceleration?: EmsDecimalValue | null;
  vibrationTemp?: EmsDecimalValue | null;
}

/**
 * 物联环境监测接口统一返回项。
 * 虽然后端本质是 Map，但前端仍然可以用联合类型拿到较好的字段提示。
 */
export type IotEnvMonitorDataVO =
  | TemperatureMonitorDataVO
  | TemperatureHumidityMonitorDataVO
  | NoiseMonitorDataVO
  | IlluminanceMonitorDataVO
  | ConcentrationMonitorDataVO
  | VibrationMonitorDataVO
  | UnknownMonitorDataVO;

export type IotEnvMonitorDetailResponse = Promise<EmsActionResponse<IotEnvMonitorDataVO>>;

export type IotEnvMonitorListResponse = Promise<EmsActionResponse<IotEnvMonitorDataVO[]>>;
