context("Dynamic Link", () => {
	before(() => {
		cy.login();
		cy.visit("/app/doctype");
		return cy
			.window()
			.its("influxframework")
			.then((influxframework) => {
				return influxframework.xcall("influxframework.tests.ui_test_helpers.create_doctype", {
					name: "Test Dynamic Link",
					fields: [
						{
							label: "Document Type",
							fieldname: "doc_type",
							fieldtype: "Link",
							options: "DocType",
							in_list_view: 1,
							in_standard_filter: 1,
						},
						{
							label: "Document ID",
							fieldname: "doc_id",
							fieldtype: "Dynamic Link",
							options: "doc_type",
							in_list_view: 1,
							in_standard_filter: 1,
						},
					],
				});
			});
	});

	function get_dialog_with_dynamic_link() {
		return cy.dialog({
			title: "Dynamic Link",
			fields: [
				{
					label: "Document Type",
					fieldname: "doc_type",
					fieldtype: "Link",
					options: "DocType",
					in_list_view: 1,
				},
				{
					label: "Document ID",
					fieldname: "doc_id",
					fieldtype: "Dynamic Link",
					options: "doc_type",
					in_list_view: 1,
				},
			],
		});
	}

	function get_dialog_with_dynamic_link_option() {
		return cy.dialog({
			title: "Dynamic Link",
			fields: [
				{
					label: "Document Type",
					fieldname: "doc_type",
					fieldtype: "Link",
					options: "DocType",
					in_list_view: 1,
				},
				{
					label: "Document ID",
					fieldname: "doc_id",
					fieldtype: "Dynamic Link",
					get_options: () => {
						return "User";
					},
					in_list_view: 1,
				},
			],
		});
	}

	it("Creating a dynamic link by passing option as function and verifying it in a dialog", () => {
		get_dialog_with_dynamic_link_option().as("dialog");
		cy.get_field("doc_type").clear();
		cy.fill_field("doc_type", "User", "Link");
		cy.get_field("doc_id").click();

		//Checking if the listbox have length greater than 0
		cy.get('[data-fieldname="doc_id"]')
			.find(".awesomplete")
			.find("li")
			.its("length")
			.should("be.gte", 0);
		cy.get(".btn-modal-close").click({ force: true });
	});

	it("Creating a dynamic link and verifying it in a dialog", () => {
		get_dialog_with_dynamic_link().as("dialog");
		cy.get_field("doc_type").clear();
		cy.fill_field("doc_type", "User", "Link");
		cy.get_field("doc_id").click();

		//Checking if the listbox have length greater than 0
		cy.get('[data-fieldname="doc_id"]')
			.find(".awesomplete")
			.find("li")
			.its("length")
			.should("be.gte", 0);
		cy.get(".btn-modal-close").click({ force: true, multiple: true });
	});

	it("Creating a dynamic link and verifying it", () => {
		cy.visit("/app/test-dynamic-link");

		//Clicking on the Document ID field
		cy.get_field("doc_type").clear();

		//Entering User in the Doctype field
		cy.fill_field("doc_type", "User", "Link", { delay: 500 });
		cy.get_field("doc_id").click();

		//Checking if the listbox have length greater than 0
		cy.get('[data-fieldname="doc_id"]')
			.find(".awesomplete")
			.find("li")
			.its("length")
			.should("be.gte", 0);

		//Opening a new form for dynamic link doctype
		cy.new_form("Test Dynamic Link");
		cy.get_field("doc_type").clear();

		//Entering User in the Doctype field
		cy.fill_field("doc_type", "User", "Link", { delay: 500 });
		cy.get_field("doc_id").click();

		//Checking if the listbox have length greater than 0
		cy.get('[data-fieldname="doc_id"]')
			.find(".awesomplete")
			.find("li")
			.its("length")
			.should("be.gte", 0);
		cy.get_field("doc_type").clear();

		//Entering System Settings in the Doctype field
		cy.intercept("/api/method/influxframework.desk.search.search_link").as("search_query");
		cy.fill_field("doc_type", "System Settings", "Link", { delay: 500 });
		cy.wait("@search_query");
		cy.get(`[data-fieldname="doc_type"] ul:visible li:first-child`).click({
			scrollBehavior: false,
		});

		cy.get_field("doc_id").click();

		//Checking if the system throws error
		cy.get(".modal-title").should("have.text", "Error");
		cy.get(".msgprint").should(
			"have.text",
			"System Settings is not a valid DocType for Dynamic Link"
		);
	});
});
