class Gcp{
  constructor(text){
    this.text = text;
  }

  // Scale the image location of GPCs
  // according to the values specified in the map
  // @param imagesRatioMap {Object} object in which keys are image names and values are scaling ratios
  //    example: {'DJI_0018.jpg': 0.5, 'DJI_0019.JPG': 0.25}
  // @return {Gcp} a new GCP object
  resize(imagesRatioMap, muteWarnings = false){
    // Make sure dict is all lower case and values are floats
    let ratioMap = {};
    for (let k in imagesRatioMap) ratioMap[k.toLowerCase()] = parseFloat(imagesRatioMap[k]);

    const lines = this.text.split(/\r?\n/);
    let output = "";

    if (lines.length > 0){
      output += lines[0] + '\n'; // coordinate system description

      for (let i = 1; i < lines.length; i++){
        let line = lines[i].trim();
        if (line !== ""){
          let parts = line.split(/\s+/);
          if (parts.length >= 6){
            let [x, y, z, px, py, imagename, ...extracols] = parts;
            let ratio = ratioMap[imagename.toLowerCase()];

            px = parseFloat(px);
            py = parseFloat(py);

            if (ratio !== undefined){
              px *= ratio;
              py *= ratio;
            }else{
              if (!muteWarnings) console.warn(`${imagename} not found in ratio map. Are you missing some images?`);
            }

            let extra = extracols.length > 0 ? ' ' + extracols.join(' ') : '';
            output += `${x} ${y} ${z} ${px.toFixed(2)} ${py.toFixed(2)} ${imagename}${extra}\n`;
          }else{
            if (!muteWarnings) console.warn(`Invalid GCP format at line ${i}: ${line}`);
            output += line + '\n';
          }
        }
      }
    }

    return new Gcp(output);
  }

  toString(){
    return this.text;
  }
}

module.exports = Gcp;

class Gcp{
  constructor(text){
    this.text = text;
  }

  // Scale the image location of GPCs
  // according to the values specified in the map
  // @param imagesRatioMap {Object} object in which keys are image names and values are scaling ratios
  //    example: {'DJI_0018.jpg': 0.5, 'DJI_0019.JPG': 0.25}
  // @return {Gcp} a new GCP object
  resize(imagesRatioMap, muteWarnings = false){
    // Make sure dict is all lower case and values are floats
    let ratioMap = {};
    for (let k in imagesRatioMap) ratioMap[k.toLowerCase()] = parseFloat(imagesRatioMap[k]);

    const lines = this.text.split(/\r?\n/);
    let output = "";

    if (lines.length > 0){
      output += lines[0] + '\n'; // coordinate system description

      for (let i = 1; i < lines.length; i++){
        let line = lines[i].trim();
        if (line !== "" && line[0] !== "#"){
          let parts = line.split(/\s+/);
          if (parts.length >= 6){
            let [x, y, z, px, py, imagename, ...extracols] = parts;
            let ratio = ratioMap[imagename.toLowerCase()];

            px = parseFloat(px);
            py = parseFloat(py);

            if (ratio !== undefined){
              px *= ratio;
              py *= ratio;
            }else{
              if (!muteWarnings) console.warn(`${imagename} not found in ratio map. Are you missing some images?`);
            }

            let extra = extracols.length > 0 ? ' ' + extracols.join(' ') : '';
            output += `${x} ${y} ${z} ${px.toFixed(2)} ${py.toFixed(2)} ${imagename}${extra}\n`;
          }else{
            if (!muteWarnings) console.warn(`Invalid GCP format at line ${i}: ${line}`);
            output += line + '\n';
          }
        }
      }
    }

    return new Gcp(output);
  }

  toString(){
    return this.text;
  }
}

module.exports = Gcp;

Support for comments in gcp files