// 예문 목록(검색용)
var examples = new Array();

$(document).ready(function() {
	// 고객사 목록
	fncRetrieveOprMng($("#custCode"));

	$("#custCode").on('change', function() {
		fncRetrieveOprMng($(this));
	});

	// Datatable 초기화
	var opts = {
		columns: [
			{ data: "groupName" },
			{ data: "parameterCnt" },
			{ data: "intentName" },
			{ data: '' }
		],
		columnDefs: [{
			"defaultContent": "-",
			"targets": "_all",
			"className": "center"
		},
		{
			targets: 3,
			render: function(data, type, row) {
				return '<a href="#" class="btn grey" data-role="deleteIntent" data-seq="' + row.seq + '">삭제</a>';
			}
		}
		],
		createdRow: function(row, data, index) {
			$(row).addClass("modalLoad");
			$(row).attr("rel", "slot_update_modal");
		},
		drawCallback: function(settings) {
			// scripts.js : 조회list modal 연결
			modalUi();
		}
	}

	$.utils.dataTable.init('/admin/conversation/slot/search.do', opts);

	// 초기 리스트 조회
	search();

	// 인텐트명 리스트 초기화
	initIntentList();

	// 검색
	$("[data-role=search]").click(function() {
		search();
	});

	// 수정 조회 데이터
	$("#resultTable").DataTable().on('select.dt', function(e, dt, type, indexes) {
		var rowData = $("#resultTable").DataTable().row(indexes).data();

		$.ajax({
			url: '/admin/conversation/slot/examples.do',
			data: { masterSeq: rowData.seq },
			success: function(d) {

				$("#slot_update_modal .paramList > tbody").html('');
				$("#slot_update_modal").find("input[name=groupName]").val(rowData.groupName);
				$("#slot_update_modal").find("input[name=groupNameOrigin]").val(rowData.groupName);
				$("#slot_update_modal").find("input[name=seq]").val(rowData.seq);
				$("#slot_update_modal").find("input[name=originalName]").val(rowData.intentName);
				parameters = d.list;
				renderModal("slot_update_modal", parameters);
				initIntentList(rowData.intentName);

			}
		});
	});

	// 슬롯그룹 명 중복체크
	$("input[name=groupName]").on('change keyup', function() {
		var modal = $(this).parents(".modal");
		var gNO = $("input[name=groupNameOrigin]").val()
		if ($(this).isNotBlank() && gNO != $(this).val()) {
			var groupName = $(this).val();

			$.ajax({
				url: "/admin/conversation/slot/check.do",
				data: { groupName: groupName.trim() },
				success: function(d) {
					if (!d.result) {
						var originalName = modal.find("input[name=originalName]");

						// 기존 이름으로 다시 바꾼 경우 텍스트 노출 안함
						if ($.utils.isNotBlank(originalName) && originalName.val() == groupName) {
							modal.find(".err-text").hide();
						} else {
							modal.find(".err-text").show();
						}
					} else {
						modal.find(".err-text").hide();
					}
				}
			});
		} else {
			modal.find(".err-text").hide();
		}
	});

	// 파라미터 추가버튼 활성 비활성
	$("input[name=addParamId]").keyup(function(e) {
		var btn = $(this).parents().find("button[data-role=addParameter]");
		if ($(this).isBlank()) {
			btn.addClass("disabled");
			btn.attr("disabled", true);
		} else {
			btn.removeClass("disabled");
			btn.attr("disabled", false);
			if (e.keyCode == 13) {
				btn.click();
			}
		}
	});

	// 파라미터 추가
	$("button[data-role=addParameter]").click(function() {
		var tr = $(this).closest('tr');
		var modal = $(this).parents(".modal");
		var modalId = modal.attr("id");
		var addParamId = modal.find("input[name=addParamId]");
		var selectType = $(tr).find("select[name=entityType]");
		var selectName = $(tr).find("select[name=entityName]");

		if (addParamId.isNotBlank() ) {
			if(selectName.val() != ''){
				var obj = new Object();
				obj.paramName = addParamId.val();
				obj.entityType = selectType.val();
				obj.entitySeq = selectName.val();
				obj.entityName = selectName.val();
	
				var tdArr = new Array();
				var td = modal.find('.paramList input[name=paramId]')
				td.each(function(i) {
					tdArr.push(td.eq(i).val());
				});
				
				var addValue = modal.find("input[name=addParamId]").val();
				
				// console.log(tdArr);
				// console.log(addValue);
				if (tdArr.includes(addValue)) {
					$.utils.warning("중복된 파라미터ID가 있습니다.");
					return false;
				} else {
					addParameter("I", modalId, obj);
					addParamId.val('');
					addParamId.trigger("keyup");
					selectType.val('').niceSelect('update');
					selectName.val('').niceSelect('update');
				
				}
				
			}else{
				$.utils.warning("엔티티명을 입력하세요.");
				return false;
				
			}
			
		}
	});

	// 예문 삭제
	$(document).on("click", "button[data-role=deleteParam]", function() {
		var tr = $(this).closest('tr');
		var seq = tr.attr('data-seq');

		save_example("D", seq, null); 	// 2022.06..28 단건 추가로 수정
		tr.remove();
		/*
		if (seq != null && seq != '') {
			tr.find('input[name=useYn]').val('N');
			tr.hide();
		} else {
			tr.remove();
		}
		*/
	});


	// 슬롯 수정
	$("button[data-role=update]").click(function() {
		updateSlot();
	});

	// 슬롯 등록
	$("button[data-role=enroll]").click(function() {
		insertSlot();
	});

	// 인텐트 삭제
	$(document).on("click", "a[data-role=deleteIntent]", function(e) {
		var data = $(this).data();

		swal("삭제요청", "삭제하시겠습니까?", "info", {
			buttons: ["취소", "삭제"],
		}).then(function(ok) {
			if (ok) {
				$.ajax({
					url: '/admin/conversation/slot/delete.do',
					type: 'POST',
					data: data,
					success: function(d) {
						if (d.result) {
							$.utils.success(d.message);
							search();
						} else {
							$.utils.error(d.message);
						}
					}
				});
			}
		});
	});
});


