import { Button } from '@/components/ui/button';
import { cn } from '@/lib/utils';
import { SharedData } from '@/types';
import { usePage } from '@inertiajs/react';
import {
  FacebookLogoIcon,
  GithubLogoIcon,
  LinkedinLogoIcon,
} from '@phosphor-icons/react';
import { ComponentType } from 'react';
import { useTranslation } from 'react-i18next';

// Official multi-colour Google "G" mark (brand-compliant).
function GoogleColorIcon({ className }: { className?: string }) {
  return (
    <svg viewBox="0 0 48 48" className={className} aria-hidden="true">
      <path
        fill="#EA4335"
        d="M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z"
      />
      <path
        fill="#4285F4"
        d="M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z"
      />
      <path
        fill="#FBBC05"
        d="M10.53 28.59c-.48-1.45-.76-2.99-.76-4.59s.27-3.14.76-4.59l-7.98-6.19C.92 16.46 0 20.12 0 24c0 3.88.92 7.54 2.56 10.78l7.97-6.19z"
      />
      <path
        fill="#34A853"
        d="M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z"
      />
    </svg>
  );
}

const ICONS: Record<string, ComponentType<{ className?: string }>> = {
  google: GoogleColorIcon,
  facebook: FacebookLogoIcon,
  github: GithubLogoIcon,
  linkedin: LinkedinLogoIcon,
};

export default function SocialLoginButtons() {
  const { t } = useTranslation();
  const { branding, errors } = usePage<SharedData>().props;
  const providers = branding?.social_login?.providers ?? [];
  const socialError = (errors as Record<string, string> | undefined)?.social;

  // A referral link is /register?referral_code=CODE. The OAuth round trip drops
  // the query string, so hand the code to the redirect route, which parks it in
  // the session for CreateOrLoginSocialUser to read on the way back.
  const referralCode =
    typeof window !== 'undefined'
      ? new URLSearchParams(window.location.search).get('referral_code')
      : null;
  const referralQuery = referralCode
    ? `?referral_code=${encodeURIComponent(referralCode)}`
    : '';

  if (providers.length === 0) return null;

  return (
    <div className="flex flex-col gap-4">
      <div className="flex items-center gap-3">
        <span className="h-px flex-1 bg-black/10 dark:bg-white/10" />
        <span className="text-xs text-black/50 dark:text-white/50">
          {t('Or continue with')}
        </span>
        <span className="h-px flex-1 bg-black/10 dark:bg-white/10" />
      </div>

      {socialError && (
        <p className="text-center text-sm font-medium text-destructive">
          {t(socialError)}
        </p>
      )}

      <div
        className={cn(
          'grid gap-3',
          providers.length === 1 ? 'grid-cols-1' : 'grid-cols-2',
        )}
      >
        {providers.map((provider) => {
          const Icon = ICONS[provider.key];

          return (
            <Button
              key={provider.key}
              type="button"
              variant="outline"
              asChild
              className="h-11 w-full rounded-xl border-black/10 dark:border-white/10"
            >
              <a href={`/auth/${provider.key}/redirect${referralQuery}`}>
                {Icon && <Icon className="size-5" />}
                <span>{provider.label}</span>
              </a>
            </Button>
          );
        })}
      </div>
    </div>
  );
}
