/*****************************************************************************
  shiftBed.cpp

  (c) 2016 - David Richardson
  European Molecular Biology Laboratory, European Bioinformatics Institute
  davidr@ebi.ac.uk

  Licensed under the GNU General Public License 2.0 license.
******************************************************************************/
#include "lineFileUtilities.h"
#include "shiftBed.h"

BedShift::BedShift(string &bedFile, string &genomeFile, float shiftMinus,
                   float shiftPlus, bool fractional, bool printHeader) {

  _bedFile = bedFile;
  _genomeFile = genomeFile;
  _shiftMinus = shiftMinus;
  _shiftPlus = shiftPlus;
  _fractional = fractional;
  _printHeader = printHeader;

  _bed = new BedFile(bedFile);
  _genome = new GenomeFile(genomeFile);

  // get going, shift it around.
  ShiftBed();
}

BedShift::~BedShift(void) {}

void BedShift::ShiftBed() {

  BED bedEntry; // used to store the current BED line from the BED file.

  _bed->Open();
  // report header first if asked.
  if (_printHeader == true) {
    _bed->PrintHeader();
  }
  while (_bed->GetNextBed(bedEntry)) {
    if (_bed->_status == BED_VALID) {
      AddShift(bedEntry);
      _bed->reportBedNewLine(bedEntry);
    }
  }
  _bed->Close();
}

void BedShift::AddShift(BED &bed) {

  CHRPOS chromSize = (CHRPOS)_genome->getChromSize(bed.chrom);

  double shift;

  if (bed.strand == "-") {
    shift = _shiftMinus;
  } else {
    shift = _shiftPlus;
  }
  if (_fractional == true)
    shift = shift * (double)bed.size();

  if ((bed.start + shift) < 0)
    bed.start = 0;
  else if ((bed.start + shift) > (chromSize - 1))
    bed.start = (chromSize - 1);
  else
    bed.start = bed.start + shift;

  if ((bed.end + shift) <= 0)
    bed.end = 1;
  else if ((bed.end + shift) > chromSize)
    bed.end = chromSize;
  else
    bed.end = bed.end + shift;
}