import { stagingUsers } from '@fixtures/staging-users';
import { TwilioTask } from './interface/tasks';
import { UserConversation } from './interface/conversations';

const { userChat } = stagingUsers;

const { accountSid, authToken, workspaceSid, chatServiceSid } =
  Cypress.env('twilio') || {};

Cypress.Commands.add('cleanUpTasks', () => {
  cy.allure().logStep('Initiate clean up tasks flow');
  cleanUpTasks();
});

function cleanUpTasks() {
  cy.request({
    method: 'GET',
    url: `https://taskrouter.twilio.com/v1/Workspaces/${workspaceSid}/Tasks`,
    auth: {
      username: accountSid,
      password: authToken
    },
    retryOnStatusCodeFailure: true
  })
    .then(({ status, body }) => {
      expect(status, 'Got tasks from Twilio').to.equal(200);

      return body.tasks;
    })
    .then((tasks) =>
      Promise.all(
        tasks.map((task: TwilioTask) => {
          try {
            const attributes = JSON.parse(task.attributes);

            if (
              attributes.userEmail?.includes('staging-prime.tripactions.xyz') ||
              attributes.userEmail?.includes(userChat.email)
            ) {
              return cy.request({
                method: 'DELETE',
                url: `https://taskrouter.twilio.com/v1/Workspaces/WSe8384914257561b5dc38f9adca252c45/Tasks/${task.sid}`,
                auth: {
                  username: accountSid,
                  password: authToken
                }
              });
            }
          } catch (err) {
            // skip invalid tasks
          }
        })
      )
    );

  cy.request({
    method: 'GET',
    url: `https://conversations.twilio.com/v1/Services/${chatServiceSid}/Users/${userChat.uuid}/Conversations?PageSize=50`,
    auth: {
      username: accountSid,
      password: authToken
    },
    retryOnStatusCodeFailure: true
  }).then(({ body }) =>
    Promise.all(
      body.conversations?.map((conversation: UserConversation) =>
        cy.request({
          method: 'DELETE',
          url: `https://conversations.twilio.com/v1/Services/${chatServiceSid}/Conversations/${conversation.conversation_sid}`,
          auth: {
            username: accountSid,
            password: authToken
          },
          retryOnStatusCodeFailure: true
        })
      )
    )
  );
}
