import type { Conversation } from '@/lib/messages';

export const JOB_CONTEXT_KIND = 'JOB_CONTEXT' as const;

export interface JobContextMetadata {
  kind: typeof JOB_CONTEXT_KIND;
  jobId: string;
  title: string;
  category?: string | null;
  location: string;
  budget?: number | null;
  status: string;
}

export function isJobContextMetadata(value: unknown): value is JobContextMetadata {
  if (!value || typeof value !== 'object') return false;
  const record = value as Record<string, unknown>;
  return record.kind === JOB_CONTEXT_KIND && typeof record.jobId === 'string';
}

/** Open messages with job details seeded into the thread (once per conversation). */
export function buildJobMessagesHref(
  role: 'customer' | 'worker',
  jobId: string,
  options?: { workerId?: string }
) {
  const params = new URLSearchParams({ jobId, seedContext: '1' });
  if (options?.workerId) params.set('workerId', options.workerId);
  return `/${role}/messages?${params.toString()}`;
}

const PENDING_JOB_MESSAGE_KEY = 'ehandyhire:pendingJobMessage';

export interface PendingJobMessage {
  jobId: string;
  text: string;
}

export function stashPendingJobMessage(jobId: string, text: string) {
  const trimmed = text.trim();
  if (!trimmed) return;
  sessionStorage.setItem(
    PENDING_JOB_MESSAGE_KEY,
    JSON.stringify({ jobId, text: trimmed } satisfies PendingJobMessage)
  );
}

export function consumePendingJobMessage(): PendingJobMessage | null {
  if (typeof window === 'undefined') return null;
  const raw = sessionStorage.getItem(PENDING_JOB_MESSAGE_KEY);
  if (!raw) return null;
  sessionStorage.removeItem(PENDING_JOB_MESSAGE_KEY);
  try {
    const parsed = JSON.parse(raw) as PendingJobMessage;
    if (!parsed.text?.trim()) return null;
    return { jobId: parsed.jobId, text: parsed.text.trim() };
  } catch {
    return null;
  }
}

export function jobContextFromConversation(
  job: Conversation['job']
): JobContextMetadata | null {
  if (!job?.id || !job.title) return null;

  return {
    kind: JOB_CONTEXT_KIND,
    jobId: job.id,
    title: job.title,
    category: job.category?.name ?? null,
    location: job.location ?? '',
    budget: job.budget != null ? Number(job.budget) : null,
    status: job.status ?? 'OPEN',
  };
}