function fncRetrieveOprMng(e) {
	$('#oprMngName').empty();
	var param = "custCode=" + e.val();

	$.ajax({
		type: "post",
		async: false,
		datatype: "text",
		url: "/admin/retrieveOprMng.do",
		data: param,
		success: function(data) {

			$.each(data.nMap, function(i, val) {
				$('#oprMngName').append("<option value=" + val.oprMngCode + ">" + val.oprMngName + "</option>");
			});

			$('#oprMngName').niceSelect('update');
		}
	});
}


// 리스트 검색
function search() {
	$.utils.dataTable.getListData({
		oprMngCode: $("select[name=oprMngCode] ").val(),
		intentName: $("select[name=intentName]").val()
	}, function(d) {
		initIntentList();
		// console.log($("select[name=oprMngCode] ").val());
		// console.log('result', d)
		$("#resultTable").renderTable(d.list);
	});
}




function fncaddSlotbtn() {
	var modal = $(this).parents(".modal");
	//modal.find("select[name=entityType]").niceSelect();

	var selIntentName = $('#selIntentName');
	// console.log(selIntentName.val());
	selIntentName.val("")
	selIntentName.niceSelect('update');
}


function initmytable(ele) {
	var modal = $(ele).parents(".modal");
	var modalId = modal.attr("id");

	var enrollmodal = $('#slot_enroll_modal');

	var groupName = enrollmodal.find("input[name=groupName]");
	var intentName = enrollmodal.find("select[name=intentName]");


	if (modalId == 'slot_enroll_modal') {
		$(`#${modalId} .paramList > tbody tr`).remove();
		var tr = `<tr class="noData"><td colspan="4">
		<div style="text-align:center;">등록된 파라미터가 없습니다.</div>
		</td></tr>`;
		$(`#${modalId} .paramList > tbody`).append(tr);
		// console.log(modalId);

		$("#slot_enroll_modal").find(".insert_step1").prop("disabled", false);
		$("#slot_enroll_modal").find(".insert_step2").css("display", "none");
		// console.log(intentName.val());
		// console.log(groupName.val());


		groupName.val("");
		intentName.val("");


	}
}

