import { randomUUID } from 'crypto';
import { readPersistentDataFile, writePersistentDataFile } from './local-store';
import type { StoredAgentDentalKnowledgeArticle } from './agent-dental-knowledge.store';

export type AgentDentalKnowledgeVersionEntry = {
  id: string;
  articleId: string;
  articleTitle: string;
  action: 'CREATED' | 'UPDATED' | 'DELETED' | 'RESTORED';
  actorUserId: string;
  actorName: string;
  actorRole: string;
  snapshot: StoredAgentDentalKnowledgeArticle;
  createdAt: string;
};

const versionsFileName = 'agent-dental-knowledge-versions.json';

const defaultVersionEntries = () => [] as AgentDentalKnowledgeVersionEntry[];

export const listAgentDentalKnowledgeVersions = async (articleId: string, limit = 20) => {
  const entries = await readPersistentDataFile<AgentDentalKnowledgeVersionEntry[]>(versionsFileName, defaultVersionEntries);

  return [...entries]
    .filter((entry) => entry.articleId === articleId)
    .sort((left, right) => Date.parse(right.createdAt) - Date.parse(left.createdAt))
    .slice(0, Math.max(1, Math.min(limit, 50)));
};

export const findAgentDentalKnowledgeVersion = async (articleId: string, versionId: string) => {
  const entries = await readPersistentDataFile<AgentDentalKnowledgeVersionEntry[]>(versionsFileName, defaultVersionEntries);
  return entries.find((entry) => entry.articleId === articleId && entry.id === versionId) ?? null;
};

export const appendAgentDentalKnowledgeVersion = async (
  input: Omit<AgentDentalKnowledgeVersionEntry, 'id' | 'createdAt'>,
) => {
  const entries = await readPersistentDataFile<AgentDentalKnowledgeVersionEntry[]>(versionsFileName, defaultVersionEntries);

  const entry: AgentDentalKnowledgeVersionEntry = {
    id: randomUUID(),
    articleId: input.articleId,
    articleTitle: input.articleTitle,
    action: input.action,
    actorUserId: input.actorUserId,
    actorName: input.actorName,
    actorRole: input.actorRole,
    snapshot: input.snapshot,
    createdAt: new Date().toISOString(),
  };

  const nextEntries = [entry, ...entries]
    .sort((left, right) => Date.parse(right.createdAt) - Date.parse(left.createdAt))
    .slice(0, 300);

  await writePersistentDataFile(versionsFileName, nextEntries);
  return entry;
};
