/*************************************************************************************

    Grid physics library, www.github.com/paboyle/Grid 

    Source file: ./lib/Log.cc

    Copyright (C) 2015

Author: Antonin Portelli <antonin.portelli@me.com>
Author: Azusa Yamaguchi <ayamaguc@staffmail.ed.ac.uk>
Author: Peter Boyle <paboyle@ph.ed.ac.uk>
Author: paboyle <paboyle@ph.ed.ac.uk>

    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.

    See the full license in the file "LICENSE" in the top level distribution directory
    *************************************************************************************/
    /*  END LEGAL */
#include <Grid.h>

namespace Grid {

GridStopWatch Logger::StopWatch;
std::ostream  Logger::devnull(0);
std::string Logger::BLACK("\033[30m");
std::string Logger::RED("\033[31m");
std::string Logger::GREEN("\033[32m");
std::string Logger::YELLOW("\033[33m");
std::string Logger::BLUE("\033[34m");
std::string Logger::PURPLE("\033[35m");
std::string Logger::CYAN("\033[36m");
std::string Logger::WHITE("\033[37m");
std::string Logger::NORMAL("\033[0;39m");
std::string EMPTY("");

#if 0  
  GridLogger GridLogError      (1,"Error",Logger::RED);
  GridLogger GridLogWarning    (1,"Warning",Logger::YELLOW);
  GridLogger GridLogMessage    (1,"Message",Logger::BLACK);
  GridLogger GridLogDebug      (1,"Debug",Logger::PURPLE);
  GridLogger GridLogPerformance(1,"Performance",Logger::GREEN);
  GridLogger GridLogIterative  (1,"Iterative",Logger::BLUE);
  GridLogger GridLogIntegrator (1,"Integrator",Logger::BLUE);
#else
  GridLogger GridLogError      (1,"Error",EMPTY);
  GridLogger GridLogWarning    (1,"Warning",EMPTY);
  GridLogger GridLogMessage    (1,"Message",EMPTY);
  GridLogger GridLogDebug      (1,"Debug",EMPTY);
  GridLogger GridLogPerformance(1,"Performance",EMPTY);
  GridLogger GridLogIterative  (1,"Iterative",EMPTY);
  GridLogger GridLogIntegrator (1,"Integrator",EMPTY);
#endif

void GridLogConfigure(std::vector<std::string> &logstreams)
{
  GridLogError.Active(0);
  GridLogWarning.Active(0);
  GridLogMessage.Active(0);
  GridLogIterative.Active(0);
  GridLogDebug.Active(0);
  GridLogPerformance.Active(0);
  GridLogIntegrator.Active(0);

  int blackAndWhite = 1;
  if(blackAndWhite){
    Logger::BLACK = std::string("");
    Logger::RED    =Logger::BLACK;
    Logger::GREEN  =Logger::BLACK;
    Logger::YELLOW =Logger::BLACK;
    Logger::BLUE   =Logger::BLACK;
    Logger::PURPLE =Logger::BLACK;
    Logger::CYAN   =Logger::BLACK;
    Logger::WHITE  =Logger::BLACK;
    Logger::NORMAL =Logger::BLACK;
  }

  for(int i=0;i<logstreams.size();i++){
    if ( logstreams[i]== std::string("Error")       ) GridLogError.Active(1);
    if ( logstreams[i]== std::string("Warning")     ) GridLogWarning.Active(1);
    if ( logstreams[i]== std::string("Message")     ) GridLogMessage.Active(1);
    if ( logstreams[i]== std::string("Iterative")   ) GridLogIterative.Active(1);
    if ( logstreams[i]== std::string("Debug")       ) GridLogDebug.Active(1);
    if ( logstreams[i]== std::string("Performance") ) GridLogPerformance.Active(1);
    if ( logstreams[i]== std::string("Integrator" ) ) GridLogIntegrator.Active(1);
  }
}

////////////////////////////////////////////////////////////
// Verbose limiter on MPI tasks
////////////////////////////////////////////////////////////
void Grid_quiesce_nodes(void)
{
  int me=0;
#ifdef GRID_COMMS_MPI
  MPI_Comm_rank(MPI_COMM_WORLD,&me);
#endif
#ifdef GRID_COMMS_SHMEM
  me = shmem_my_pe();
#endif
  if ( me ) { 
    std::cout.setstate(std::ios::badbit);
  }
}

void Grid_unquiesce_nodes(void)
{
#ifdef GRID_COMMS_MPI
    std::cout.clear();
#endif
}


}