import {parse} from 'csv-parse/sync';
import * as core from '@actions/core';

export interface Image {
  name: string;
  enable: boolean;
}

export function Transform(inputs: string[]): Image[] {
  let images: Image[] = [];

  // backward compatibility with old format
  if (inputs.length == 1) {
    let newformat = false;
    const fields = parse(inputs[0], {
      relaxColumnCount: true,
      skipEmptyLines: true
    })[0];
    for (const field of fields) {
      const parts = field
        .toString()
        .split('=')
        .map(item => item.trim());
      if (parts.length == 1) {
        images.push({name: parts[0], enable: true});
      } else {
        newformat = true;
        break;
      }
    }
    if (!newformat) {
      return output(images);
    }
  }

  images = [];
  for (const input of inputs) {
    const image: Image = {name: '', enable: true};
    const fields = parse(input, {
      relaxColumnCount: true,
      skipEmptyLines: true
    })[0];
    for (const field of fields) {
      const parts = field
        .toString()
        .split('=')
        .map(item => item.trim());
      if (parts.length == 1) {
        image.name = parts[0];
      } else {
        const key = parts[0].toLowerCase();
        const value = parts[1];
        switch (key) {
          case 'name': {
            image.name = value;
            break;
          }
          case 'enable': {
            if (!['true', 'false'].includes(value)) {
              throw new Error(`Invalid enable attribute value: ${input}`);
            }
            image.enable = /true/i.test(value);
            break;
          }
          default: {
            throw new Error(`Unknown image attribute: ${input}`);
          }
        }
      }
    }
    if (image.name.length == 0) {
      throw new Error(`Image name attribute empty: ${input}`);
    }
    images.push(image);
  }
  return output(images);
}

function output(images: Image[]): Image[] {
  core.startGroup(`Processing images input`);
  for (const image of images) {
    core.info(`name=${image.name},enable=${image.enable}`);
  }
  core.endGroup();
  return images;
}