import { TAGS } from 'lib/constants';
import { ensureStartsWith } from 'lib/utils';
import { ExtractVariables, salesforceFetch } from './utils';

const ocapiDomain = process.env.SFCC_SANDBOX_DOMAIN
  ? ensureStartsWith(process.env.SFCC_SANDBOX_DOMAIN, 'https://')
  : '';

export async function getProductRecommendations<T>(productId: string): Promise<T> {
  const productRecommendationsEndpoint = `/products/${productId}/recommendations`;

  const res = await ocFetch<T>({
    method: 'GET',
    endpoint: productRecommendationsEndpoint,
    tags: [TAGS.products]
  });

  return res.body as T;
}

async function ocFetch<T>(options: {
  method: 'POST' | 'GET';
  endpoint: string;
  cache?: RequestCache;
  headers?: HeadersInit;
  tags?: string[];
  variables?: ExtractVariables<T>;
}): Promise<{ status: number; body: T } | never> {
  const apiEndpoint = `${ocapiDomain}${process.env.SFCC_OPENCOMMERCE_SHOP_API_ENDPOINT}${options.endpoint}?client_id=${process.env.SFCC_CLIENT_ID}`;
  return salesforceFetch<T>({
    ...options,
    apiEndpoint
  });
}