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

export type StoredTransaction = {
  id: string;
  referencia: string;
  monto: number;
  tipo: TipoTransaccion;
  fecha: string;
  descripcion: string;
  pacienteId: string;
  pacienteNombres: string;
  pacienteApellidos: string;
};

type CreateFallbackTransactionInput = {
  monto: number;
  tipo: TipoTransaccion;
  descripcion?: string;
  pacienteId?: string;
};

const fileName = 'transactions.json';

const buildSeedTransactions = async () => {
  const patients = await listFallbackPatients();
  const defaultPatient = patients[0];
  const now = new Date().toISOString();

  if (!defaultPatient) {
    return [] as StoredTransaction[];
  }

  return [
    {
      id: randomUUID(),
      referencia: 'CI001-000001',
      monto: 350,
      tipo: TipoTransaccion.INGRESO,
      fecha: now,
      descripcion: 'Pago inicial de tratamiento',
      pacienteId: defaultPatient.id,
      pacienteNombres: defaultPatient.nombres,
      pacienteApellidos: defaultPatient.apellidos,
    },
    {
      id: randomUUID(),
      referencia: 'CE001-000001',
      monto: 120,
      tipo: TipoTransaccion.EGRESO,
      fecha: now,
      descripcion: 'Compra de insumos operativos',
      pacienteId: 'local-cash',
      pacienteNombres: 'Caja',
      pacienteApellidos: 'General',
    },
  ];
};

export const listFallbackTransactions = async () =>
  readDataFile<StoredTransaction[]>(fileName, buildSeedTransactions);

export const createFallbackTransaction = async (input: CreateFallbackTransactionInput) => {
  const transactions = await listFallbackTransactions();
  const patients = await listFallbackPatients();
  const patient = input.pacienteId
    ? patients.find((item) => item.id === input.pacienteId)
    : null;
  await syncFallbackDocumentSequence(
    getFinanceDocumentSequenceType(input.tipo),
    transactions.filter((item) => item.tipo === input.tipo).length,
  );
  const sequence = await nextFallbackDocumentSequence(getFinanceDocumentSequenceType(input.tipo));

  const transaction: StoredTransaction = {
    id: randomUUID(),
    referencia: buildDocumentNumberFromSequence(sequence),
    monto: input.monto,
    tipo: input.tipo,
    fecha: new Date().toISOString(),
    descripcion:
      input.descripcion?.trim() ||
      (input.tipo === TipoTransaccion.INGRESO ? 'Pago registrado' : 'Movimiento de caja'),
    pacienteId: patient?.id ?? 'local-cash',
    pacienteNombres: patient?.nombres ?? 'Caja',
    pacienteApellidos: patient?.apellidos ?? 'General',
  };

  transactions.unshift(transaction);
  await writeDataFile(fileName, transactions);
  return transaction;
};
