import type {
  BrandProfile,
  ContentMediaType,
  ContentOrigin,
  GeneratedPost,
  GeneratedPostStatus,
  PostingContextData,
  Project,
} from "@/types/workflow";
import { isAiOrigin, normalizeContentOrigin } from "@/lib/content/origin";

const META_PREFIX = "__postsync_meta__:";

export interface PostContentMeta {
  origin: ContentOrigin;
  hashtags?: string[];
  linkUrl?: string;
  cta?: string;
  mediaType?: ContentMediaType;
  notes?: string;
}

/** Pack extended fields into context_snapshot for DB rows without extra columns. */
export function packContextSnapshot(meta: PostContentMeta): string {
  if (isAiOrigin(meta.origin) && !meta.hashtags?.length && !meta.linkUrl && !meta.cta && !meta.notes) {
    return meta.notes ?? "";
  }
  return `${META_PREFIX}${JSON.stringify(meta)}`;
}

export function unpackContextSnapshot(raw: string | undefined | null): {
  meta: PostContentMeta;
  plainText: string;
} {
  const text = raw ?? "";
  if (!text.startsWith(META_PREFIX)) {
    return { meta: { origin: "ai_rag", notes: text }, plainText: text };
  }
  try {
    const meta = JSON.parse(text.slice(META_PREFIX.length)) as PostContentMeta;
    return { meta: { ...meta, origin: normalizeContentOrigin(meta.origin) }, plainText: meta.notes ?? "" };
  } catch {
    return { meta: { origin: "ai_rag", notes: text }, plainText: text };
  }
}

export function hydratePostFields(post: GeneratedPost): GeneratedPost {
  const { meta } = unpackContextSnapshot(post.contextSnapshot);
  const origin = normalizeContentOrigin(
    post.origin ?? meta.origin ?? (post.provider === "manual" ? "manual" : "ai_rag"),
  );
  return {
    ...post,
    origin,
    hashtags: post.hashtags ?? meta.hashtags,
    linkUrl: post.linkUrl ?? meta.linkUrl,
    cta: post.cta ?? meta.cta,
    mediaType: post.mediaType ?? meta.mediaType,
    provider: post.provider || (!isAiOrigin(origin) ? "manual" : post.provider),
    model: post.model || (!isAiOrigin(origin) ? "user" : post.model),
  };
}

export interface CreateContentPostInput {
  userId: string;
  project: Project;
  brand: BrandProfile;
  context?: PostingContextData;
  origin: ContentOrigin;
  title?: string;
  caption: string;
  hashtags?: string[];
  linkUrl?: string;
  cta?: string;
  mediaType?: ContentMediaType;
  platforms: string[];
  imageUrl?: string | null;
  videoUrl?: string | null;
  sequencePostId?: string;
  sequenceIndex?: number;
  status?: GeneratedPostStatus;
}

export function buildContentPost(input: CreateContentPostInput): GeneratedPost {
  const now = new Date().toISOString();
  const caption = input.caption.trim();
  const hashtags = input.hashtags?.filter(Boolean) ?? [];
  const title =
    input.title?.trim() ||
    caption.split("\n")[0]?.slice(0, 120) ||
    "Untitled post";

  const meta: PostContentMeta = {
    origin: input.origin,
    hashtags,
    linkUrl: input.linkUrl?.trim() || undefined,
    cta: input.cta?.trim() || undefined,
    mediaType: input.mediaType ?? (input.videoUrl ? "video" : input.imageUrl ? "image" : "content"),
    notes: "",
  };

  const fullCaption =
    hashtags.length > 0 && !caption.includes("#")
      ? `${caption}\n\n${hashtags.map((h) => (h.startsWith("#") ? h : `#${h}`)).join(" ")}`
      : caption;

  return {
    id: crypto.randomUUID(),
    userId: input.userId,
    projectId: input.project.id,
    projectName: input.project.name,
    contextName: input.context?.name ?? "Manual content",
    origin: input.origin,
    sequencePostId: input.sequencePostId ?? "manual",
    sequenceIndex: input.sequenceIndex ?? -1,
    parentPostId: null,
    version: 1,
    title,
    caption: fullCaption,
    hashtags,
    linkUrl: meta.linkUrl,
    cta: meta.cta,
    mediaType: meta.mediaType,
    imageUrl: input.imageUrl ?? null,
    imagePrompt: "",
    imageApproved: Boolean(input.imageUrl),
    videoUrl: input.videoUrl ?? null,
    videoStatus: input.videoUrl ? "generated" : "skipped",
    platforms: input.platforms,
    status: input.status ?? "draft",
    provider: isAiOrigin(input.origin) ? "" : "manual",
    model: isAiOrigin(input.origin) ? "" : "user",
    contextSnapshot: packContextSnapshot(meta),
    engagementScore: null,
    createdAt: now,
  };
}
