import { DoorLock, FanControl } from '@matter/main/clusters';
import { Converter } from 'isy-nodejs';
import { Insteon } from 'isy-nodejs/ISY';

const MatterC = {
	LevelFrom0To255: {
		LightingLevel: {
			from: (value: number) =>
				value === 1 ? 0
				: value === 254 ? 255
				: value,
			to: (value: number) =>
				value === 0 ? 1
				: value === 255 ? 254
				: value
		}
	},
	Percent: {
		LightingLevel: {
			from: (value: number) =>
				value === 1 ? 0
				: value === 254 ? 100
				: Math.round((value / 254) * 100),
			to: (value: number) =>
				value === 0 ? 1
				: value === 100 ? 254
				: Math.round((value / 100) * 254)
		}
	},
	InsteonLock: {
		LockState: {
			from: (value: DoorLock.LockState) => (value == DoorLock.LockState.Locked ? Insteon.Lock.Locked : Insteon.Lock.Unlocked),
			to: (value: Insteon.Lock) => (value == Insteon.Lock.Locked ? DoorLock.LockState.Locked : DoorLock.LockState.Unlocked)
		}
	},
	Boolean: {
		LightingLevel: {
			from: (value: number) => value > 0,
			to: (value: boolean) => (value ? 254 : 0)
		}
	},
	RampRate: {
		Deciseconds: {
			from: (value: number) => Insteon.RampRate.from.seconds(value / 10),
			to: (value: Insteon.RampRate) => Insteon.RampRate.to.seconds(value) * 10
		},
		Seconds: {
			from: (value: number) => Insteon.RampRate.from.seconds(value),
			to: (value: Insteon.RampRate) => Insteon.RampRate.to.seconds(value)
		}
	},

	FanLevel: {
		FanMode: {
			from: (value: FanControl.FanMode) => {
				switch (value) {
					case FanControl.FanMode.Low:
						return Insteon.FanLevel.Low;
					case FanControl.FanMode.Medium:
						return Insteon.FanLevel.Medium;
					case FanControl.FanMode.High:
						return Insteon.FanLevel.High;
					case FanControl.FanMode.Off:
						return Insteon.FanLevel.Off;
					default:
						throw new Error('Invalid Fan Mode: ' + FanControl.FanMode[value]);
				}
			},
			to: (value: Insteon.FanLevel) => {
				switch (value) {
					case Insteon.FanLevel.Low:
						return FanControl.FanMode.Low;
					case Insteon.FanLevel.Medium:
						return FanControl.FanMode.Medium;
					case Insteon.FanLevel.High:
						return FanControl.FanMode.High;
					case Insteon.FanLevel.Off:
						return FanControl.FanMode.Off;
				}
			}
		}
	}
};

Converter.Matter1 = MatterC;

declare module 'isy-nodejs/Converters' {
	namespace Converter {
		export let Matter1: typeof MatterC;
	}
}
