import type { CatalogEntityConfig, EntitiesCatalogConfig } from '@redocly/config';
import type { BffCatalogEntity } from '@redocly/theme/core/types';

import { withPathPrefix } from '../../utils/urls';

type Props = {
  catalogConfig: CatalogEntityConfig;
  entitiesCatalogConfig?: EntitiesCatalogConfig;
  revision?: string | null;
  version?: string | null;
};

type BaseEntity = Pick<BffCatalogEntity, 'key' | 'type'>;

export function useCatalogEntityDetails({
  catalogConfig,
  entitiesCatalogConfig,
  revision,
  version,
}: Props) {
  const getCatalogSpecificConfigByEntityTypeIncluded = (entity: BaseEntity) => {
    if (!entitiesCatalogConfig) {
      return;
    }

    return Object.values(entitiesCatalogConfig.catalogs ?? {}).find((catalog) => {
      return catalog?.includes?.some((include) => include.type === entity.type);
    });
  };

  const getEntityDetailsLink = (entity: BaseEntity) => {
    const catalogSpecificConfig = getCatalogSpecificConfigByEntityTypeIncluded(entity);

    const basePath =
      !catalogSpecificConfig || !entitiesCatalogConfig
        ? withPathPrefix(`/catalogs/${catalogConfig.slug}/entities/${entity.key}`)
        : withPathPrefix(`/catalogs/${catalogSpecificConfig.slug}/entities/${entity.key}`);

    const params = new URLSearchParams();
    if (revision) {
      params.set('revision', revision);
    }
    if (version !== undefined) {
      params.set('version', version ?? '');
    }
    params.set('search', '');

    return `${basePath}?${params.toString()}`;
  };

  return { getEntityDetailsLink };
}
