/*******************************************************************************
 * Copyright (c) 2017 Olivier Langella <olivier.langella@u-psud.fr>.
 *
 * This file is part of XTPcpp.
 *
 *     XTPcpp is free software: you can redistribute it and/or modify
 *     it under the terms of the GNU General Public License as published by
 *     the Free Software Foundation, either version 3 of the License, or
 *     (at your option) any later version.
 *
 *     XTPcpp is distributed in the hope that it will be useful,
 *     but WITHOUT ANY WARRANTY; without even the implied warranty of
 *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *     GNU General Public License for more details.
 *
 *     You should have received a copy of the GNU General Public License
 *     along with XTPcpp.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Contributors:
 *     Olivier Langella <olivier.langella@u-psud.fr> - initial API and
 *implementation
 ******************************************************************************/


#pragma once

#include <cstdint>
/*********** enumerations *********************************/

/** \def ExternalDatabase external database references
 *
 */
enum class ExternalDatabase : std::int8_t
{
  OboPsiMod     = 1, ///< OBO PSI MOD
  SwissProt     = 2, ///< Swiss-Prot
  TrEMBL        = 3, ///< TrEMBL
  AGI_LocusCode = 4, ///< AGI_LocusCode
  NCBI_gi       = 5, ///< NCBI_gi
  ref           = 6  ///< ref
};

/** \def IdentificationEngine identification engine
 *
 */
enum class IdentificationEngine : std::int8_t
{
  unknown  = 0, ///< X!Tandem
  XTandem  = 1, ///< MS:1001476 X!Tandem was used to analyze the spectra.
  mascot   = 2, ///< MS:1001207 The name of the Mascot search engine.
  peptider = 3, ///< peptider
  OMSSA = 4, ///< MS:1001475 Open Mass Spectrometry Search Algorithm was used to
             ///< analyze the spectra.
  SEQUEST = 5, ///< MS:1001208 The name of the SEQUEST search engine.
  Comet = 6, ///< MS:1002251 Comet open-source sequence search engine developed
             ///< at the University of Washington. PMID:23148064
  Morpheus = 7, ///< MS:1002661 "Morpheus search engine." [PMID:23323968]
  MSGFplus =
    8, ///< MS:1002048 "MS-GF+ software used to analyze the spectra." [PSI:PI]
};

/** \def PeptideEvidenceParam peptide evidence specific parameters
 * is_a: MS:1001143 ! PSM-level search engine specific statistic
 */
enum class PeptideEvidenceParam : std::int8_t
{
  tandem_hyperscore        = 0, ///< X!Tandem hyperscore MS:1001331
  tandem_expectation_value = 1, ///< X!Tandem expectation value MS:1001330
  mascot_score             = 2, ///< PSI-MS MS:1001171 mascot:score 56.16
  mascot_expectation_value =
    3, ///< PSI-MS MS:1001172 mascot:expectation value 2.42102904673618e-006
  peptide_prophet_probability       = 4, ///< no PSI MS description
  peptide_inter_prophet_probability = 5, ///< no PSI MS description
  omssa_evalue        = 6,  ///< MS:1001328  "OMSSA E-value." [PSI:PI]
  omssa_pvalue        = 7,  ///< MS:1001329  "OMSSA p-value." [PSI:PI]
  msgfplus_raw        = 8,  ///< MS:1002049  "MS-GF raw score." [PSI:PI]
  msgfplus_denovo     = 9,  ///< MS:1002050  "MS-GF de novo score." [PSI:PI]
  msgfplus_energy     = 10, ///< MS:1002051  "MS-GF energy score." [PSI:PI]
  msgfplus_SpecEValue = 11, ///< MS:1002052  "MS-GF spectral E-value." [PSI:PI]
  msgfplus_EValue     = 12, ///< MS:1002053  "MS-GF E-value." [PSI:PI]
  msgfplus_isotope_error = 13, ///< MS-GF isotope error
  comet_xcorr   = 14, ///< MS:1002252  "The Comet result 'XCorr'." [PSI:PI]
  comet_deltacn = 15, ///< MS:1002253  "The Comet result 'DeltaCn'." [PSI:PI]
  comet_deltacnstar =
    16, ///< MS:1002254  "The Comet result 'DeltaCnStar'." [PSI:PI]
  comet_spscore = 17, ///< MS:1002255  "The Comet result 'SpScore'." [PSI:PI]
  comet_sprank  = 18, ///< MS:1002256  "The Comet result 'SpRank'." [PSI:PI]
  comet_expectation_value =
    19, ///< MS:1002257  "The Comet result 'Expectation value'." [PSI:PI]

};

/** \def IdentificationEngineParam identification engine parameters
 *
 */
enum class IdentificationEngineParam : std::int8_t
{
  tandem_param = 0 ///< X!Tandem xml parameters file
};


/** \def IdentificationEngineStatistics identification engine statistics
 *
 */
enum class IdentificationEngineStatistics : std::int8_t
{
  total_spectra_assigned =
    1, ///< total_spectra_assigned in one identification file (one sample)
  total_spectra_used =
    2, ///< total_spectra_used in one identification file (one sample)
  total_peptide_used =
    3, ///< total number of peptides generated and used in identification
  total_proteins_used =
    4, ///< total number of proteins generated and used in identification
  total_unique_assigned = 5, ///< total number unique peptide sequence assigned
};

/** \def MsRunStatistics MS run statistics
 *
 */
enum class MsRunStatistics : std::int8_t
{
  total_spectra     = 1, ///< total number of spectra
  total_spectra_ms1 = 2, ///< total number of MS1 spectra
  total_spectra_ms2 = 3, ///< total number of MS2 spectra
  total_spectra_ms3 = 4, ///< total number of MS3 spectra
  tic_spectra_ms1   = 5, ///< total ion current in MS1 spectra
  tic_spectra_ms2   = 6, ///< total ion current in MS2 spectra
  tic_spectra_ms3   = 7, ///< total ion current in MS3 spectra
};


/** \def ProjectMode separate each samples or combine all
 *
 */
enum class ProjectMode
{
  individual, ///< separate each biological samples (2D spots for example)
  combined    ///< combine every MS runs to get only one protein list
};


/** \def GroupingType list of available grouping algoritms
 *
 */
enum class GroupingType
{
  PeptideMass, ///< protein grouper algo
  Phospho,     ///< phospho peptides grouping
  SampleScan   ///< X!TandemPipeline algo
};


/** \def ValidationState
 *
 */

enum class ValidationState : std::int8_t
{
  notValid        = 0, ///< notValid : automatic filter validation failed
  valid           = 1, ///< valid : automatic filter validation passed
  validAndChecked = 2, ///< validAndChecked : automatic filter validation passed
                       ///< + manual checking
  grouped = 3 ///< grouped : automatic filter validation passed + manual
              ///< checking + grouped
};


/** \def export fasta files
 *
 */

enum class ExportFastaType : std::int8_t
{
  all           = 0, ///< all grouped proteins
  oneBySubgroup = 1, ///< export only one by subgroup
  oneByGroup    = 2, ///< export only one by group
};


/** \def TableFileFormat file format of tables
 *
 */
enum class TableFileFormat : std::int8_t
{
  ods = 1, ///< Open Document Spreadsheet
  tsv = 2, ///< tabulated separated values
};