import { CliUsageError } from '@alwaysai/alwayscli';
import * as chalk from 'chalk';
import { Choice } from 'prompts';
import { RequiredWithYesMessage, promptForInput } from '../../util';
import { deviceAddComponent } from './device-add-component';
import {
  CliRpcClient,
  CliAuthenticationClient,
  getDeviceByUuid,
  AaiDevice
} from '../../infrastructure';

export async function deviceSelectComponent(props: {
  yes: boolean;
  deviceId?: string;
}): Promise<{ device: AaiDevice; new: boolean }> {
  const { yes, deviceId } = props;
  if (deviceId) {
    const device = await getDeviceByUuid({ uuid: deviceId });
    return { device, new: false };
  }
  if (yes && !deviceId) {
    throw new CliUsageError(RequiredWithYesMessage('deviceId'));
  }

  const { username } = await CliAuthenticationClient().getInfo();
  const userDevices = await CliRpcClient().getUserDevices({
    user_name: username
  });

  const choices: Choice[] = [
    { title: chalk.green.bold('Add a new device'), value: 'new' }
  ];
  userDevices.forEach((device, index) => {
    choices.push({
      title: `${device.friendly_name} (${device.mode})`,
      value: `${index}`
    });
  });

  const choice = await promptForInput({
    purpose: 'to select a target device',
    questions: [
      {
        type: 'select',
        name: 'targetDevice',
        message: 'select a target device',
        initial: 0,
        choices
      }
    ]
  });

  let selectedDevice: AaiDevice;
  if (choice.targetDevice === 'new') {
    const device = await deviceAddComponent({ yes });
    selectedDevice = device;
  } else {
    const device = userDevices[choice.targetDevice];
    selectedDevice = device as AaiDevice;
  }
  return { device: selectedDevice, new: choice.targetDevice === 'new' };
}
