import { sendFimpMsg } from '../fimp/fimp';
import {
  VinculumPd7Device,
  VinculumPd7Service,
} from '../fimp/vinculum_pd7_device';
import { ServiceComponentsCreationResult } from '../ha/publish_device';

export function out_lvl_switch__components(
  topicPrefix: string,
  device: VinculumPd7Device,
  svc: VinculumPd7Service,
  _svcName: string,
): ServiceComponentsCreationResult | undefined {
  const commandTopic = `${topicPrefix}${svc.addr}/command`;

  const minLvl = svc.props?.min_lvl ?? 0;
  const maxLvl = svc.props?.max_lvl ?? 100;

  return {
    components: {
      [svc.addr]: {
        unique_id: svc.addr,
        platform: 'number',
        name: 'Level Switch',
        min: minLvl,
        max: maxLvl,
        step: 1,
        command_topic: commandTopic,
        optimistic: false,
        value_template: `{{ value_json['${svc.addr}'].lvl }}`,
      },
    },

    commandHandlers: {
      [commandTopic]: async (payload: string) => {
        const lvl = parseInt(payload, 10);
        if (Number.isNaN(lvl)) {
          return;
        }

        await sendFimpMsg({
          address: svc.addr!,
          service: 'out_lvl_switch',
          cmd: 'cmd.lvl.set',
          val: lvl,
          val_t: 'int',
        });
      },
    },
  };
}
