import type { Metadata } from 'next';
import { formatCurrency } from '@/lib/utils';
import { absoluteUrl } from '@/lib/site';

export type ShareContentType = 'job' | 'worker';

export interface SharePayload {
  type: ShareContentType;
  url: string;
  title: string;
  description: string;
  imageUrl?: string;
  hashtags?: string[];
}

export interface SharePlatform {
  id: string;
  label: string;
  color: string;
  icon: 'facebook' | 'x' | 'whatsapp' | 'linkedin' | 'messenger' | 'link' | 'native';
}

export const SHARE_PLATFORMS: SharePlatform[] = [
  { id: 'facebook', label: 'Facebook', color: '#1877F2', icon: 'facebook' },
  { id: 'whatsapp', label: 'WhatsApp', color: '#25D366', icon: 'whatsapp' },
  { id: 'messenger', label: 'Messenger', color: '#0084FF', icon: 'messenger' },
  { id: 'x', label: 'X', color: '#0F172A', icon: 'x' },
  { id: 'linkedin', label: 'LinkedIn', color: '#0A66C2', icon: 'linkedin' },
];

export function getJobShareUrl(jobId: string) {
  return absoluteUrl(`/jobs/${jobId}`);
}

export function getWorkerShareUrl(workerId: string) {
  return absoluteUrl(`/workers/${workerId}`);
}

export function getOgImageUrl(type: ShareContentType, id: string) {
  return absoluteUrl(`/api/og/share?type=${type}&id=${encodeURIComponent(id)}`);
}

export function buildJobSharePayload(job: Record<string, unknown>): SharePayload {
  const id = String(job.id);
  const title = String(job.title || 'Job on eHandyHire');
  const category = (job.category as { name?: string } | undefined)?.name;
  const location = job.location ? String(job.location) : undefined;
  const budget = job.budget != null ? formatCurrency(Number(job.budget)) : undefined;
  const descriptionRaw = String(job.description || '').replace(/\s+/g, ' ').trim();
  const descriptionSnippet = descriptionRaw.slice(0, 160) + (descriptionRaw.length > 160 ? '…' : '');

  const parts = [
    category,
    location,
    budget ? `Budget ${budget}` : undefined,
    descriptionSnippet,
  ].filter(Boolean);

  const imageUrl = getOgImageUrl('job', id);

  return {
    type: 'job',
    url: getJobShareUrl(id),
    title,
    description: parts.join(' · ') || 'View this job on eHandyHire',
    imageUrl,
    hashtags: ['eHandyHire', 'PhilippinesJobs'],
  };
}

export function buildWorkerSharePayload(worker: Record<string, unknown>): SharePayload {
  const id = String(worker.id);
  const user = worker.user as { firstName?: string; lastName?: string; avatarUrl?: string };
  const name = [user?.firstName, user?.lastName].filter(Boolean).join(' ') || 'Worker';
  const headline = worker.headline ? String(worker.headline) : 'Skilled professional';
  const rating = Number(worker.averageRating) || 0;
  const reviews = Number(worker.totalReviews) || 0;
  const skills = (worker.skills as { category?: { name?: string } }[] | undefined)
    ?.map((s) => s.category?.name)
    .filter(Boolean)
    .slice(0, 3)
    .join(', ');

  const imageUrl = getOgImageUrl('worker', id);

  const descriptionParts = [
    headline,
    rating > 0 ? `${rating.toFixed(1)}★ (${reviews} reviews)` : undefined,
    skills ? `Skills: ${skills}` : undefined,
  ].filter(Boolean);

  return {
    type: 'worker',
    url: getWorkerShareUrl(id),
    title: `${name} on eHandyHire`,
    description: descriptionParts.join(' · ') || 'Hire verified workers on eHandyHire',
    imageUrl,
    hashtags: ['eHandyHire', 'HireLocal'],
  };
}

export function buildShareText(payload: SharePayload) {
  return `${payload.title} — ${payload.description}`;
}

export function buildPlatformShareUrl(platformId: string, payload: SharePayload) {
  const encodedUrl = encodeURIComponent(payload.url);
  const title = encodeURIComponent(payload.title);

  switch (platformId) {
    case 'facebook':
      return `https://www.facebook.com/sharer/sharer.php?u=${encodedUrl}`;
    case 'x':
      return `https://twitter.com/intent/tweet?url=${encodedUrl}&text=${title}`;
    case 'whatsapp':
      return `https://wa.me/?text=${encodeURIComponent(`${payload.title}\n${payload.url}`)}`;
    case 'linkedin':
      return `https://www.linkedin.com/sharing/share-offsite/?url=${encodedUrl}`;
    case 'messenger':
      return `https://www.facebook.com/dialog/send?link=${encodedUrl}&app_id=0&redirect_uri=${encodedUrl}`;
    default:
      return payload.url;
  }
}

export function canUseNativeShare() {
  return typeof navigator !== 'undefined' && typeof navigator.share === 'function';
}

export async function copyShareLink(url: string) {
  if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {
    await navigator.clipboard.writeText(url);
    return;
  }

  const input = document.createElement('textarea');
  input.value = url;
  input.style.position = 'fixed';
  input.style.opacity = '0';
  document.body.appendChild(input);
  input.select();
  document.execCommand('copy');
  document.body.removeChild(input);
}

export async function nativeShare(payload: SharePayload) {
  if (!canUseNativeShare()) return false;
  await navigator.share({
    title: payload.title,
    text: payload.description,
    url: payload.url,
  });
  return true;
}

export function buildShareMetadata(payload: SharePayload): Metadata {
  const siteName = 'eHandyHire';

  return {
    title: payload.title,
    description: payload.description,
    openGraph: {
      type: 'website',
      url: payload.url,
      title: payload.title,
      description: payload.description,
      siteName,
      images: payload.imageUrl
        ? [{ url: payload.imageUrl, width: 1200, height: 630, alt: payload.title }]
        : undefined,
    },
    twitter: {
      card: 'summary_large_image',
      title: payload.title,
      description: payload.description,
      images: payload.imageUrl ? [payload.imageUrl] : undefined,
    },
  };
}

export function buildJobShareMetadata(job: Record<string, unknown>): Metadata {
  return buildShareMetadata(buildJobSharePayload(job));
}

export function buildWorkerShareMetadata(worker: Record<string, unknown>): Metadata {
  return buildShareMetadata(buildWorkerSharePayload(worker));
}
