#include <applicat.h>
#include <diction.h>
#include <reputils.h>
#include <textset.h>

///////////////////////////////////////////////////////////
// TAS400_report
///////////////////////////////////////////////////////////

TRecordset* TAS400_report::recordset() const
{
  return _set != NULL ? _set : TReport::recordset();
}

bool TAS400_report::set_recordset(TRecordset* rs)
{
  if (_set != NULL && _owned)
    delete _set;
  _set = rs;
  _owned = true;
  
  const TAS400_recordset& recset = *(TAS400_recordset*)_set;

  TReport_section& body = section('B', 1);
  body.destroy();

  const int reclen = recset.record_length();
  const int keypos = recset.key_position();
  const int keylen = recset.key_length();
  const int tabstop = 10;

  // Genera sfondo solo per colonne dispari
  for (int x = tabstop; x < reclen; x += 2*tabstop)
  {
    TReport_field* b = new TReport_field(&body);
    b->set_type('R');
    b->set_pos(x*100, 0);
    b->set_size(tabstop*100, 100);
    b->set_pattern(PAT_SOLID);
    b->set_back_color(XVT_MAKE_COLOR(192,255,255)); // Light Cyan
    body.add(b);
  }
  
  // Genera sfondo per la chiave se presente
  if (keylen > 0)
  {
    TReport_field* b = new TReport_field(&body);
    b->set_type('R');
    b->set_pos(keypos*100, 0);
    b->set_size(keylen*100, 100);
    b->set_pattern(PAT_SOLID);
    b->set_back_color(XVT_MAKE_COLOR(255,192,192)); // Light Fucsia
    body.add(b);
  }

  // Genera campi a passo fisso per evitare errori di arrotondamento font
  TString16 src; // Nome della sorgente di ogni colonna
  for (int k = 0; k < reclen; k += tabstop)
  {
    TReport_field* f = new TReport_field(&body);
    f->set_type('S');
    src.format("A[%d,%d]", k+1, k+tabstop);
    f->set_field(src);
    f->set_pos(k*100, 0);
    f->set_size(tabstop*100, 100);
    body.add(f);
  }

  return true;
}

bool TAS400_report::set_recordset(const TString& query)
{
  TAS400_recordset* rs = (TAS400_recordset*)recordset();
  if (rs == NULL || !_owned)
  {
    rs = new TAS400_recordset(query);
    TAS400_report::set_recordset(rs);
  }
  else
    rs->exec(query);
  return true;
}

TAS400_report::TAS400_report(const char* query) 
             : _set(NULL), _owned(false)
{
  set_recordset(TFixed_string(query));
}

TAS400_report::TAS400_report(TRecordset& asr) 
             : _set(NULL), _owned(false)
{
  set_recordset(&asr);
  _owned = false; // il metodo precedente forza _owned = true
}

///////////////////////////////////////////////////////////
// TLog_report
///////////////////////////////////////////////////////////

void TLog_report::set_title(const char* title)
{
  _title = title;
  if (_title.blank())
    _title = main_app().title();
}

bool TLog_report::get_usr_val(const TString& name, TVariant& var) const
{
  if (name == "#TITLE")
  {
    var = _title;
    return true;
  }
  return TReport::get_usr_val(name, var);
}

bool TLog_report::set_usr_val(const TString& name, const TVariant& var)
{
  if (name == "#TITLE")
  {
    set_title(var.as_string());
    return true;
  }
  
  return TReport::set_usr_val(name, var);
}

void TLog_report::reset()
{
  TText_recordset* csv = (TText_recordset*)recordset();
  if (csv)
    csv->destroy();
}

bool TLog_report::log(int sev, const char* msg)
{
  TText_recordset* csv = (TText_recordset*)recordset();
  bool ok = csv != NULL;
  if (ok)
  {
    //controlla se la stringa esiste gia'
    if (_kill_duplicates)
    {
      for (bool go = csv->move_last(); go; go = csv->move_prev())
      {
        const TString& m = csv->get(1).as_string();
        if (m == msg)
          return true;  // ignoro messaggio duplicato
      }
    }
    //aggiunge il messaggio
    ok = csv->new_rec() >= 0;
    if (ok)
    {
      csv->set(0u, TVariant((long)sev));
      csv->set(1, TVariant(msg));
    }
  }
  return ok;
}

TLog_report::TLog_report(const char* title, const char* name) : _kill_duplicates(false)
{
  load(name);
  if (recordset() == NULL)
  {
    TCSV_recordset* csv = new TCSV_recordset("CSV(\"\t\")"); // tab separated
    set_recordset(csv);
  }
  set_title(title);
}