#include "form.h"
#include "mglib.h"


void TForm_stampemg::add_giaclev(TString &levname)
{
  int lv=1;
  do {
    const TString & piece = _giaclev->unpack_grpcode(relation()->lfile(LF_MAG).get("LIVELLO"),lv);
    if (piece.not_empty()) {
      levname << '/' << piece ;
    }
  } while (++lv< (_tolivgiac ? _tolivgiac: _giaclev->last_level()) ); 
}


void TForm_stampemg::gruppogiac(TForm_item &cf, TToken_string &s)
{
  TString valore,levname;
  int livello=atoi(s.get());

  if (_fromlivgiac) {
    levname=relation()->lfile(LF_MAG).get("CODART");
    if (_fromlivgiac>1) {
      add_giaclev(levname);
    } 
  } 
  levname << ' ' << _giaclev->name(livello) ;
  valore=_giaclev->group_descr(relation()->lfile(LF_MAG).get("LIVELLO"),livello);
  if (valore.empty())
    valore=UNKNOWN_NAME;
  cf.set(levname << ' ' << valore);
}


void TForm_stampemg::gruppoart(TForm_item &cf, TToken_string &s)
{
  int lv=atoi(s.get());
  TString valore;

  valore=_artlev->group_descr(relation()->lfile(LF_ANAMAG).get("CODART"),lv);
  if (valore.not_empty())
    cf.set(valore);
  else  
    cf.set(UNKNOWN_NAME);
}

bool TForm_stampemg::validate(TForm_item &cf, TToken_string &s)
{ 
  const TString code(s.get(0)); // prende il primo parametro, il codice del messaggio
  TString subcode;
  TString valore,levname;

  if (code=="_USER") {
    subcode=s.get();

    if (subcode=="GRUPPOGIAC") {
    /*
      int lv=atoi(s.get());
      do {
        valore=_giaclev->build_tabcode(relation()->lfile(LF_MAG).get("LIVELLO"),lv);
      } while (--lv>0 && valore==""); 
      if (valore!="")
        levname=_giaclev->name(lv+1) ;
      else
        levname="giacenza";
      cf.set(levname << ' ' << _giacgrp->decode(valore));
    */
      gruppogiac(cf,s);
    } 
    if (subcode=="GRUPPOART")  {
      /*
      int lv=atoi(s.get());
      do {
        valore=_artlev->build_tabcode(relation()->lfile(LF_ANAMAG).get("CODART"),lv);
      } while (--lv>0 && valore==""); 
      cf.set(_artgrp->decode(valore));
      */
      gruppoart(cf,s);
    } 
    if (subcode=="CODGRUPPOART") {
      int lv=atoi(s.get());
      do {
        valore=relation()->lfile(LF_ANAMAG).get("CODART");
        valore.rpad(25).cut(_artlev->packed_length(lv));
      } while (--lv>0 && valore==""); 
      cf.set(valore);

    } 
    if (subcode=="CATMER") {
      valore=relation()->lfile(_sottocatmer ? -401 : -400).get("S0");
      cf.set(valore);
    } 
    if (subcode=="CODCATMER") {
      valore=relation()->lfile(LF_ANAMAG).get("GRMERC");
      valore.rpad(5).cut(_sottocatmer ? 5:3);
      cf.set(valore);
    } 
    if (subcode=="LIVELLIGIAC") {
      int lv=_tolivgiac;
      valore="";
      do {
        const TString & piece = _giaclev->unpack_grpcode(relation()->lfile(LF_MAG).get("LIVELLO"),lv+1);
        if (piece.not_empty()) {
          if (valore.not_empty())
            valore << '/';
          valore << piece ;
        }
      } while (lv++<_giaclev->last_level());  
      if (valore!="")
        levname=_giaclev->name(_tolivgiac+1);
      else
        levname="Giacenza";
      cf.set(levname << ' ' << valore);
    }
    return TRUE;
  } else
    return TForm::validate(cf, s);
}

void TForm_stampemg::setcatmer(bool catmer,bool sottoc)
{
  TForm_subsection &s=((TForm_subsection &)find_field('B',odd_page,"GRUPPI_CATMER"));
  TString cond("GRMERC");
  if (catmer)
    cond << "[1," << (sottoc ? 5 : 3) <<']';
  else
    cond ="CODART[1,1]";
  s.setcondition(cond,_strexpr);
  _sottocatmer=sottoc;
} 

bool TForm_stampemg::setdett_perart(int fromlivart,int livart,int fromlivgiac,int livgiac,bool showmag, bool showdep)
{
  find_field('B',odd_page,"H_MAGAZZINO").show(showmag && showdep);
  find_field('B',odd_page,"TOT_MAGAZZINO").show(showmag);
  find_field('B',odd_page,"H_DEPOSITO").show(FALSE);
  find_field('B',odd_page,"TOT_DEPOSITO").show(showdep);
  return setdettaglio(TRUE,fromlivart,livart,fromlivgiac,livgiac,showmag||showdep);
}

