#include "PGTwoII_PD.h"
#include "PGTwoII_PerProtein.h"

#include <vector>

ProjectedDatabase::ProjectedDatabase() {
  Support=0;
}

void ProjectedDatabase::InitiateProData(const char & FirstPrefix, const vector <string> & SequencesDatabase) {
  Support = 0;
  for (int ProteinIndex = 0; ProteinIndex < (int)(SequencesDatabase.size()); ProteinIndex++) {
    PerProtein TempPerProtein;
    TempPerProtein.InitiatePerProtein(SequencesDatabase[ProteinIndex], FirstPrefix, ProteinIndex);
    if (TempPerProtein.GetNumberOfPositions()>0) {
      ForEachProtein.push_back(TempPerProtein);
      Support++;
    }
  }
  Prefix.push_back(FirstPrefix);
}

void ProjectedDatabase::UpdateProData(const ProjectedDatabase & rval,
                                      const char & NewPrefix,
                                      const vector <string> & SequencesDatabase,
                                      const int & Lower,
                                      const int & Upper) {
  Support = 0;
  Prefix = rval.Prefix;
  Wildcard_Number = rval.Wildcard_Number;
  PerProtein EmptyProtein;
  for (int PerProteinIndex = 0; PerProteinIndex < (int)(rval.ForEachProtein.size()); PerProteinIndex++) {
    PerProtein TempProtein;
    TempProtein = EmptyProtein;
    TempProtein.CopyPart(rval.ForEachProtein[PerProteinIndex]);
    string TempStr = SequencesDatabase[TempProtein.GetRealProteinIndex()];
    TempProtein.UpdateCurrentPrefix(rval.ForEachProtein[PerProteinIndex],
                                    TempStr,
                                    NewPrefix,
                                    Lower,
                                    Upper);
    if (TempProtein.GetNumberOfPositions() > 0) {
      ForEachProtein.push_back(TempProtein);
      Support++;
    }
  }
  Prefix.push_back(NewPrefix);
  Wildcard_Number.push_back(Lower);
  Wildcard_Number.push_back(Upper);
}

int ProjectedDatabase::GetSupport() {return Support;}

int ProjectedDatabase::GetPrefixSize() {return Prefix.size();}

vector<char> ProjectedDatabase::GetPrefix(){return Prefix;}

vector<int> ProjectedDatabase::GetWildcardNumber() {return Wildcard_Number;}



