import { mesAnterior } from '../fideicomiso/fideicomiso.service';
import { estadoCuentaInversor, repartirPorParticipacion } from './inversores-calculos';

describe('inversores — cálculos', () => {
  it('reparte por participación; lo que no cubren las participaciones es de la desarrolladora', () => {
    const r = repartirPorParticipacion(
      1_000_000,
      [
        { id: 'a', pct: 30 },
        { id: 'b', pct: 20 },
        { id: 'c', pct: 0 },
      ],
      0,
    );
    expect(r.lineas).toEqual([
      { id: 'a', pct: 30, monto: 300_000 },
      { id: 'b', pct: 20, monto: 200_000 },
    ]);
    expect(r.para_inversores).toBe(500_000);
    expect(r.para_desarrolladora).toBe(500_000);
  });

  it('por resto mayor: suma exacta', () => {
    const r = repartirPorParticipacion(
      100,
      [
        { id: 'a', pct: 33.3333 },
        { id: 'b', pct: 33.3333 },
        { id: 'c', pct: 33.3334 },
      ],
      2,
    );
    expect(r.lineas.reduce((a, l) => a + l.monto, 0)).toBeCloseTo(100, 6);
    expect(r.para_desarrolladora).toBe(0);
  });

  it('sin inversores con participación no hay líneas', () => {
    expect(repartirPorParticipacion(100, [{ id: 'a', pct: 0 }], 0).lineas).toEqual([]);
  });

  it('estado de cuenta: aportado contra recibido (dinero + canjes)', () => {
    const c = estadoCuentaInversor(
      {
        aportes: [
          { tipo: 'DINERO', monto: 100_000 },
          { tipo: 'TERRENO', monto: 200_000 },
        ],
        distribuciones: [
          { monto: 50_000, pagado: true },
          { monto: 30_000, pagado: false },
        ],
        canjes: [{ valor: 280_000 }],
      },
      2,
    );
    expect(c).toMatchObject({
      aportado: 300_000,
      aportes_por_tipo: { DINERO: 100_000, TERRENO: 200_000 },
      distribuido: 80_000,
      pagado: 50_000,
      pendiente_de_pago: 30_000,
      canjes: 280_000,
      recibido: 360_000,
      saldo: 60_000,
      multiplo: 1.2,
    });
  });

  it('mes anterior para el informe mensual', () => {
    expect(mesAnterior('2026-10-01')).toEqual({ desde: '2026-09-01', hasta: '2026-09-30' });
    expect(mesAnterior('2027-01-15')).toEqual({ desde: '2026-12-01', hasta: '2026-12-31' });
    expect(mesAnterior('2028-03-01')).toEqual({ desde: '2028-02-01', hasta: '2028-02-29' });
  });
});