bool TForm_stampemg::setdett_permag(int fromlivart,int livart,int fromlivgiac,int livgiac,bool showmag, bool showdep,bool showdett)
{
  find_field('B',odd_page,"H_MAGAZZINO").show(showmag && (showdep) );
  find_field('B',odd_page,"TOT_MAGAZZINO").show(showmag);
  find_field('B',odd_page,"H_DEPOSITO").show(showdep && showdett);
  find_field('B',odd_page,"TOT_DEPOSITO").show(showdep);
  return  setdettaglio(showdett,fromlivart,livart,fromlivgiac,livgiac,FALSE);
}

bool TForm_stampemg::setdettaglio(bool show, int fromlivart,int livart,int fromlivgiac,int livgiac,bool dettgiac)
{
  _fromlivart=fromlivart;
  _fromlivgiac=fromlivgiac;
  _tolivart=livart;
  _tolivgiac=livgiac;
  // ***********
  int i, tolivart,tolivgiac;
  // abilita le sezioni dei livelli di codice 
  TForm_subsection &s1=(TForm_subsection &)find_field('B',odd_page,"H_ARTICOLO");
  TForm_subsection &s2=(TForm_subsection &)find_field('B',odd_page,"TOT_ARTICOLO");
  if (fromlivgiac==0 && (livart==0 ||livart==_artlev->last_level())) {
    s1.show(show && livart<_artlev->last_level() || dettgiac);
    s2.show(show);
  } else {
    s1.hide();
    s2.hide();
  }
  tolivart =min(( livart ? livart  :_artlev->last_level()),_artlev->last_level()-1) ;
  tolivgiac=livgiac ? livgiac :_giaclev->last_level();
  for (i=1; i<=FORM_MAXARTLEV; i++)
  {
    TString sname("TOT_GART");
    sname << i;
    TForm_subsection &s1=(TForm_subsection &)find_field('B',odd_page,sname);
    s1.show(show && i>=fromlivart && i<=tolivart && fromlivgiac==0);
    sname="H_GCODART";
    sname << i;
    TForm_subsection &s2=(TForm_subsection &)find_field('B',odd_page,sname);
    s2.show(show && i>=fromlivart && 
      (i<tolivart || (i==tolivart && (livart>tolivart || livgiac || dettgiac))) && fromlivgiac==0);
  }
  // abilita le sezioni del codice livelli giacenza
  for (i=1; i<=FORM_MAXGIACLEV; i++)
  {
    TString sname("TOT_GLIVGIAC");
    sname << i;
    TForm_subsection &s1=(TForm_subsection &)find_field('B',odd_page,sname);
    s1.show(show && i>=fromlivgiac && (i<=tolivgiac) && livart==0);
    sname="H_GLIVGIAC";
    sname << i;
    TForm_subsection &s2=(TForm_subsection &)find_field('B',odd_page,sname);
    s2.show(show && i>=fromlivgiac && (i<tolivgiac ||(i==tolivgiac && dettgiac)) && livart==0);
  }

  // ***********
  fromlivart = fromlivart ? fromlivart  :1;
  fromlivgiac=fromlivgiac ? fromlivgiac :1;
  // codice livello giacenza
  for (i=fromlivgiac;i<=tolivgiac ; i++) {
    TString sname=("GRUPPI_LIVGIAC");
    sname << i;
    TForm_subsection &s=(TForm_subsection &)find_field('B',odd_page,sname);
    TString cond(s.condition());
    cond << "[1," << _giaclev->packed_length(i) <<']';
    s.setcondition(cond,_strexpr);
  }
  // sezioni livello codice 
  for (i=fromlivart;i<=tolivart ; i++) {
    TString sname("GRUPPI_CODART");
    sname << i;
    TForm_subsection &s=(TForm_subsection &)find_field('B',odd_page,sname);
    TString cond(s.condition());
    cond << '[' << (i==1 ? 1:_artlev->packed_length(i-1))<<',' << _artlev->packed_length(i) <<']';
    s.setcondition(cond,_strexpr);
  }

  return TRUE;
}


TForm_stampemg::TForm_stampemg(const char *name,const char *code) 
  : TForm(name,code)
{
  _giaclev= new TCodgiac_livelli();
  _artlev= new TCodart_livelli(); 
  _fromlivgiac=_tolivgiac=0;
  _fromlivart=_tolivart=0;
}
TForm_stampemg::~TForm_stampemg()
{
  delete _giaclev;
  delete _artlev;
}