#include <automask.h>
#include <defmask.h>
#include <msksheet.h>
#include <mask.h>
#include <recarray.h>
#include <recset.h>
#include <tabapp.h>

#include <multirel.h>
#include "../mg/anamag.h"
#include "ps0430100a.h"

#define FILE_KEY "ACM"

///////////////////////////////////////////////////////////
// TArt_mask maschera
///////////////////////////////////////////////////////////

class TArt_mask : public TAutomask
{
	TString _query;
	TISAM_recordset _recset;
	bool _filter_changed;

	virtual void next_page(int p);
	
public:
	void update_sheet();
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
  TArt_mask();
};

TArt_mask::TArt_mask() : TAutomask("ps0430100a"), _recset("USE ANAMAG")
{
	TConfig c(CONFIG_DITTA);
	TSheet_field & sh = sfield(F_ARTICLES);
	TMask & sh_mask = sh.sheet_mask();
	TString80 prompt;

	for (int i = 1; i	<= 10; i++)
  {                  
    const int col = sh.cid2index(F_USER1 + i -1);
    TEditable_field & f = sh_mask.efield(F_USER1 + i - 1);            
		
		if (c.get_bool("CHK_USER", "ve", i)	&& c.get_bool("USERDEF", "or", i))
    {  
      prompt = c.get("PROMPT_USER", "ve", i);
      prompt.rpad(20);              
			f.set_prompt(prompt);
			sh.set_column_header(col, prompt);
    }
		else
		{
			f.hide();
			sh.delete_column(col);
		}
	}
}

