import { randomUUID } from 'crypto';
import { nextFallbackDocumentSequence, syncFallbackDocumentSequence } from './document.store';
import { buildDocumentNumberFromSequence } from './document-sequence.service';
import { listFallbackPatients } from './patient.store';
import { readDataFile, writeDataFile } from './local-store';

export type StoredRecipe = {
  id: string;
  codigo: string;
  fecha: string;
  diagnostico: string;
  indicaciones: string;
  firmada: boolean;
  pacienteId: string;
  pacienteNombres: string;
  pacienteApellidos: string;
  medicoNombre: string;
};

type CreateFallbackRecipeInput = {
  pacienteId: string;
  diagnostico: string;
  indicaciones: string;
  firmada?: boolean;
};

const fileName = 'recipes.json';

const buildSeedRecipes = async () => {
  const patients = await listFallbackPatients();

  if (patients.length === 0) {
    return [] as StoredRecipe[];
  }

  const [firstPatient, secondPatient = firstPatient] = patients;
  const now = new Date().toISOString();

  return [
    {
      id: randomUUID(),
      codigo: 'RX001-000001',
      fecha: now,
      diagnostico: 'Gingivitis leve',
      indicaciones: 'Ibuprofeno 400mg cada 8 horas por 3 dias.',
      firmada: true,
      pacienteId: firstPatient!.id,
      pacienteNombres: firstPatient!.nombres,
      pacienteApellidos: firstPatient!.apellidos,
      medicoNombre: 'Dr. Demo DentaFlow',
    },
    {
      id: randomUUID(),
      codigo: 'RX001-000002',
      fecha: now,
      diagnostico: 'Sensibilidad dental post tratamiento',
      indicaciones: 'Enjuague bucal por 5 dias y dieta blanda.',
      firmada: false,
      pacienteId: secondPatient!.id,
      pacienteNombres: secondPatient!.nombres,
      pacienteApellidos: secondPatient!.apellidos,
      medicoNombre: 'Dr. Demo DentaFlow',
    },
  ];
};

export const listFallbackRecipes = async () =>
  readDataFile<StoredRecipe[]>(fileName, buildSeedRecipes);

export const createFallbackRecipe = async (input: CreateFallbackRecipeInput) => {
  const recipes = await listFallbackRecipes();
  const patients = await listFallbackPatients();
  const patient = patients.find((item) => item.id === input.pacienteId);

  if (!patient) {
    throw new Error('Paciente no encontrado');
  }

  await syncFallbackDocumentSequence('RECETA', recipes.length);
  const sequence = await nextFallbackDocumentSequence('RECETA');

  const recipe: StoredRecipe = {
    id: randomUUID(),
    codigo: buildDocumentNumberFromSequence(sequence),
    fecha: new Date().toISOString(),
    diagnostico: input.diagnostico.trim(),
    indicaciones: input.indicaciones.trim(),
    firmada: input.firmada ?? false,
    pacienteId: patient.id,
    pacienteNombres: patient.nombres,
    pacienteApellidos: patient.apellidos,
    medicoNombre: 'Dr. Demo DentaFlow',
  };

  recipes.unshift(recipe);
  await writeDataFile(fileName, recipes);
  return recipe;
};
