import { CliBranch, CliLeaf, CliStringInput } from '@alwaysai/alwayscli';
import { appPackageComponent } from '../../components/app';
import {
  findOrWriteDockerComposeFileComponent,
  writeStandaloneDockerfileComponent
} from '../../components/docker';
import {
  getDockerComposeCmdForApp,
  getTargetHardwareType
} from '../../core/app';

export const dockerCompose = CliLeaf({
  name: 'docker-compose',
  description: 'Generate Docker compose file for this project.',
  hidden: false,
  async action() {
    await writeStandaloneDockerfileComponent();
    await findOrWriteDockerComposeFileComponent({
      yes: true,
      cmd: await getDockerComposeCmdForApp({
        targetHardware: await getTargetHardwareType({})
      })
    });
  }
});

export const docker = CliLeaf({
  name: 'docker',
  description: `Package this application as a Docker image`,
  positionalInput: CliStringInput({
    description:
      'Tag for application Docker image. Format: <dockerhub-user>/<img-name>:<version>',
    placeholder: '<image_tag>',
    required: true
  }),
  async action(dockerTag) {
    await appPackageComponent({
      yes: true,
      dockerImageTag: dockerTag
    });
  }
});

export const appGenerateCliBranch = CliBranch({
  name: 'generate',
  description: `Generate application files.`,
  subcommands: [dockerCompose, docker]
});