// 모달 파라미터 로드
function renderModal(modalId, d) {
	var tbody = $(`#${modalId} .paramList > tbody`)
	tbody.html('');
	if (d.length > 0) {
		for (var i in d) {
			addParameter("U", modalId, d[i])
		}
	} else {
		var tr = `<tr class="noData"><td colspan="4">
		<div style="text-align:center;">등록된 파라미터가 없습니다.</div>
		</td></tr>`;
		tbody.append(tr);
	}
}

// 파라미터 목록 추가하기
function addParameter(sqlType, modalId, v) {

	$(`#${modalId} .paramList .noData`).remove();

	var seq = v.seq != null ? v.seq : "";
	var tr = $('<tr>').attr("data-seq", seq);

	var td1 = `<td class="center">
	<input type="text" value="${v.paramName}" name="paramId" disabled>
	<input type="hidden" name="useYn" value="Y">
	</td>`;

	var td2 = `<td class="center"><div class="sel_box">
	<select class="wide" name="entityType" onchange="initEntityName(this)" disabled>
	</select>
	</div></td>`;

	var td3 = `<td class="center"><div class="sel_box" id="">
	<select class="wide" name="entityName" disabled>
	<option value="${v.entitySeq}">${v.entityName} </option>
	</select>
	</div></td>`;

	var td4 = `<td class="center"><button type="button" class="btn" data-role="deleteParam">삭제</button></td>`;

	tr.append(td1);
	tr.append(td2);
	tr.append(td3);
	tr.append(td4);
	$(`#${modalId} .paramList > tbody`).append(tr);

	var selectType = tr.find('select[name=entityType]').get(0);
	initEntityType(selectType, v);
	initEntityName(selectType);
	/*initIntentList()*/

	if (sqlType == "I") {
		var paramList = [];
		v.paramId = v.paramName;
		paramList.push(v);     				 	// 단건저장
		save_example("I", modalId, paramList); 	// 2022.06..28 단건 추가로 수정
	}
}


// 엔티티 타입 초기화
function initEntityType(ele, val) {
	var value = val.entityType;
	var option = [
		{ value: '', text: '전제' },
		{ value: 'A', text: '시스템엔티티' },
		{ value: 'B', text: '동의어' },
		{ value: 'C', text: '사전' },
	];

	$(ele).html('');
	for (var i in option) {
		var selected = value == option[i].value ? 'selected' : ''
		var html = `<option value="${option[i].value}" ${selected}>${option[i].text}</option>`;
		$(ele).append(html);
	}

	$(ele).niceSelect();
}

// 네임 초기화
function initEntityName(ele) {
	var tr = ele.closest('tr');
	var entityType = ele.value;
	var selectEntityName = $(tr).find('select[name=entityName]');
	var val = Number(selectEntityName.val());

	selectEntityName.html('<option value="">엔티티명을 선택하세요.</option>');
	selectEntityName.niceSelect("update");

	if (entityType != '') {
		$.ajax({
			url: '/admin/conversation/slot/entityName.do',
			type: "GET",
			data: {
				oprMngCode: $("select[name=oprMngCode]").val(),
				entityType: entityType
			},
			success: function(d) {
				var list = d.categoryList;
				for (var i in list) {
					var selected = val == list[i].seq ? 'selected' : ''
					var item = list[i];
					var option = `<option value="${item.seq}" ${selected}> ${item.entityName}</option>`;
					selectEntityName.append(option);
				}
				selectEntityName.niceSelect();
				selectEntityName.niceSelect("update");

			}
		});
	} else {
		selectEntityName.niceSelect("update");
	}
}

