import { WorkflowPage, NDV } from '../pages';

const workflowPage = new WorkflowPage();
const ndv = new NDV();

describe('ADO-2111 expressions should support pinned data', () => {
	beforeEach(() => {
		workflowPage.actions.visit();
	});

	it('supports pinned data in expressions unexecuted and executed parent nodes', () => {
		cy.createFixtureWorkflow('Test_workflow_pinned_data_in_expressions.json', 'Expressions');

		// test previous node unexecuted
		workflowPage.actions.openNode('NotPinnedWithExpressions');
		ndv.getters
			.parameterExpressionPreview('value')
			.eq(0)
			.should('include.text', 'Joe\nJoe\nJoan\nJoan\nJoe\nJoan\n\nJoe\nJoan\n\nJoe');
		ndv.getters
			.parameterExpressionPreview('value')
			.eq(1)
			.should('contain.text', '0,0\nJoe\n\nJoe\n\nJoe\n\nJoe\nJoe');

		// test can resolve correctly based on item
		ndv.actions.switchInputMode('Table');

		ndv.getters.inputTableRow(2).realHover();
		cy.wait(50);
		ndv.getters
			.parameterExpressionPreview('value')
			.eq(0)
			.should('include.text', 'Joe\nJoe\nJoan\nJoan\nJoe\nJoan\n\nJoe\nJoan\n\nJoe');
		ndv.getters
			.parameterExpressionPreview('value')
			.eq(1)
			.should('contain.text', '0,1\nJoan\n\nJoan\n\nJoan\n\nJoan\nJoan');

		// test previous node executed
		ndv.actions.execute();
		ndv.getters.inputTableRow(1).realHover();
		cy.wait(50);

		ndv.getters
			.parameterExpressionPreview('value')
			.eq(0)
			.should('include.text', 'Joe\nJoe\nJoan\nJoan\nJoe\nJoan\n\nJoe\nJoan\n\nJoe');

		ndv.getters
			.parameterExpressionPreview('value')
			.eq(1)
			.should('contain.text', '0,0\nJoe\n\nJoe\n\nJoe\n\nJoe\nJoe');

		ndv.getters.inputTableRow(2).realHover();
		cy.wait(50);
		ndv.getters
			.parameterExpressionPreview('value')
			.eq(0)
			.should('include.text', 'Joe\nJoe\nJoan\nJoan\nJoe\nJoan\n\nJoe\nJoan\n\nJoe');
		ndv.getters
			.parameterExpressionPreview('value')
			.eq(1)
			.should('contain.text', '0,1\nJoan\n\nJoan\n\nJoan\n\nJoan\nJoan');

		// check it resolved correctly on the backend
		ndv.getters
			.outputTbodyCell(1, 0)
			.should('contain.text', 'Joe\\nJoe\\nJoan\\nJoan\\nJoe\\nJoan\\n\\nJoe\\nJoan\\n\\nJoe');

		ndv.getters
			.outputTbodyCell(2, 0)
			.should('contain.text', 'Joe\\nJoe\\nJoan\\nJoan\\nJoe\\nJoan\\n\\nJoe\\nJoan\\n\\nJoe');

		ndv.getters
			.outputTbodyCell(1, 1)
			.should('contain.text', '0,0\\nJoe\\n\\nJoe\\n\\nJoe\\n\\nJoe\\nJoe');

		ndv.getters
			.outputTbodyCell(2, 1)
			.should('contain.text', '0,1\\nJoan\\n\\nJoan\\n\\nJoan\\n\\nJoan\\nJoan');
	});

	it('resets expressions after node is unpinned', () => {
		cy.createFixtureWorkflow('Test_workflow_pinned_data_in_expressions.json', 'Expressions');

		// test previous node unexecuted
		workflowPage.actions.openNode('NotPinnedWithExpressions');
		ndv.getters
			.parameterExpressionPreview('value')
			.eq(0)
			.should('include.text', 'Joe\nJoe\nJoan\nJoan\nJoe\nJoan\n\nJoe\nJoan\n\nJoe');
		ndv.getters
			.parameterExpressionPreview('value')
			.eq(1)
			.should('contain.text', '0,0\nJoe\n\nJoe\n\nJoe\n\nJoe\nJoe');

		ndv.actions.close();

		// unpin pinned node
		workflowPage.getters
			.canvasNodeByName('PinnedSet')
			.eq(0)
			.find('.node-pin-data-icon')
			.should('exist');
		workflowPage.getters.canvasNodeByName('PinnedSet').eq(0).click();
		workflowPage.actions.hitPinNodeShortcut();
		workflowPage.getters
			.canvasNodeByName('PinnedSet')
			.eq(0)
			.find('.node-pin-data-icon')
			.should('not.exist');

		workflowPage.actions.openNode('NotPinnedWithExpressions');
		ndv.getters.nodeParameters().find('parameter-expression-preview-value').should('not.exist');

		ndv.getters.parameterInput('value').eq(0).click();
		ndv.getters
			.inlineExpressionEditorOutput()
			.should(
				'have.text',
				'[Execute node ‘PinnedSet’ for preview][Execute node ‘PinnedSet’ for preview][Execute node ‘PinnedSet’ for preview][Execute node ‘PinnedSet’ for preview][Execute node ‘PinnedSet’ for preview][Execute node ‘PinnedSet’ for preview][Execute previous nodes for preview][Execute previous nodes for preview][undefined]',
			);

		// close open expression
		ndv.getters.inputLabel().eq(0).click();

		ndv.getters.parameterInput('value').eq(1).click();
		ndv.getters
			.inlineExpressionEditorOutput()
			.should(
				'have.text',
				'0,0[Execute node ‘PinnedSet’ for preview][Execute node ‘PinnedSet’ for preview][Execute previous nodes for preview][Execute previous nodes for preview][Execute previous nodes for preview]',
			);
	});
});