import { WorkflowPage } from '../pages';
import { WorkflowExecutionsTab } from '../pages/workflow-executions-tab';
import type { RouteHandler } from 'cypress/types/net-stubbing';

const workflowPage = new WorkflowPage();
const executionsTab = new WorkflowExecutionsTab();
const executionsRefreshInterval = 4000;

// Test suite for executions tab
describe('Current Workflow Executions', () => {
	beforeEach(() => {
		workflowPage.actions.visit();
		cy.createFixtureWorkflow('Test_workflow_4_executions_view.json', `My test workflow`);
	});

	it('should render executions tab correctly', () => {
		createMockExecutions();
		cy.intercept('GET', '/rest/executions?filter=*').as('getExecutions');
		cy.intercept('GET', '/rest/executions-current?filter=*').as('getCurrentExecutions');

		executionsTab.actions.switchToExecutionsTab();

		cy.wait(['@getExecutions', '@getCurrentExecutions']);

		executionsTab.getters.executionListItems().should('have.length', 11);
		executionsTab.getters.successfulExecutionListItems().should('have.length', 9);
		executionsTab.getters.failedExecutionListItems().should('have.length', 2);
		executionsTab.getters
			.executionListItems()
			.first()
			.invoke('attr', 'class')
			.should('match', /_active_/);
	});

	it('should not redirect back to execution tab when request is not done before leaving the page', () => {
		cy.intercept('GET', '/rest/executions?filter=*');
		cy.intercept('GET', '/rest/executions-current?filter=*');

		executionsTab.actions.switchToExecutionsTab();
		executionsTab.actions.switchToEditorTab();
		cy.wait(executionsRefreshInterval);
		cy.url().should('not.include', '/executions');
		executionsTab.actions.switchToExecutionsTab();
		executionsTab.actions.switchToEditorTab();
		executionsTab.actions.switchToExecutionsTab();
		executionsTab.actions.switchToEditorTab();
		executionsTab.actions.switchToExecutionsTab();
		executionsTab.actions.switchToEditorTab();
		cy.wait(executionsRefreshInterval);
		cy.url().should('not.include', '/executions');
		executionsTab.actions.switchToExecutionsTab();
		cy.wait(1000);
		executionsTab.actions.switchToEditorTab();
		cy.wait(executionsRefreshInterval);
		cy.url().should('not.include', '/executions');
	});

	it('should not redirect back to execution tab when slow request is not done before leaving the page', () => {
		const throttleResponse: RouteHandler = (req) => {
			return new Promise((resolve) => {
				setTimeout(() => resolve(req.continue()), 2000);
			});
		};

		cy.intercept('GET', '/rest/executions?filter=*', throttleResponse);
		cy.intercept('GET', '/rest/executions-current?filter=*', throttleResponse);

		executionsTab.actions.switchToExecutionsTab();
		executionsTab.actions.switchToEditorTab();
		cy.wait(executionsRefreshInterval);
		cy.url().should('not.include', '/executions');
	});
});

const createMockExecutions = () => {
	executionsTab.actions.createManualExecutions(5);
	// Make some failed executions by enabling Code node with syntax error
	executionsTab.actions.toggleNodeEnabled('Error');
	executionsTab.actions.createManualExecutions(2);
	// Then add some more successful ones
	executionsTab.actions.toggleNodeEnabled('Error');
	executionsTab.actions.createManualExecutions(4);
};
