import { MeterFamilies, MeterFamily, MeterFamilyCode, AlphaA1MeterFamily, AlphaA3MeterFamily, } from './MeterFamilies'; export type MeterInterpretationCode = number; export type MeterPassword = string; export type MeterName = string; export interface ReadStrategy { name?: MeterName; meterFamily: MeterFamily; interpretationCode: MeterInterpretationCode; meterPassword?: MeterPassword; billingTable?: string | undefined; } export interface PartialStrategy { name: MeterName; meterFamily: MeterFamily; } const billingTables = { edenor: { alpha_a1: '00', alpha_a3: '00', }, edemsa: { alpha_a1: '01', alpha_a3: '02', }, }; export const createReadStrategy = ( name: MeterName, familyCode: MeterFamilyCode, interpretationCode: MeterInterpretationCode, utility: string = 'edemsa', meterPassword?: MeterPassword, ): ReadStrategy => { const foundMeterFamily = MeterFamilies.find(family => family.code === familyCode); if (foundMeterFamily == null) { throw new Error('Invalid meter family code'); } const billingTable = billingTables[utility][foundMeterFamily.code] ?? undefined; const meterFamily: MeterFamily = foundMeterFamily.code === AlphaA1MeterFamily.code || foundMeterFamily.code === AlphaA3MeterFamily.code ? { ...foundMeterFamily, probeCommand: () => foundMeterFamily?.probeCommand(meterPassword, billingTable), } : foundMeterFamily; return { name, meterFamily, interpretationCode, meterPassword, billingTable, }; }; export const createPartialStrategy = (name: MeterName, familyCode: MeterFamilyCode): PartialStrategy => { const foundMeterFamily = MeterFamilies.find(family => family.code === familyCode); if (foundMeterFamily == null) { throw new Error('Invalid meter family code'); } return { name, meterFamily: foundMeterFamily, }; };