// ERPNext - web based ERP (http://erpnext.com)
// Copyright (C) 2012 Web Notes Technologies Pvt Ltd
// 
// 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/>.

// searches for enabled profiles
erpnext.utils.profile_query = function() {
	return "select name, concat_ws(' ', first_name, middle_name, last_name) \
		from `tabProfile` where ifnull(enabled, 0)=1 and docstatus < 2 and \
		name not in ('Administrator', 'Guest') and (%(key)s like \"%s\" or \
		concat_ws(' ', first_name, middle_name, last_name) like \"%%%s\") \
		order by \
		case when name like \"%s%%\" then 0 else 1 end, \
		case when concat_ws(' ', first_name, middle_name, last_name) like \"%s%%\" \
			then 0 else 1 end, \
		name asc limit 50";
};

// searches for active employees
erpnext.utils.employee_query = function() {
	return "select name, employee_name from `tabEmployee` \
		where status = 'Active' and docstatus < 2 and \
		(%(key)s like \"%s\" or employee_name like \"%%%s\") \
		order by \
		case when name like \"%s%%\" then 0 else 1 end, \
		case when employee_name like \"%s%%\" then 0 else 1 end, \
		name limit 50";
};

// searches for leads which are not converted
erpnext.utils.lead_query = function() {
	return "select name, lead_name, company_name from `tabLead` \
		where docstatus < 2 and ifnull(status, '') != 'Converted' and \
		(%(key)s like \"%s\" or lead_name like \"%%%s\" or company_name like \"%%%s\") \
		order by \
		case when name like \"%s%%\" then 0 else 1 end, \
		case when lead_name like \"%s%%\" then 0 else 1 end, \
		case when company_name like \"%s%%\" then 0 else 1 end, \
		lead_name asc limit 50";
};

// searches for customer
erpnext.utils.customer_query = function() {
	if(sys_defaults.cust_master_name == "Customer Name") {
		var fields = ["name", "customer_group", "country", "territory"];
	} else {
		var fields = ["name", "customer_name", "customer_group", "country", "territory"];
	}
	
	return "select " + fields.join(", ") + " from `tabCustomer` where docstatus < 2 and \
		(%(key)s like \"%s\" or customer_name like \"%%%s\") \
		order by \
		case when name like \"%s%%\" then 0 else 1 end, \
		case when customer_name like \"%s%%\" then 0 else 1 end, \
		name, customer_name limit 50";
};

// searches for supplier
erpnext.utils.supplier_query = function() {
	if(sys_defaults.supp_master_name == "Supplier Name") {
		var fields = ["name", "supplier_type"];
	} else {
		var fields = ["name", "supplier_name", "supplier_type"];
	}
	
	return "select " + fields.join(", ") + " from `tabSupplier` where docstatus < 2 and \
		(%(key)s like \"%s\" or supplier_name like \"%%%s\") \
		order by \
		case when name like \"%s%%\" then 0 else 1 end, \
		case when supplier_name like \"%s%%\" then 0 else 1 end, \
		name, supplier_name limit 50";
};

wn.provide("erpnext.queries");

erpnext.queries.get_conditions = function(doctype, opts) {
	conditions = [];
	if (opts) {
		$.each(opts, function(key, val) {
			var lhs = "`tab" + doctype + "`.`" + key + "`";
			
			if(key.indexOf(doctype)!=-1) {
				// with function
				lhs = key;
			}
			
			if (esc_quotes(val).charAt(0) != "!")
				conditions.push(lhs + "='"+esc_quotes(val)+"'");
			else
				conditions.push(lhs + "!='"+esc_quotes(val).substr(1)+"'");
		});
	}
	return conditions;
}

erpnext.queries.account = function(opts) {
	if(!opts) 
		opts = {};
	if(!opts.group_or_ledger) 
		opts.group_or_ledger = "Ledger";
		
	var conditions = erpnext.queries.get_conditions("Account", opts);
	
	return 'SELECT tabAccount.name, tabAccount.parent_account, tabAccount.debit_or_credit \
		FROM tabAccount \
		WHERE tabAccount.docstatus!=2 \
		AND tabAccount.%(key)s LIKE "%s" ' + (conditions 
			? (" AND " + conditions.join(" AND "))
			: "")
		+ " LIMIT 50"
}

erpnext.queries.item = function(opts) {
	var conditions = erpnext.queries.get_conditions("Item", opts);
	
	return 'SELECT tabItem.name, \
		if(length(tabItem.item_name) > 40, \
			concat(substr(tabItem.item_name, 1, 40), "..."), item_name) as item_name, \
		if(length(tabItem.description) > 40, \
			concat(substr(tabItem.description, 1, 40), "..."), description) as decription \
		FROM tabItem \
		WHERE tabItem.docstatus!=2 \
		AND (ifnull(`tabItem`.`end_of_life`,"") in ("", "0000-00-00") \
			OR `tabItem`.`end_of_life` > NOW()) \
		AND tabItem.%(key)s LIKE "%s" ' + (conditions 
			? (" AND " + conditions.join(" AND "))
			: "")
		+ " LIMIT 50"
}

erpnext.queries.item_std = function() {
	return 'SELECT tabItem.name, \
		if(length(tabItem.item_name) > 40, \
			concat(substr(tabItem.item_name, 1, 40), "..."), item_name) as item_name, \
		if(length(tabItem.description) > 40, \
			concat(substr(tabItem.description, 1, 40), "..."), description) as decription \
		FROM tabItem \
		WHERE tabItem.docstatus!=2 \
		AND tabItem.%(key)s LIKE "%s" LIMIT 50';
}

erpnext.queries.bom = function(opts) {
	var conditions = erpnext.queries.get_conditions("BOM", opts);
	
	return 'SELECT tabBOM.name, tabBOM.item \
		FROM tabBOM \
		WHERE tabBOM.docstatus=1 \
		AND tabBOM.is_active=1 \
		AND tabBOM.%(key)s LIKE "%s" ' + (conditions.length 
			? (" AND " + conditions.join(" AND "))
			: "")
		+ " LIMIT 50"

}