export interface AMSMessage {
	type: 'error' | 'status' | 'slaveStatus' | 'slaveLog' | 'shuntCurrentLog' | 'shuntVoltage1Log' | 'shuntVoltage2Log';
}

export interface AMSError extends AMSMessage {
	type: 'error';

	kind: number;
	arg: number;
}

export enum AMSState {
	TS_INACTIVE = 0,
	TS_ACTIVE = 1,
	TS_PRECHARGE = 2,
	TS_DISCHARGE = 3,
	TS_ERROR = 4
}

export interface AMSStatus extends AMSMessage {
	type: 'status';

	state: AMSState;
	sdcClosed: boolean;
	soc: number;
	minCellVolt: number;
	maxCellTemp: number;
	imdOK: boolean;
	// TODO: IMD state & R_iso
}

export interface SlaveStatus extends AMSMessage {
	type: 'slaveStatus';

	slaveId: number;
	error: boolean;
	minCellVolt: number;
	maxCellVolt: number;
	maxTemp: number;
	soc: number;
}

export interface SlaveLog extends AMSMessage {
	type: 'slaveLog';

	slaveId: number;

	logType: 'voltage' | 'lastCell' | 'temperature';
}

export interface SlaveLogVoltage extends SlaveLog {
	logType: 'voltage';

	startIndex: number;
	voltages: [number, number, number, number];
}

export interface SlaveLogLastCell extends SlaveLog {
	logType: 'lastCell';

	voltage: number;
	failed_temp_sensors: number;
}

export interface SlaveLogTemperature extends SlaveLog {
	logType: 'temperature';

	startIndex: number;
	temperatures: [number, number, number, number, number, number, number, number];
}

export interface ShuntLog extends AMSMessage {
	type: 'shuntCurrentLog' | 'shuntVoltage1Log' | 'shuntVoltage2Log';

	value: number;
}