#include "PGOneIII_PerProtein.h"
#include <string>
#include <vector>

PerProtein::PerProtein()
{
  RealProteinIndex = 0;
  NumberOfPositions = 0;
  LengthOfProtein = 0;
}


PerProtein::PerProtein(const PerProtein & rval)
{
  RealProteinIndex = rval.RealProteinIndex;
  NumberOfPositions = rval.NumberOfPositions;
  LengthOfProtein = rval.LengthOfProtein;
  EndOfPrefix = rval.EndOfPrefix;
  CurrentPrefix = rval.CurrentPrefix;
}

void PerProtein::InitiatePerProtein(const string & OneProtein, const char & FirstPrefix, const int & ProteinIndexInput, const int & Max_Pat_Length) {
  RealProteinIndex = ProteinIndexInput;
  LengthOfProtein = OneProtein.size();
  NumberOfPositions = 0;
  for (int ResidueIndex = 0; ResidueIndex < LengthOfProtein-1; ResidueIndex++) {
    if (OneProtein[ResidueIndex] == FirstPrefix) {
      CurrentPrefix.push_back(ResidueIndex);
      NumberOfPositions++;
      if (ResidueIndex + Max_Pat_Length < LengthOfProtein-1)
        EndOfPrefix.push_back(ResidueIndex + Max_Pat_Length);
      else EndOfPrefix.push_back(LengthOfProtein-1);
    }
  }
}

void PerProtein::UpdateCurrentPrefix(const string & OneProtein, const char & NewPrefix) {

    for (int PositionIndex = CurrentPrefix.size() - 1; PositionIndex >= 0; PositionIndex--) {
      bool found = false;
      for (int ResidueIndex = CurrentPrefix[PositionIndex] + 1;
           ResidueIndex < EndOfPrefix[PositionIndex]; ResidueIndex++) {
        if (OneProtein[ResidueIndex] == NewPrefix) {
          found = true;
          CurrentPrefix[PositionIndex] = ResidueIndex;
          break;
        }
      }
      if (!found)
        DeleteOnePosition(PositionIndex);
    }
}

void PerProtein::DeleteOnePosition(const int & PositionIndex) {
  int End = EndOfPrefix.size() - 1;
  if (PositionIndex != (End)) {   // not the last one;
    EndOfPrefix[PositionIndex] = EndOfPrefix[End];
    CurrentPrefix[PositionIndex] = CurrentPrefix[End];
  }
  EndOfPrefix.pop_back();
  CurrentPrefix.pop_back();
  NumberOfPositions--;
}

void PerProtein::Copy(const PerProtein & rval) {
  RealProteinIndex = rval.RealProteinIndex;
  NumberOfPositions = rval.NumberOfPositions;
  LengthOfProtein = rval.LengthOfProtein;
  EndOfPrefix = rval.EndOfPrefix;
  CurrentPrefix = rval.CurrentPrefix;
}

  int PerProtein::GetRealProteinIndex() {return RealProteinIndex;}
  int PerProtein::GetNumberOfPositions() {return NumberOfPositions;}
  int PerProtein::GetLengthOfProtein() {return LengthOfProtein;}

