// TODO: factorize this with front/e2e/tests/helper/testIds.ts
export enum TestId {
  CATALOGS = 'catalogs',
  NB_ACTIVE_LOCALES = 'nbActiveLocales',
  LANGUAGE = 'language',
  INPUT_TEXT = 'inputText',
  INPUT_INTEGER = 'inputInteger',
  INPUT_FLOAT = 'inputFloat',
  RANGE_TO_INPUT = 'rangeToInput',
  RANGE_FROM_INPUT = 'rangeFromInput',
  SLIDER = 'slider',
  RANGE_DATE_FROM = 'rangeDateFrom',
  RANGE_DATE_TO = 'rangeDateTo',
  RULE_ENGINE = 'ruleEngine',
  REQUEST_TYPE = 'requestType',
  REQUEST_TYPE_ITEM = 'requestTypeItem',
  SYNONYM = 'synonym',
  SYNONYM_ADD_BUTTON = 'synonymAddButton',
  SYNONYM_REMOVE_BUTTON = 'synonymRemoveButton',
  TEXT_FIELD_TAGS = 'textFieldTags',
  TEXT_FIELD_TAGS_CLEAN_BUTTON = 'textFieldTagsCleanButton',
  TEXT_FIELD_TAGS_MULTIPLE = 'textFieldTagsMultiple',
  TEXT_FIELD_TAGS_MULTIPLE_ADD_BUTTON = 'textFieldTagsMultipleAddButton',
  EXPANSION = 'expansion',
  EXPANSION_REFERENCE_TERM = 'expensionReferenceTerm',
  EXPANSION_TERMS = 'expensionTerms',
  EXPANSION_TRASH_BUTTON = 'expensionTrashButton',
  EXPANSION_ADD_BUTTON = 'expensionAddButton',
  MULTIPLE_INPUT = 'multipleInput',
  SELECT = 'select',
  SWITCH = 'switch',
  TREE_SELECTOR = 'treeSelector',
  DROPDOWN = 'dropdown',
  DROPDOWN_OPTION = 'dropdownOption',
  DROPDOWN_COLLAPSING_ICON = 'dropdownCollapsingIcon',
  DROPDOWN_OPTION_GROUP_TITLE = 'dropdownOptionGroupTitle',
  DROPDOWN_CLEAR_ICON = 'dropdownClearIcon',
  HELPER_TEXT = 'helperText',
  CHECKBOX = 'checkbox',
  CHIP = 'chip',
  CHIP_DELETE_ICON = 'chipDeleteIcon',
  IONICON = 'ionicon',
  FILTER = 'filter',
  FILTER_CHIPS_BOX = 'filterChipsBox',
  FILTER_APPLY_BUTTON = 'filterApplyButton',
  FILTER_CLEAR_BUTTON = 'filterClearIcon',
  FILTER_NB_ACTIVE_FILTERS = 'filterNbActiveFilters',
  FILTER_TOGGLE_BUTTON = 'filterToggleButton',
  FILTER_SEARCH_BAR = 'filterSearchBar',
  BUTTON = 'button',
  APP_BAR = 'appBar',
  USER_MENU = 'userMenu',
  USER_MENU_CONTENT = 'userMenuContent',
  LOG_OUT_BUTTON = 'logOutButton',
  ALERT = 'alert',
  TABLE = 'table',
  PAGINATION = 'pagination',
  PAGINATION_FROM = 'paginationFrom',
  PAGINATION_TO = 'paginationTo',
  PAGINATION_COUNT = 'paginationCount',
  POPIN_CATALOGS = 'popinCatalogs',
  SIDE_BAR = 'sidebar',
  SIDE_BAR_COLLAPSING_BUTTON = 'sidebarCollapsingButton',
  MENU_ITEM = 'menuItem',
  MENU_ITEM_CHILDREN = 'menuItemChildren',
  MENU_ITEM_CHILDREN_COLLAPSING_BUTTON = 'menuItemChildrenCollapsingButton',
  MENU_ITEM_ICON = 'menuItemIcon',
  LABEL_MENU_ITEM_ICON = 'labelMenuItemIcon',
  MENU_ITEM_LINK = 'menuItemLink',
  MENU_ITEM_LINK_LABEL = 'menuItemLinkLabel',
  BREADCRUMBS = 'breadcrumbs',
  HELP_TOOLTIP = 'helpTooltip',
  HELP_OVER = 'helpOver',
  USER_NAME = 'userName',
  USER_EMAIL = 'userEmail',
  SCORE = 'score',
  SCORE_CONTAINER = 'scoreContainer',
  STOCK = 'stock',
  PRICE = 'price',
  OTHER_READABLE_FIELD = 'otherReadableField',
  EXPLAIN_DETAILS = 'explainDetails',
  EXPLAIN_DETAILS_NAME = 'explainDetailsName',
  EXPLAIN_DETAILS_GENERAL_INFORMATION = 'explainDetailsGeneralInformation',
  READ_ONLY_TABLE = 'readOnlyTable',
  READ_ONLY_TABLE_ROW = 'readOnlyTableRow',
  READ_ONLY_TABLE_ROW_IMPORTANT = 'readOnlyTableRowImportant',
  READ_ONLY_TABLE_COLLAPSING_BUTTON = 'readOnlyTableCollapsingButton',
  DIALOG = 'dialog',
  DIALOG_CONTENT = 'dialogContent',
  DIALOG_CLOSE_BUTTON = 'dialogCloseButton',
  DIALOG_CANCEL_BUTTON = 'dialogCancelButton',
  DIALOG_CONFIRM_BUTTON = 'dialogConfirmButton',
  GRID_CREATE_BUTTON = 'gridCreateButton',
  GRID_JOB_BUTTON = 'gridJobButton',
  FIELD_SET = 'fieldSet',
  PREVIEW_REQUIRED_MESSAGE = 'previewRequiredMessage',
  RESOURCE_TABLE_NB_CUSTOM_VALUES_MESSAGE = 'resourceTableNbCustomValuesMessage',
  TREE = 'tree',
  TREE_ITEM_TITLE_BUTTON = 'treeItemTitleButton',
  TREE_COLLAPSING_ITEM_LIST_BUTTON = 'treeCollapsingItemListButton',
  FACETS_SETTINGS_BUTTON = 'facetDefaultValuesButton',
  FACETS_PAGE_TITLE = 'facetsPageTitle',
  PAGE_TITLE = 'pageTitle',
  PRODUCTS_CONTAINER = 'productsContainer',
  PRODUCTS_CONTAINER_SAVE_BUTTON = 'productsContainerSaveButton',
  PRODUCTS_CONTAINER_SEARCH_BAR = 'productsContainerSearchBar',
  TOP_AND_BOTTOM_TABLE = 'topAndBottomTable',
  TITLE_BLOCK = 'titleBlock',
  TABS = 'tabs',
  TAB = 'tab',
  RULES_MANAGER = 'rulesManager',
  COMBINATION_RULES = 'combinationRules',
  CONFIGURATION_FORM = 'configurationForm',
  IMPORT_EXPORT_PROFILE_RUN = 'importExportProfileRun',
  LOGS = 'logs',
  JOBFILE = 'jobFile',
  JOBPROFILE = 'jobProfile',
  STATUS = 'status',
  UPLOAD_JOB_FILE_MODAL = 'uploadJobFileModal',
  UPLOAD_JOB_FILE_MODAL_TITLE = 'uploadJobFileModalTitle',
  FILE_UPLOAD_DROPZONE = 'fileUploadDropZone',
  FILE_UPLOAD_DROPZONE_SELECTED_FILE_NAME = 'selectedFileName',
  FILE_DOWNLOADER = 'fileDownloader',
  KPI = 'kpi',
  KPI_GROUP = 'kpiGroup',
  KPI_FILTERS = 'kpiFilters',
}

export const TEST_ID_SEPARATOR = '|'

type ItemIds = (TestId | string)[]
type ItemId = `${typeof TEST_ID_SEPARATOR}${TestId | string}` | ''
export type FullTestId = `${TestId}${ItemId}`

function normalizeItemId(itemIds: ItemIds): ItemId {
  const filtered = itemIds.filter((itemId) => itemId)
  return filtered.length > 0
    ? (`${TEST_ID_SEPARATOR}${filtered.join(TEST_ID_SEPARATOR)}` as ItemId)
    : ''
}

export function generateTestId(
  testId: TestId,
  ...itemIds: ItemIds
): FullTestId {
  return `${testId}${normalizeItemId(itemIds)}`
}
