import type { StorefrontResponse } from '@nacelle/storefront-sdk';
import type { StorefrontInstanceV2 } from '../connector/index';
import { StorefrontInstance } from 'storefrontSdkV1';

const isV2SdkResponse = (
  response: unknown
): response is StorefrontResponse<unknown> =>
  typeof (response as StorefrontResponse<unknown>).data !== 'undefined' ||
  typeof (response as StorefrontResponse<unknown>).error !== 'undefined';

export async function graphqlQuery<ResponseData>(
  query: string,
  variables: string | Record<string, unknown>,
  client: StorefrontInstanceV2 | StorefrontInstance
): Promise<ResponseData> {
  const response = await client.query({
    query,
    variables:
      typeof variables === 'object' ? JSON.stringify(variables) : variables
  });

  if (isV2SdkResponse(response)) {
    const { data, error } = response;

    if (error) {
      throw new Error(error.message);
    }

    return data as ResponseData;
  } else {
    return response as ResponseData;
  }
}
