frappe.ui.form.on(cur_frm.doctype, {
	setup: function(frm) {
		frm.set_query("employee", function() {
			return {
				filters: {
					"status": "Active"
				}
			};
		});
	},
	onload: function(frm){
		if(frm.doc.__islocal){
			if(frm.doctype == "Employee Promotion"){
				frm.doc.promotion_details = [];
			}else if (frm.doctype == "Employee Transfer") {
				frm.doc.transfer_details = [];
			}
		}
	},
	employee: function(frm) {
		frm.add_fetch("employee", "company", "company");
	},
	refresh: function(frm) {
		var table;
		if(frm.doctype == "Employee Promotion"){
			table = "promotion_details";
		}else if (frm.doctype == "Employee Transfer") {
			table = "transfer_details";
		}
		if(!table){return;}
		cur_frm.fields_dict[table].grid.wrapper.find('.grid-add-row').hide();
		cur_frm.fields_dict[table].grid.add_custom_button(__('Add Row'), () => {
			if(!frm.doc.employee){
				frappe.msgprint(__("Please select Employee"));
				return;
			}
			frappe.call({
				method: 'erpnext.hr.utils.get_employee_fields_label',
				callback: function(r) {
					if(r.message){
						show_dialog(frm, table, r.message);
					}
				}
			});
		});
	}
});

var show_dialog = function(frm, table, field_labels) {
	var d = new frappe.ui.Dialog({
		title: "Update Property",
		fields: [
			{fieldname: "property", label: __('Select Property'), fieldtype:"Select", options: field_labels},
			{fieldname: "current", fieldtype: "Data", label:__('Current'), read_only: true},
			{fieldname: "field_html", fieldtype: "HTML"}
		],
		primary_action_label: __('Add to Details'),
		primary_action: () => {
			d.get_primary_btn().attr('disabled', true);
			if(d.data) {
				var input = $('[data-fieldname="field_html"] input');
				d.data.new = input.val();
				$(input).remove();
				add_to_details(frm, d, table);
			}
		}
	});
	d.fields_dict["property"].df.onchange = () => {
		let property = d.get_values().property;
		d.data.fieldname = property;
		if(!property){return;}
		frappe.call({
			method: 'erpnext.hr.utils.get_employee_field_property',
			args: {employee: frm.doc.employee, fieldname: property},
			callback: function(r) {
				if(r.message){
					d.data.current = r.message.value;
					d.data.property = r.message.label;
					d.fields_dict.field_html.$wrapper.html("");
					d.set_value('current', r.message.value);
					render_dynamic_field(d, r.message.datatype, r.message.options, property);
					d.get_primary_btn().attr('disabled', false);
				}
			}
		});
	};
	d.get_primary_btn().attr('disabled', true);
	d.data = {};
	d.show();
};

var render_dynamic_field = function(d, fieldtype, options, fieldname) {
	d.data.new = null;
	var dynamic_field = frappe.ui.form.make_control({
		df: {
			"fieldtype": fieldtype,
			"fieldname": fieldname,
			"options": options || ''
		},
		parent: d.fields_dict.field_html.wrapper,
		only_input: false
	});
	dynamic_field.make_input();
	$(dynamic_field.label_area).text(__("New"));
};

var add_to_details = function(frm, d, table) {
	let data = d.data;
	if(data.fieldname){
		if(validate_duplicate(frm, table, data.fieldname)){
			frappe.show_alert({message:__("Property already added"), indicator:'orange'});
			return false;
		}
		if(data.current == data.new){
			frappe.show_alert({message:__("Nothing to change"), indicator:'orange'});
			d.get_primary_btn().attr('disabled', false);
			return false;
		}
		frm.add_child(table, {
			fieldname: data.fieldname,
			property: data.property,
			current: data.current,
			new: data.new
		});
		frm.refresh_field(table);
		d.fields_dict.field_html.$wrapper.html("");
		d.set_value("property", "");
		d.set_value('current', "");
		frappe.show_alert({message:__("Added to details"),indicator:'green'});
		d.data = {};
	}else {
		frappe.show_alert({message:__("Value missing"),indicator:'red'});
	}
};

var validate_duplicate =  function(frm, table, fieldname){
	let duplicate = false;
	$.each(frm.doc[table], function(i, detail) {
		if(detail.fieldname === fieldname){
			duplicate = true;
			return;
		}
	});
	return duplicate;
};