//  Moved PCore.getConstants() into each function in which it's used until we can
//  make sure that this code isn't run until PCore is defined (after onPCoreReady)
// const { CASE_INFO } = PCore.getConstants();

export const addContainerItem = pConnect => {
  const containerManager = pConnect.getContainerManager();
  const contextName = pConnect.getContextName(); // here we will get parent context name, as flow container is child of view container
  const caseViewMode = pConnect.getValue('context_data.caseViewMode');

  let key;
  let flowName;

  if (caseViewMode !== 'review') {
    const target = contextName.substring(0, contextName.lastIndexOf('_'));
    const activeContainerItemID = PCore.getContainerUtils().getActiveContainerItemName(target);
    const containerItemData = PCore.getContainerUtils().getContainerItemData(target, activeContainerItemID);

    if (containerItemData) {
      ({ key, flowName } = containerItemData);
    }
  }

  containerManager.addContainerItem({
    semanticURL: '',
    key,
    flowName,
    caseViewMode: 'perform',
    resourceType: 'ASSIGNMENT',
    data: pConnect.getDataObject(contextName)
  });
};

export const hasContainerItems = pConnect => {
  const contextName = pConnect.getContextName();
  const containerName = pConnect.getContainerName();
  return PCore.getContainerUtils().hasContainerItems(`${contextName}/${containerName}`);
};

export const getActiveCaseActionName = pConnect => {
  const { CASE_INFO } = PCore.getConstants();
  const caseActions = pConnect.getValue(CASE_INFO.CASE_INFO_ACTIONS);
  const activeActionID = pConnect.getValue(CASE_INFO.ACTIVE_ACTION_ID);
  const activeAction = caseActions.find(action => action.ID === activeActionID);
  return activeAction?.name || '';
};

export const getFirstCaseActionName = pConnect => {
  const { CASE_INFO } = PCore.getConstants();
  const caseActions = pConnect.getValue(CASE_INFO.CASE_INFO_ACTIONS);
  return caseActions[0]?.name || '';
};

export const hasNotificationMessages = pConnect => {
  return !!pConnect.getValue('caseMessages');
};

export const isCaseWideLocalAction = pConnect => {
  const { CASE_INFO } = PCore.getConstants();
  const actionID = pConnect.getValue(CASE_INFO.ACTIVE_ACTION_ID);
  const caseActions = pConnect.getValue(CASE_INFO.CASE_INFO_ACTIONS);
  if (caseActions && actionID) {
    const activeAction = caseActions.find(caseAction => caseAction.ID === actionID);
    return activeAction?.type === 'Case';
  }
  return false;
};

export const getChildCaseAssignments = pConnect => {
  const { CASE_INFO } = PCore.getConstants();
  const childCases = pConnect.getValue(CASE_INFO.CHILD_ASSIGNMENTS);
  let allAssignments = [];
  if (childCases && childCases.length > 0) {
    childCases.forEach(({ assignments, Name }) => {
      if (assignments) {
        const childCaseAssignments = assignments.map(assignment => ({
          ...assignment,
          caseName: Name
        }));
        allAssignments = allAssignments.concat(childCaseAssignments);
      }
    });
  }
  return allAssignments;
};

export const hasAssignments = pConnect => {
  const { CASE_INFO } = PCore.getConstants();
  const assignments = pConnect.getValue(CASE_INFO.D_CASE_ASSIGNMENTS_RESULTS);
  const childCasesAssignments = getChildCaseAssignments(pConnect);

  // eslint-disable-next-line sonarjs/prefer-single-boolean-return
  if (assignments || childCasesAssignments || isCaseWideLocalAction(pConnect)) {
    return true;
  }
  return false;
};

export const showBanner = getPConnect => {
  const pConnect = getPConnect();
  return hasNotificationMessages(pConnect) || !hasAssignments(pConnect);
};

export const showTodo = pConnect => {
  const caseViewMode = pConnect.getValue('context_data.caseViewMode');
  return caseViewMode !== 'perform';
};

export const isRenderWithToDoWrapper = (getPConnect, options) => {
  const pConnect = getPConnect();
  const { showWithToDo } = options;
  return showWithToDo && (!isCaseWideLocalAction(pConnect) || showTodo(pConnect));
};

export const getToDoAssignments = pConnect => {
  const { CASE_INFO } = PCore.getConstants();
  const caseActions = pConnect.getValue(CASE_INFO.CASE_INFO_ACTIONS);
  const assignmentLabel = pConnect.getValue(CASE_INFO.ASSIGNMENT_LABEL);
  const assignments = pConnect.getValue(CASE_INFO.D_CASE_ASSIGNMENTS_RESULTS) || [];
  const childCasesAssignments = getChildCaseAssignments(pConnect) || [];
  let childCasesAssignmentsCopy = JSON.parse(JSON.stringify(childCasesAssignments));

  childCasesAssignmentsCopy = childCasesAssignmentsCopy.map(assignment => {
    assignment.isChild = true;
    return assignment;
  });

  const todoAssignments = [...assignments, ...childCasesAssignmentsCopy];
  let todoAssignmentsCopy = JSON.parse(JSON.stringify(todoAssignments));

  if (caseActions && !showTodo(pConnect)) {
    todoAssignmentsCopy = todoAssignmentsCopy.map(assignment => {
      assignment.name = getActiveCaseActionName(pConnect) || assignmentLabel;
      return assignment;
    });
  }

  return todoAssignmentsCopy;
};
