/**
 * UGENE - Integrated Bioinformatics Tools.
 * Copyright (C) 2008-2023 UniPro <ugene@unipro.ru>
 * http://ugene.net
 *
 * This program 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 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301, USA.
 */

#pragma once

#include <QString>

namespace U2 {

class HmmerBuildSettings {
public:
    enum p7_archchoice_e {  // model construction strategies
        p7_ARCH_FAST,  // --fast: assign cols >= symfrac residues as consensus
        p7_ARCH_HAND  // --hand: manual construction ( requires reference annotation )
    };

    enum p7_wgtchoice_e {  // relative sequence weighting strategies
        p7_WGT_NONE,  // --wnone: don't do any relative weighting ( set all to 1 )
        p7_WGT_GIVEN,  // --wgiven: use weights as given in msa file
        p7_WGT_GSC,  // --wgsc: Gerstein/Sonnhammer/Chotia tree weights
        p7_WGT_PB,  // --wpb: Henikoff position-based weigths
        p7_WGT_BLOSUM  // --wblosum: Henikoff simple filter weights
    };

    enum p7_effnchoice_e {  // effective sequence weighting strategies
        p7_EFFN_NONE,  // --enone: no effective seq # weighting: just use nseq
        p7_EFFN_SET,  // --eset: seq eff seq # for all models
        p7_EFFN_CLUST,  // --eclust: eff seq # is # of single linkage clusters
        p7_EFFN_ENTROPY  // --eent: adjust eff seq # to achieve relative entropy target
    };

    HmmerBuildSettings();

    bool validate() const;

    p7_archchoice_e modelConstructionStrategy;
    p7_wgtchoice_e relativeSequenceWeightingStrategy;
    p7_effnchoice_e effectiveSequenceWeightingStrategy;

    double eset;  // --eset argument

    int seed;  // --seed argument

    float symfrac;  // --symfrac. sets sym fraction controlling --fast construction
    float fragtresh;  // --fragtresh. if L < x<L>, tag sequence as a fragment
    double wid;  // --wid. for --wblosum: set identity cutoff
    double ere;  // --ere. for --eent:set target relative entropy
    double esigma;  // --esigma. for --eent: set sigma param to <x>
    double eid;  // --eid. for --eclust. set fractional identity cutoff
    int eml;  // --EmL. length of sequences for MSV Gumbel mu fit
    int emn;  // --EmN. number of sequences for MSV Gumbel mu fit
    int evl;  // --EvL. length of sequences for Viterbi Gumbel mu fit
    int evn;  // --EvN. number of sequences for Viterbi Gumbel mu fit
    int efl;  // --EfL. length of sequences for forward exp tail mu fit
    int efn;  // --EfN. number of sequences for forward exp tail mu fit
    double eft;  // --Eft. tail mass for forward exponential tail mu fit

    QString workingDir;
    QString profileUrl;
};

}  // namespace U2