// 인텐트명 리스트 초기화
function initIntentList(selected) {
	var intentName = selected;
	$.ajax({
		url: '/admin/conversation/slot/intentList.do',
		type: "GET",
		data: { oprMngCode: $("select[name=oprMngCode]").val() },
		success: function(d) {
			var list = d.categoryList;
			var html = '<option value="">전 체</option>';

			for (var i in list) {
				var item = list[i];

				var selected = intentName == list[i].intentName ? 'selected' : ''

				if (selected == undefined || selected == '') {
					html += `<option value="${item.intentSeq}"> ${item.intentName} </option>`;
				} else {
					html += `<option value="${item.intentSeq}"${selected}> ${item.intentName} </option>`;
				}


			}


			if (intentName == undefined || intentName == '') {
				$("select[name=intentName]").html(html);
				$("select[name=intentName]").niceSelect('update');
			} else {
				$('#slot_update_modal').find("select[name=intentName]").html(html);
				$('#slot_update_modal').find("select[name=intentName]").niceSelect('update');
			}

		}
	});
}



// 슬롯 등록하기
function insertSlot() {
	// 기본 인텐트 데이터

	// console.log("insert");
	var modal = $('#slot_enroll_modal');
	var seq = modal.find("input[name=seq]");
	var oprMngCode = $("select[name=oprMngCode]");
	var groupName = modal.find("input[name=groupName]");
	var intentSeq = modal.find("select[name=intentName]");
	// console.log(modal.find('.err-text').css("display"))


	if (oprMngCode.isBlank()) {
		$.utils.warning("서비스를 선택해주세요.");
		return false;
	}
	if (groupName.isBlank()) {
		$.utils.warning("슬롯 그룹명을 입력해주세요.");
		return false;
	}

	if (groupName.isBlank()) {
		$.utils.warning("슬롯 그룹명을 입력해주세요.");
		return false;
	}

	if (modal.find('.err-text').css("display") != 'none') {
		$.utils.warning("중복된 슬롯 그룹명 입니다.");

		return false;
	}
	if (intentSeq.isBlank()) {
		$.utils.warning("인텐트 명을 선택해주세요.");
		return false;
	}

	// 인텐트 예문 데이터
	var paramList = new Array();

	/* 2022.06.28 단건 수정으로 변경
		var tr = modal.find('.paramList > tbody tr');
		tr.each(function() {
			var obj = {
				seq: $(this).attr("data-seq"),
				paramId: $(this).find('input[name=paramId]').val(),
				entityType: $(this).find('select[name=entityType]').val(),
				entityName: $(this).find('select[name=entityName]').val()
			};

			if (obj.paramId != '' && obj.paramId != null) {
				paramList.push(obj);
			}
		});
	*/

	// 전송 데이터
	var data = {
		Seq: seq.val(),
		groupName: groupName.val(),
		oprMngCode: oprMngCode.val(),
		intentSeq: intentSeq.val(),
		paramList: paramList
	};

	// console.log(data);

	$.ajax({
		url: '/admin/conversation/slot/insert.do',
		type: "POST",
		data: JSON.stringify(data),
		contentType: "application/json",
		success: function(d) {
			if (d.result) {
				search();
				$.utils.success(d.message);

				/* 2022.06.28 단건 수정으로 변경
					modal.find(".close").click();
					modal.find('.paramList > tbody').empty();
				*/

				// 2022.06.28 먼저 저장한 후에 하단 예문 등록함  slot_enroll_modal

				$("#slot_enroll_modal").find(".insert_step1").prop("disabled", true);
				$("#slot_enroll_modal").find(".insert_step2").css("display", "");
				$("#slot_enroll_modal").css("margin-top", "-350px");
				
		
				var seq = d.seq;
				$("#slot_enroll_modal").find("seq").val(seq);

			} else {
				$.utils.error(d.message);
			}
		}
	});
}

