/* -*- mode: c; tab-width: 4; c-basic-offset: 4;  indent-tabs-mode: nil -*- */

/*********************************************************************
 * Clustal Omega - Multiple sequence alignment
 *
 * Copyright (C) 2010 University College Dublin
 *
 * Clustal-Omega 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 file is part of Clustal-Omega.
 *
 ********************************************************************/

/*
 *  RCS $Id: clustalo-api-test.c 280 2013-05-16 16:04:12Z fabian $
 */


#include <stdio.h>

/* see clustal-omega.c for documentation */

/* Include clustal-omega's header. That's all you need 
 *
 * If you developing in C++, use the following instead:
 * extern "C" {
 * #include "clustal-omega.h"
 * }
 */
#include "clustal-omega.h"


int
main(int argc, char **argv)
{
    /* the multiple sequence structure */
    mseq_t *prMSeq = NULL;
    /* for openmp: number of threads to use */
    int iThreads = 1;
    /* alignment options to use */
    opts_t rAlnOpts;
    /* an input file */
    char *pcSeqInfile;
    int iAux;

    int msa_c = 0;
    char **msa_v = NULL;


    /* Must happen first: setup logger */
    LogDefaultSetup(&rLog);

    SetDefaultAlnOpts(&rAlnOpts);

    InitClustalOmega(iThreads);

    /* Get sequence input file name from command line
     */
    if (argc!=2) {
        Log(&rLog, LOG_FATAL, "Need sequence file as argument");
    }
    pcSeqInfile = argv[1];

    /* Read sequence file
     */
    NewMSeq(&prMSeq);
    if (ReadSequences(prMSeq, pcSeqInfile,
                      SEQTYPE_UNKNOWN,
                      INT_MAX, INT_MAX)) {
        Log(&rLog, LOG_FATAL, "Reading sequence file '%s' failed", pcSeqInfile);
    }

    /* Dump some info about the sequences
     */
    for (iAux=0; iAux<prMSeq->nseqs; iAux++) {
        Log(&rLog, LOG_INFO, 
             "Sequence no %d has the following name: %s",
             iAux, prMSeq->sqinfo[iAux].name);
        Log(&rLog, LOG_INFO, 
             "Sequence no %d has the following residues: %s",
             iAux, prMSeq->seq[iAux]);
        /* more info can be found in prMSeq->sqinfo[iAux] */
    }


    /* Align the sequences without a profile (NULL)
     */
    if (Align(prMSeq, NULL, &rAlnOpts)) {
        Log(&rLog, LOG_FATAL, "A fatal error happended during the alignment process");
    }


    /* Output of final alignment to stdout (NULL) as aligned fasta/a2m
     */
#define LINE_WRAP 60
    ClustalOmegaOutput msaOutput;
    if (WriteAlignment(prMSeq, NULL, MSAFILE_A2M, LINE_WRAP, &msa_c, &msa_v)) {
        Log(&rLog, LOG_FATAL, "Could not save alignment");
    } 

    FreeMSeq(&prMSeq);

    Log(&rLog, LOG_INFO, "Successfull program exit");

    return EXIT_SUCCESS;
}
/***   end of main()   ***/