void TArt_mask::update_sheet()
{
  const bool active_only = get_bool(F_ACTIVEONLY);
	TSheet_field& sf = sfield(F_ARTICLES);
	
  TString query("USE ANAMAG KEY ");

  TString select;
	TLocalisamfile multirel(LF_MULTIREL);
	const TString user(get(F_USER));

	const TString & codart = get(F_SCODART);

	if (codart.full())
		select << "(UPPER(" << ANAMAG_CODART << ")?=UPPER(\"" << codart << "\"))";

	const TString & desart = get(F_SDESART);

	if (desart.full())
	{
		if (select.full())
			select << "&&";
		select << "(UPPER(" << ANAMAG_DESCR << ")?=UPPER(\"" << desart << "\"))";
	}

	const TString & desagg = get(F_SDESAGG);

	if (desagg.full())
	{
		if (select.full())
			select << "&&";
		select << "(UPPER(" << ANAMAG_DESCRAGG << ")?=UPPER(\"" << desagg << "\"))";
	}

	const TString & codforn = get(F_SCODFOR);

	if (codforn.full())
	{
		if (select.full())
			select << "&&";
		select << "(" << ANAMAG_CODFORN << "==\"" << codforn << "\")";
	}

	const TString & ragsoc = get(F_SRAGSOC);

	if (ragsoc.full())
	{
		if (select.full())
			select << "&&";
		select << "(UPPER(CLIFO.RAGSOC)?=UPPER(\"" <<  ragsoc << "\"))";
	}

	TString16 grmerc(get(F_GRMERC));
	if (grmerc.full())
		query << '3';
	else
		query << '1';

	if (select.full())
		query << "\nSELECT " << select;

	grmerc.left_just(3);
	grmerc << get(F_SGRMERC);
	grmerc.trim();

	if (grmerc.full())
		query << "\nJOIN CLIFO INTO TIPOCF==\"F\" CODCF==CODFORN\nFROM GRMERC=#GRMERC\nTO GRMERC=#GRMERC";
	else
		query << "\nJOIN CLIFO INTO TIPOCF==\"F\" CODCF==CODFORN\n";
	
	_recset.set(query);

	TVariant var ;

	var = grmerc;
	_recset.set_var("#GRMERC", var);
	
	int i = 0;

	sf.destroy();

   for (bool ok = _recset.move_first(); ok; ok = _recset.move_next())
  {
		const TString& codart = _recset.get(ANAMAG_CODART).as_string();

 		multirel.put(MULTI_COD, FILE_KEY);
		multirel.put(MULTI_FIRST, user);
		multirel.put(MULTI_SECOND, codart);
    const bool act = multirel.read(_isequal) == NOERR;

    if (active_only && !act)
      continue;

		TToken_string & row = sf.row(i++);
		row.add(codart, sf.cid2index(F_CODART));
		row.add(_recset.get(ANAMAG_DESCR).as_string(), sf.cid2index(F_DESCR));
  	row.add(act ? "X" : " ", sf.cid2index(F_ATTIVO));
		row.add(_recset.get(ANAMAG_CODFORN).as_string(), sf.cid2index(F_CODFORN));
		row.add(_recset.get("CLIFO.RAGSOC").as_string(), sf.cid2index(F_RAGSOC));
		row.add(_recset.get(ANAMAG_GIORNIRIOR).as_string(), sf.cid2index(F_LEADTIME));
		row.add(_recset.get(ANAMAG_LOTTORIOR).as_string(), sf.cid2index(F_LOTTOMIN));
		row.add(_recset.get(ANAMAG_DESCRAGG).as_string().left(50), sf.cid2index(F_DESCRAGG));
		row.add(_recset.get(ANAMAG_PPCONF).as_string(), sf.cid2index(F_PPCONF));
		row.add(_recset.get(ANAMAG_VALSTATUN).as_string(), sf.cid2index(F_VALSTATUN));
		row.add(_recset.get(ANAMAG_ULTCOS1).as_string(), sf.cid2index(F_ULTCOS1));
		row.add(_recset.get(ANAMAG_USER1).as_string(), sf.cid2index(F_USER1));
		row.add(_recset.get(ANAMAG_USER2).as_string(), sf.cid2index(F_USER2));
		row.add(_recset.get(ANAMAG_USER3).as_string(), sf.cid2index(F_USER3));
		row.add(_recset.get(ANAMAG_USER4).as_string(), sf.cid2index(F_USER4));
		row.add(_recset.get(ANAMAG_USER5).as_string(), sf.cid2index(F_USER5));
		row.add(_recset.get(ANAMAG_USER6).as_string(), sf.cid2index(F_USER6));
		row.add(_recset.get(ANAMAG_USER7).as_string(), sf.cid2index(F_USER7));
		row.add(_recset.get(ANAMAG_USER8).as_string(), sf.cid2index(F_USER8));
		row.add(_recset.get(ANAMAG_USER9).as_string(), sf.cid2index(F_USER9));
		row.add(_recset.get(ANAMAG_USER10).as_string(), sf.cid2index(F_USER10));
	}
}

void TArt_mask::next_page(int p)
{
	TAutomask::next_page(p);
	if (_filter_changed)
	{
		TSheet_field & sf = sfield(F_ARTICLES);
		if (curr_win() == sf.parent())
		{
			update_sheet();
			sf.force_update();
			_filter_changed = false;
		}
	}

}
bool TArt_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
	switch (o.dlg())
	{
		case F_GRMERC:
		case F_SGRMERC:
		case F_SCODART:
		case F_SDESART:
		case F_SDESAGG:
		case F_SCODFOR:
		case F_SRAGSOC:
			if (e == fe_modify)
				_filter_changed = true;
			break;
		case F_SET:
			if (e == fe_button)
			{
				TSheet_field& sf = sfield(F_ARTICLES);
				const int items = sf.items();
				bool select = true;
				const int cid = sf.cid2index(F_ATTIVO);
				int i ;

				for (i = 0; select && i < items; i++)
					select  = *sf.row (i).get(cid) <= ' ';

				const TString4 val(select ? "X" : " ");
				
				for (i = 0; i < items; i++)
					sf.row(i).add(val, cid);
				sf.force_update();
			}
			break;
		case F_ACTIVEONLY:
			if (e == fe_modify)
			{
        if (!field(F_USER).empty())
        {
    			update_sheet();
		    	sfield(F_ARTICLES).force_update();
        }
			}
			break;
		default:
			break;
	}
  return true;
}

