import {redirect} from 'react-router';

import {
  BasicParams,
  LoginError,
  LoginErrorType,
  AppDistribution,
} from '../../types';

export function loginFactory(params: BasicParams) {
  const {api, config, logger} = params;

  return async function login(request: Request): Promise<LoginError | never> {
    const url = new URL(request.url);
    const shopParam = url.searchParams.get('shop');

    if (request.method === 'GET' && !shopParam) {
      return {};
    }

    const shop: string | null =
      shopParam || ((await request.formData()).get('shop') as string);

    if (!shop) {
      logger.debug('Missing shop parameter', {shop});
      return {shop: LoginErrorType.MissingShop};
    }

    const shopWithoutProtocol = shop
      .replace(/^https?:\/\//, '')
      .replace(/\/$/, '');
    const shopWithDomain =
      shop?.indexOf('.') === -1
        ? `${shopWithoutProtocol}.myshopify.com`
        : shopWithoutProtocol;
    const sanitizedShop = api.utils.sanitizeShop(shopWithDomain);

    if (!sanitizedShop) {
      logger.debug('Invalid shop parameter', {shop});
      return {shop: LoginErrorType.InvalidShop};
    }

    const authPath = `${config.appUrl}${config.auth.path}?shop=${sanitizedShop}`;

    const adminPath = api.utils.legacyUrlToShopAdminUrl(sanitizedShop);
    const installPath = `https://${adminPath}/oauth/install?client_id=${config.apiKey}`;

    const shouldInstall = config.distribution !== AppDistribution.ShopifyAdmin;
    const redirectUrl = shouldInstall ? installPath : authPath;

    logger.info(`Redirecting login request to ${redirectUrl}`, {
      shop: sanitizedShop,
    });

    throw redirect(redirectUrl);
  };
}
