#include <applicat.h>
#include <automask.h>
#include <defmask.h>
#include <relation.h>
#include <reprint.h>

#include "ps0872.h"
#include "ps0872200a.h"

class TReportPs08722 : public TReport
{
protected:
  virtual bool get_usr_val(const TString& name, TVariant& var) const;
};

class TMaskPs08722 : public TAutomask
{
  TCursor_sheet  * _sht;
  TCursor        * _cur;
	TReport        _rep;
	bool           _select_changed;

protected:
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
	void update_sheet();

public:
	TCursor_sheet & sheet() const { return *_sht;}
  TMaskPs08722();
  virtual ~TMaskPs08722();
};

TMaskPs08722::TMaskPs08722()
             : TAutomask("ps0872200a"), _sht(NULL), _cur(NULL)
{
  // crea relazioni, cursori e cursor_sheets
	update_sheet();
	((TButton_field&) field(DLG_SELECT)).set_exit_key(0);
	_select_changed = false;
}

TMaskPs08722::~TMaskPs08722()
{  
	if (_sht != NULL)
		delete _sht;
}             

bool TMaskPs08722::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
	const int id = o.dlg();
	switch (id)
	{
		case F_NUM:
		case F_DACLI:
		case F_DAL:
			if (e == fe_modify)
				_select_changed = true;
			break;
		case F_ACLI:
			if (e == fe_close)
			{
				const long dacli = o.mask().get_long(F_DACLI);
				const long acli = atol(o.get());
				
				if (acli > 0  && acli < dacli)
					return error_box("Inserire un codice cliente maggiore o uguale a quello iniziale");
			}
			else 
				if (e == fe_modify)
					_select_changed = true;
			break;
		case F_AL:
			if (e == fe_close)
			{
				const TDate dal(o.mask().get_date(F_DAL));
				const TDate al(o.get());
				
				if (al.ok() && al < dal)
					return error_box("Inserire una data maggiore o uguale alla data iniziale");
			}
			else 
				if (e == fe_modify)
					_select_changed = true;
			break;
		case F_REPORT:
			if (e == fe_modify)
				enable(DLG_SELECT, _sht != NULL && o.get() == "StampaSchedProd");
			break;
		case DLG_SELECT:
			if (e == fe_button)
			{
				if (_select_changed)
					update_sheet();
				_select_changed = false;
				_sht->run();
			}
			break;
		default:
			break;
	}
  return TRUE;
}

void TMaskPs08722::update_sheet()
{
	
	if (_sht != NULL)
	{
		delete _sht;
		_sht = NULL;
	}
	else
	{
		TFilename name("StampaSchedProd.rep");

		name.custom_path();
		_rep.load(name);
	}
	
	TISAM_recordset * r = (TISAM_recordset *) _rep.recordset();

	if (r != NULL)
	{
		TVariant var;

		var = get(F_NUM);
		r->set_var("#NUM", var);
		var = get(F_DACLI);
		r->set_var("#DACLI", var);
		var = get(F_ACLI);
		r->set_var("#ACLI", var);
		var = get_date(F_DAL);
		if (!var.as_date().ok())
			var = botime;
		r->set_var("#DAL", var);
		var = get_date(F_AL);
		if (!var.as_date().ok())
			var = eotime;
		r->set_var("#AL", var);
		var = "F";
		r->set_var("#F", var);
	}
	_select_changed = false;
	_sht = new TCursor_sheet(r->cursor(), " |33->DATADOC|NDOC|CODARTMAG|20->RAGSOC", "Selezione clienti per codice",
		                                    "@1|Data@10|Numero|Articolo@20|Ragione Sociale@50",0,1);
	_sht->check(-1);
}

class TStampaProduzionePs0872 : public TSkeleton_application  
{
  TMaskPs08722 * _mask;
	virtual bool check_autorization() const {return false;}
  virtual const char * extra_modules() const {return "ve";}


protected:
  virtual void main_loop();
  virtual bool create();

public:
  const TMaskPs08722 & mask() const {return *_mask;}
  virtual ~TStampaProduzionePs0872();
};

void TStampaProduzionePs0872::main_loop()
{
  while (_mask->run() == K_ENTER)
  {
	  TReport_book book;
    TReportPs08722 rep; 
		TFilename report_name(_mask->get(F_REPORT));

		report_name.ext("rep");
		report_name.custom_path();
    if (rep.load(report_name))
		{
	    TRecordset * r = rep.recordset();

      if (r != NULL)
			{
				TVariant var;

				var = _mask->get(F_NUM);
				r->set_var("#NUM", var);
				var = _mask->get(F_DACLI);
				r->set_var("#DACLI", var);
				var = _mask->get(F_ACLI);
				r->set_var("#ACLI", var);
				var = _mask->get_date(F_DAL);
				if (!var.as_date().ok())
					var = botime;
				r->set_var("#DAL", var);
				var = _mask->get_date(F_AL);
				if (!var.as_date().ok())
					var = eotime;
				r->set_var("#AL", var);
				var = "F";
				r->set_var("#F", var);
			}
			book.add(rep);
		  if (book.pages() > 0)
			  book.print_or_preview();
		}
  }
}

bool TStampaProduzionePs0872::create()
{
	_mask = new TMaskPs08722;
	return TSkeleton_application:: create();
}

TStampaProduzionePs0872::~TStampaProduzionePs0872()
{
	delete _mask;
}

TStampaProduzionePs0872 & app() { return (TStampaProduzionePs0872&) main_app();}

bool TReportPs08722::get_usr_val(const TString& name, TVariant& var) const
{
	if (name == "#TO_PRINT")
	{
		TISAM_recordset * r = (TISAM_recordset *) recordset();
		const long pos = r->cursor()->pos();

		var = (long) (app().mask().sheet().checked(pos) ? 1 : 0);
		return true;
	}
	return TReport::get_usr_val(name, var);
}

int ps0872200(int argc, char* argv[])
{
  TStampaProduzionePs0872 a;
  a.run(argc, argv, "Stampa Produzione RealPlast");
  return 0;
}