class TRelArticoli_multirel_app : public TMultirel_application
{
	TArt_mask * _mask;

protected:
	virtual void get_mask_name(TString& tabname) const;
	//magico metodo per impedire la navigazione su tabelle diverse da quella corrente del cursore
	virtual bool has_filtered_cursor() const { return true; }
  virtual bool user_create();
  virtual bool user_destroy() ;
	virtual int read(TMask& m);
  virtual int rewrite(const TMask& m);
  virtual int write(const TMask& m) { return rewrite(m);}
  virtual bool remove();
  virtual void  init_insert_mode(TMask& m) { read(m); }
  virtual bool find(word key = 0);
	virtual TMask* get_mask(int mode = MODE_QUERY) { return (TMask *) _mask;}
  virtual const char* extra_modules() const { return "ba"; }
};

void TRelArticoli_multirel_app::get_mask_name(TString& tabname) const
{
	tabname = "ps0430100a";
}

bool TRelArticoli_multirel_app::user_create()
{
	bool ok = TMultirel_application::user_create();
	_mask = new TArt_mask;
	return ok;
}

bool TRelArticoli_multirel_app::user_destroy()
{
	delete _mask;
	return true;
}

int TRelArticoli_multirel_app::read(TMask& m)
{
	const TRectype & curr = get_relation()->lfile().curr();
	TArt_mask & mask = (TArt_mask &) m;
	
	mask.update_sheet();
  return NOERR;
}

int TRelArticoli_multirel_app::rewrite(const TMask& m)
{
	int err = NOERR;
	TSheet_field & sf = m.sfield(F_ARTICLES);
	TLocalisamfile multirel(LF_MULTIREL);
	const TString user(m.get(F_USER));
	
  for (int i = 0; i < sf.items(); i++)
  {
		TToken_string & row = sf.row(i);
		bool selected = *row.get(sf.cid2index(F_ATTIVO)) > ' ';

		multirel.zero();
		multirel.put(MULTI_COD, FILE_KEY);
		multirel.put(MULTI_FIRST, user);
		multirel.put(MULTI_SECOND, row.get(sf.cid2index(F_CODART)));
		bool exist = multirel.read(_isequal) == NOERR;

		if (exist && !selected)
			err = multirel.remove();
		else
			if (!exist && selected)
			{
				multirel.zero();
				multirel.put(MULTI_COD, FILE_KEY);
				multirel.put(MULTI_FIRST, user);
				multirel.put(MULTI_SECOND, row.get(sf.cid2index(F_CODART)));
				err = multirel.write();
			}
	}
	get_relation()->read(_isgteq);
	return err;
}

bool TRelArticoli_multirel_app::remove()
{
	int err;
	TLocalisamfile multirel(LF_MULTIREL);
	const TString user(get_mask(MODE_MOD)->get(F_USER));

	multirel.put(MULTI_COD, FILE_KEY);
	multirel.put(MULTI_FIRST, user);

  for (err = multirel.read(_isgteq); err == NOERR && user == multirel.get(MULTI_FIRST); multirel.next())
		err = multirel.remove();
	return err == NOERR || err == _iseof;
}

bool TRelArticoli_multirel_app::find(word key)
{
	bool ok = false;
	const TString& user = get_mask(MODE_QUERY)->get(F_USER);
	
	if (user.full())
	{
		TLocalisamfile multirel(LF_MULTIREL);

		multirel.put(MULTI_COD, FILE_KEY);
		multirel.put(MULTI_FIRST, user);
		ok = (multirel.read(_isgteq) == NOERR) && (user == multirel.get(MULTI_FIRST));
	}
	if (ok)
		get_relation()->read(_isgteq);
	return ok;
}

int ps0430100(int argc, char* argv[])
{
  TRelArticoli_multirel_app a;
  a.run(argc, argv, TR("Tabella"));
  return 0;
}