export default class CodeFormatter {
  static generateGCT(codes, version) {
    let code = '00D0C0DE00D0C0DE';
    codes.forEach((c) => (code += c.source));
    code += 'FF00000000000000';

    let rawData = new Uint8Array(code.length / 2);

    for (let x = 0; x < rawData.length; x++) {
      rawData[x] = parseInt(code.substr(x * 2, 2), 16);
    }

    this.downloadFile(rawData, `${version}.gct`);
  }

  static generateDolphinINI(codes, version) {
    let data = 'Paste the following on top of your games .ini file:\r\n[Gecko]';

    codes.forEach((code) => {
      data += `\r\n$${code.title} (${code.date}) [${code.author}]\r\n`;
      data += code.source
        .match(/.{8}/g)
        .join(' ')
        .replace(/(.{17})./g, '$1\r\n');
    });

    this.downloadFile(data, `${version}.txt`);
  }

  static generateCheatManagerTXT(codes, version) {
    let data = `${version}\r\nSuper Mario Sunshine`;

    codes.forEach((code) => {
      data += `\r\n\r\n${code.title} (${code.date}) [${code.author}]\r\n`;
      data += code.source
        .match(/.{8}/g)
        .join(' ')
        .replace(/(.{17})./g, '$1\r\n');
    });

    this.downloadFile(data, `${version}.txt`);
  }

  static downloadFile(data, filename) {
    var file = new Blob([data], {
      type: 'application/octet-stream',
    });

    if (window.navigator.msSaveOrOpenBlob) window.navigator.msSaveOrOpenBlob(file, filename);
    else {
      var a = document.createElement('a'),
        url = window.URL.createObjectURL(file);
      a.href = url;
      a.download = filename;
      a.click();
      setTimeout(function () {
        window.URL.revokeObjectURL(url);
      }, 500);
    }
  }
}