// 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 3 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, see <http://www.gnu.org/licenses/>.

erpnext.AccountTreeGrid = wn.views.TreeGridReport.extend({
	init: function(wrapper, title) {
		this._super({
			title: title,
			page: wrapper,
			parent: $(wrapper).find('.layout-main'),
			appframe: wrapper.appframe,
			doctypes: ["Company", "Fiscal Year", "Account", "GL Entry", "Cost Center"],
			tree_grid: {
				show: true, 
				parent_field: "parent_account", 
				formatter: function(item) {
					return repl('<a href="#general-ledger/account=%(enc_value)s">%(value)s</a>', {
							value: item.name,
							enc_value: encodeURIComponent(item.name)
						});
				}
			},
		});
	},
	setup_columns: function() {
		this.columns = [
			{id: "name", name: "Account", field: "name", width: 300, cssClass: "cell-title", 
				formatter: this.tree_formatter},
			{id: "opening_debit", name: "Opening (Dr)", field: "opening_debit", width: 100,
				formatter: this.currency_formatter},
			{id: "opening_credit", name: "Opening (Cr)", field: "opening_credit", width: 100,
				formatter: this.currency_formatter},
			{id: "debit", name: "Debit", field: "debit", width: 100,
				formatter: this.currency_formatter},
			{id: "credit", name: "Credit", field: "credit", width: 100,
				formatter: this.currency_formatter},
			{id: "closing_debit", name: "Closing (Dr)", field: "closing_debit", width: 100,
				formatter: this.currency_formatter},
			{id: "closing_credit", name: "Closing (Cr)", field: "closing_credit", width: 100,
				formatter: this.currency_formatter}
		];

	},
	filters: [
		{fieldtype:"Select", label: "Company", link:"Company", default_value: "Select Company...",
			filter: function(val, item, opts, me) {
				if (item.company == val || val == opts.default_value) {
					return me.apply_zero_filter(val, item, opts, me);
				}
				return false;
			}},
		{fieldtype:"Select", label: "Fiscal Year", link:"Fiscal Year", 
			default_value: "Select Fiscal Year..."},
		{fieldtype:"Date", label: "From Date"},
		{fieldtype:"Label", label: "To"},
		{fieldtype:"Date", label: "To Date"},
		{fieldtype:"Button", label: "Refresh", icon:"icon-refresh icon-white", cssClass:"btn-info"},
		{fieldtype:"Button", label: "Reset Filters"}
	],
	setup_filters: function() {
		this._super();
		var me = this;
		// default filters
		this.filter_inputs.fiscal_year.change(function() {
			var fy = $(this).val();
			$.each(wn.report_dump.data["Fiscal Year"], function(i, v) {
				if (v.name==fy) {
					me.filter_inputs.from_date.val(dateutil.str_to_user(v.year_start_date));
					me.filter_inputs.to_date.val(dateutil.str_to_user(v.year_end_date));
				}
			});
			me.set_route();
		});
		me.show_zero_check()
	},
	prepare_data: function() {
		var me = this;
		if(!this.primary_data) {
			// make accounts list
			me.data = [];
			me.parent_map = {};
			me.item_by_name = {};

			$.each(wn.report_dump.data["Account"], function(i, v) {
				var d = copy_dict(v);

				me.data.push(d);
				me.item_by_name[d.name] = d;
				if(d.parent_account) {
					me.parent_map[d.name] = d.parent_account;
				}
			});
			
			me.primary_data = [].concat(me.data);
		}
		
		me.data = [].concat(me.primary_data);
		$.each(me.data, function(i, d) {
			me.init_account(d);
		});
		
		this.set_indent();
		this.prepare_balances();
		
	},
	init_account: function(d) {
		this.reset_item_values(d);	
	},

	prepare_balances: function() {
		var gl = wn.report_dump.data['GL Entry'];
		var me = this;

		this.opening_date = dateutil.user_to_obj(this.filter_inputs.from_date.val());
		this.closing_date = dateutil.user_to_obj(this.filter_inputs.to_date.val());
		this.set_fiscal_year();
		if (!this.fiscal_year) return;

		$.each(this.data, function(i, v) {
			v.opening_debit = v.opening_credit = v.debit 
				= v.credit = v.closing_debit = v.closing_credit = 0;
		});

		$.each(gl, function(i, v) {
			var posting_date = dateutil.str_to_obj(v.posting_date);
			var account = me.item_by_name[v.account];
			me.update_balances(account, posting_date, v)
		});

		this.update_groups();
	},
	update_balances: function(account, posting_date, v) {
		// opening
		if (posting_date < this.opening_date || v.is_opening === "Yes") {
			if (account.is_pl_account === "Yes" && 
				posting_date <= dateutil.str_to_obj(this.fiscal_year[1])) {
				// balance of previous fiscal_year should 
				//	not be part of opening of pl account balance
			} else {
				if(account.debit_or_credit=='Debit') {
					account.opening_debit += (v.debit - v.credit);
				} else {
					account.opening_credit += (v.credit - v.debit);
				}
			}
		} else if (this.opening_date <= posting_date && posting_date <= this.closing_date) {
			// in between
			account.debit += v.debit;
			account.credit += v.credit;
		}
		// closing
		if(account.debit_or_credit=='Debit') {
			account.closing_debit = account.opening_debit + account.debit - account.credit;
		} else {
			account.closing_credit = account.opening_credit - account.debit + account.credit;
		}
	},
	update_groups: function() {
		// update groups
		var me= this;
		$.each(this.data, function(i, account) {
			// update groups
			if(account.rgt - account.lft == 1) {
				var parent = me.parent_map[account.name];
				while(parent) {
					var parent_account = me.item_by_name[parent];
					$.each(me.columns, function(c, col) {
						if (col.formatter == me.currency_formatter) {
							parent_account[col.field] = 
								flt(parent_account[col.field])
								+ flt(account[col.field]);
						}
					});
					parent = me.parent_map[parent];
				}				
			}
		});		
	},

	set_fiscal_year: function() {
		if (this.opening_date > this.closing_date) {
			msgprint("Opening Date should be before Closing Date");
			return;
		}

		this.fiscal_year = null;
		var me = this;
		$.each(wn.report_dump.data["Fiscal Year"], function(i, v) {
			if (me.opening_date >= dateutil.str_to_obj(v.year_start_date) && 
				me.closing_date <= dateutil.str_to_obj(v.year_end_date)) {
					me.fiscal_year = v;
				}
		});

		if (!this.fiscal_year) {
			msgprint("Opening Date and Closing Date should be within same Fiscal Year");
			return;
		}
	},
});