import {
  getAuthAccountBilling,
  getAuthLoginPortal,
  getAuthSubscriptionRestricted,
  setAuthSubscriptionRestricted,
} from './authSession';

export type AccountBilling = {
  status?: string;
  trial_ends_at?: string | null;
  subscription_ends_at?: string | null;
};

function startOfDay(value: string | Date): Date {
  const date = new Date(value);
  date.setHours(0, 0, 0, 0);
  return date;
}

export function computeSubscriptionRestrictedFromAccount(account: AccountBilling | null): boolean {
  if (!account?.trial_ends_at) {
    return false;
  }

  if (account.status === 'disabled') {
    return true;
  }

  const today = startOfDay(new Date());

  if (startOfDay(account.trial_ends_at) > today) {
    return false;
  }

  if (account.subscription_ends_at) {
    return startOfDay(account.subscription_ends_at) <= today;
  }

  return true;
}

export async function isSubscriptionRestricted(): Promise<boolean> {
  if (await getAuthSubscriptionRestricted()) {
    return true;
  }

  const billing = await getAuthAccountBilling();
  if (!billing) {
    return false;
  }

  const restricted = computeSubscriptionRestrictedFromAccount(billing);
  if (restricted) {
    await setAuthSubscriptionRestricted(true);
  }

  return restricted;
}

export async function isOwnerPortal(portal?: string): Promise<boolean> {
  const role = portal || (await getAuthLoginPortal());
  return role === 'owner';
}

export function subscriptionRestrictedMessage(isOwner: boolean): string {
  return isOwner
    ? 'Your trial or subscription has expired. Renew from Settings → Subscription to restore full access.'
    : 'Your clinic trial or subscription has expired. Please contact your clinic owner to renew the subscription.';
}

export const SUBSCRIPTION_EXEMPT_PATH_PREFIXES = [
  '/guide',
  '/faq',
  '/blog',
  '/help-support',
] as const;

export function isSubscriptionExemptPath(path: string): boolean {
  if (path === '/account-locked' || path === '/settings') {
    return true;
  }

  return SUBSCRIPTION_EXEMPT_PATH_PREFIXES.some(
    (prefix) => path === prefix || path.startsWith(`${prefix}/`),
  );
}

export function homeRouteWhenRestricted(portal: string): string {
  if (portal === 'owner') {
    return '/settings';
  }

  return '/guide';
}

export async function handleSubscriptionRequiredResponse(): Promise<void> {
  await setAuthSubscriptionRestricted(true);
}