// 슬롯 업데이트 하기
function updateSlot() {
	// console.log("update");

	var modal = $('#slot_update_modal');

	// 기본 인텐트 데이터
	var seq = modal.find("input[name=seq]");
	var oprMngCode = $("select[name=oprMngCode]");
	var groupName = modal.find("input[name=groupName]");
	var intentSeq = modal.find("select[name=intentName]");

	if (oprMngCode.isBlank()) {
		$.utils.warning("서비스를 선택해주세요.");
		return false;
	}
	/*if (groupName.isBlank()) {
		$.utils.warning("슬롯 그룹명을 입력해주세요.");
		return false;
	}*/
	if (modal.find('.err-text').css("display") != "none") {
		$.utils.warning("중복된 슬롯 그룹명 입니다.");
	}

	if (intentSeq.isBlank()) {
		$.utils.warning("인텐트 명을 선택해주세요.");
		return false;
	}

	// 인텐트 예문 데이터
	var tr = modal.find('.paramList > tbody tr');
	var paramList = new Array();

	/* 2022.06.28 단건 수정
		tr.each(function() {
			var obj = {
				seq: $(this).attr("data-seq"),
				paramId: $(this).find('input[name=paramId]').val(),
				entityType: $(this).find('select[name=entityType]').val(),
				entityName: $(this).find('select[name=entityName]').val(),
				useYn: $(this).find('input[name=useYn]').val(),
			};

			if (obj.paramId != '' && obj.paramId != null) {
				paramList.push(obj);
			}
		});
	*/

	// 전송 데이터
	var data = {
		seq: seq.val(),
		/*masterSeq: seq.val(),
		intentSeq: seq.val(),*/
		groupName: groupName.val(),
		oprMngCode: oprMngCode.val(),
		intentSeq: intentSeq.val(),
		paramList: paramList
	};

	// console.log(data);

	$.ajax({
		url: '/admin/conversation/slot/update.do',
		type: "POST",
		data: JSON.stringify(data),
		contentType: "application/json",
		success: function(d) {
			if (d.result) {
				search();
				$.utils.success(d.message);
			} else {
				$.utils.error(d.message);
			}
		}
	});
}

// 슬롯 파라미터 단건 저장 2022.06.28 추가
function save_example(saveType, modalId, paramList) {
	var data = {}
	if (saveType == "I") {
		var modal = $("#" + modalId);
		var seq = modal.find("input[name=seq]");
		var oprMngCode = $("select[name=oprMngCode]");
		var groupName = modal.find("input[name=groupName]");
		var intentSeq = modal.find("select[name=intentName]");
		
		// console.log(modal.selector);

		var data = {
			masterSeq: seq.val(),
			intentSeq: seq.val(),
			groupName: groupName.val(),
			oprMngCode: oprMngCode.val(),
			intentSeq: intentSeq.val(),
			paramList: paramList,
			saveType: saveType
		};

	} else if (saveType == "D") {
		data = {
			seq: modalId,
			saveType: saveType
		};
	}

	// console.log('SAVE SLOT : ', data);

	$.ajax({
		url: "/admin/conversation/slot/insertExample.do",
		type: "POST",
		data: JSON.stringify(data),
		contentType: "application/json",
		success: function(d) {
			if (d.result) {
				$.utils.success(d.message);
				search();

				if (saveType == "I") {
					if(modal.selector == "#slot_enroll_modal"){
					var seq = d.seq;
					$("#" + modalId).find("input[name=seq]:eq(0)").val(seq);	
					}else{
						// console.log("update")
					}
				
				}
			} else {
				$.utils.error(d.message);
			}
		}
	});
}

