import { SolicitudesCreditoService } from './solicitudes-credito.service';

describe('SolicitudesCreditoService - plan_cuota_id (Fase 7)', () => {
  const createService = (prismaOverrides: Record<string, any> = {}) => {
    const prisma = {
      clientes: {
        findFirst: jest.fn().mockResolvedValue({ id: 'cliente-1', personas: { razon_social: 'Cliente Test' } }),
      },
      solicitud_credito: {
        create: jest.fn().mockImplementation(({ data }) => Promise.resolve({ id: 'sol-1', ...data })),
        update: jest.fn().mockImplementation(({ data }) => Promise.resolve({ id: 'sol-1', ...data })),
      },
      $transaction: jest.fn(async (cb) => cb(prisma)),
      ...prismaOverrides,
    };
    const service = new SolicitudesCreditoService(prisma as any);
    // Colaboradores internos de create()/update() — no forman parte de lo que este
    // test verifica (el passthrough de plan_cuota_id), se stubean directamente.
    jest.spyOn(service as any, 'logHistorial').mockResolvedValue(undefined);
    jest.spyOn(service as any, 'findOneInternal').mockResolvedValue({ id: 'sol-1' });
    jest.spyOn(service as any, 'assertEditable').mockResolvedValue({ id: 'sol-1', estado: 'borrador' });
    return { service, prisma };
  };

  it('crearla con plan_cuota_id lo persiste', async () => {
    const { service, prisma } = createService();

    await service.create(
      { cliente_id: 'cliente-1', estado: 'borrador', plan_cuota_id: 'plan-1' } as any,
      'emp-1',
      'user-1',
    );

    const dataEnviada = prisma.solicitud_credito.create.mock.calls[0][0].data;
    expect(dataEnviada.plan_cuota_id).toBe('plan-1');
  });

  it('crearla sin plan_cuota_id lo deja null (retrocompatible)', async () => {
    const { service, prisma } = createService();

    await service.create({ cliente_id: 'cliente-1', estado: 'borrador' } as any, 'emp-1', 'user-1');

    const dataEnviada = prisma.solicitud_credito.create.mock.calls[0][0].data;
    expect(dataEnviada.plan_cuota_id).toBeNull();
  });

  it('actualizarla con plan_cuota_id lo persiste', async () => {
    const { service, prisma } = createService();

    await service.update('sol-1', { plan_cuota_id: 'plan-2' } as any, 'emp-1', 'user-1');

    const dataEnviada = prisma.solicitud_credito.update.mock.calls[0][0].data;
    expect(dataEnviada.plan_cuota_id).toBe('plan-2');
  });

  it('actualizarla sin tocar plan_cuota_id no lo incluye en el update (no lo pisa)', async () => {
    const { service, prisma } = createService();

    await service.update('sol-1', { observaciones: 'test' } as any, 'emp-1', 'user-1');

    const dataEnviada = prisma.solicitud_credito.update.mock.calls[0][0].data;
    expect(dataEnviada.plan_cuota_id).toBeUndefined();
  });
});
