const jump_to_field = (field_label) => {
	cy.get("body")
		.type("{esc}") // lose focus if any
		.type("{ctrl+j}") // jump to field
		.type(field_label)
		.wait(500)
		.type("{enter}")
		.wait(200)
		.type("{enter}")
		.wait(500);
};

const type_value = (value) => {
	cy.focused().clear().type(value).type("{esc}");
};

context("Form", () => {
	before(() => {
		cy.login();
		cy.visit("/app/website");
		return cy
			.window()
			.its("jingrow")
			.then((jingrow) => {
				return jingrow.call("jingrow.tests.ui_test_helpers.create_contact_records");
			});
	});

	beforeEach(() => {
		cy.login();
		cy.visit("/app/website");
	});

	it("create a new form", () => {
		cy.visit("/app/todo/new");
		cy.get_field("description", "Text Editor")
			.type("this is a test todo", { force: true })
			.wait(1000);
		cy.get(".page-title").should("contain", "Not Saved");
		cy.intercept({
			method: "POST",
			url: "api/action/jingrow.desk.form.save.savepgs",
		}).as("form_save");
		cy.get(".primary-action").click();
		cy.wait("@form_save").its("response.statusCode").should("eq", 200);

		cy.go_to_list("ToDo");
		cy.clear_filters();
		cy.get(".page-head").findByTitle("To Do").should("exist");
		cy.get(".list-row").should("contain", "this is a test todo");
	});

	it("navigates between documents with child table list filters applied", () => {
		cy.visit("/app/contact");

		cy.clear_filters();
		cy.get('.standard-filter-section [data-fieldname="name"] input')
			.type("Test Form Contact 3")
			.blur();
		cy.click_listview_row_item_with_text("Test Form Contact 3");

		cy.scrollTo(0);
		cy.get("#page-Contact .page-head").findByTitle("Test Form Contact 3").should("exist");
		cy.get(".prev-pg").should("be.visible").click();
		cy.get(".msgprint-dialog .modal-body").contains("No further records").should("be.visible");
		cy.hide_dialog();

		cy.scrollTo(0);
		cy.get("#page-Contact .page-head").findByTitle("Test Form Contact 3").should("exist");
		cy.get(".next-pg").should("be.visible").click();
		cy.get(".msgprint-dialog .modal-body").contains("No further records").should("be.visible");
		cy.hide_dialog();

		cy.get("#page-Contact .page-head").findByTitle("Test Form Contact 3").should("exist");

		// clear filters
		cy.visit("/app/contact");
		cy.clear_filters();
	});

	it("validates behaviour of Data options validations in child table", () => {
		// test email validations for set_invalid controller
		let website_input = "website.in";
		let valid_email = "user@email.com";
		let expectBackgroundColor = "rgb(255, 245, 245)";

		cy.visit("/app/contact/new");
		cy.get('.jingrow-control[data-fieldname="email_ids"]').as("table");
		cy.get("@table").find("button.grid-add-row").click();
		cy.get("@table").find("button.grid-add-row").click();
		cy.get("@table").find('[data-idx="1"]').as("row1");
		cy.get("@table").find('[data-idx="2"]').as("row2");
		cy.get("@row1").click();
		cy.get("@row1").find("input.input-with-feedback.form-control").as("email_input1");

		cy.get("@email_input1").type(website_input, { waitForAnimations: false });
		cy.fill_field("company_name", "Test Company");

		cy.get("@row2").click();
		cy.get("@row2").find("input.input-with-feedback.form-control").as("email_input2");
		cy.get("@email_input2").type(valid_email, { waitForAnimations: false });

		cy.get("@row1").click();
		cy.get("@email_input1").should("have.class", "invalid");

		cy.get("@row2").click();
		cy.get("@email_input2").should("not.have.class", "invalid");
	});

	it("Jump to field in collapsed section", { scrollBehavior: false }, () => {
		cy.new_form("User");

		jump_to_field("Location"); // this is in collapsed section
		type_value("Bermuda");

		cy.get_field("location").should("have.value", "Bermuda");
	});

	it("update pagefield property using set_df_property in child table", () => {
		cy.visit("/app/contact/Test Form Contact 1");
		cy.window()
			.its("cur_frm")
			.then((frm) => {
				cy.get('.jingrow-control[data-fieldname="phone_nos"]').as("table");

				// set property before form_render event of child table
				cy.get("@table")
					.find('[data-idx="1"]')
					.invoke("attr", "data-name")
					.then((cdn) => {
						frm.set_df_property(
							"phone_nos",
							"hidden",
							1,
							"Contact Phone",
							"is_primary_phone",
							cdn
						);
					});

				cy.get("@table").find('[data-idx="1"] .btn-open-row').click();
				cy.get(".grid-row-open").as("table-form");
				cy.get("@table-form")
					.find('.jingrow-control[data-fieldname="is_primary_phone"]')
					.should("be.hidden");
				cy.get("@table-form").find(".grid-footer-toolbar").click();

				// set property on form_render event of child table
				cy.get("@table").find('[data-idx="1"] .btn-open-row').click();
				cy.get("@table")
					.find('[data-idx="1"]')
					.invoke("attr", "data-name")
					.then((cdn) => {
						frm.set_df_property(
							"phone_nos",
							"hidden",
							0,
							"Contact Phone",
							"is_primary_phone",
							cdn
						);
					});

				cy.get(".grid-row-open").as("table-form");
				cy.get("@table-form")
					.find('.jingrow-control[data-fieldname="is_primary_phone"]')
					.should("be.visible");
				cy.get("@table-form").find(".grid-footer-toolbar").click();
			});
	});
});
