<?php

use App\Livewire\Admin\PaymentProblems;
use App\Services\Billing\DunningSchedule;
use Livewire\Livewire;

// admin() helper defined in HostManagementTest.

/**
 * Im Feld Euro, in der Datenbank Cent.
 *
 * Das Feld hiess „Gebühr 2. Mahnung (Cent)" und enthielt 500. Wer eine
 * Mahngebühr einträgt, denkt in Euro und tippt „5" — aus fünf Euro wurden fünf
 * Cent, und nichts hat widersprochen. Gespeichert wird weiter in Cent, wie
 * ueberall sonst im Produkt; nur die Eingabe spricht die Sprache des Menschen.
 */
it('zeigt hinterlegte Gebuehren in Euro an', function () {
    DunningSchedule::class; // Autoload
    app(\App\Support\Settings::class);

    \App\Support\Settings::set(DunningSchedule::FEES, [2 => 500, 3 => 1000]);

    $fees = Livewire::actingAs(admin(), 'operator')->test(PaymentProblems::class)->get('fees');

    expect($fees[2])->toBe('5')
        ->and($fees[3])->toBe('10');
});

it('speichert eine Eingabe in Euro als Cent', function () {
    Livewire::actingAs(admin(), 'operator')->test(PaymentProblems::class)
        ->set('days', [0, 3, 10, 17, 24])
        ->set('feeFromLevel', 2)
        ->set('fees.2', '7,50')
        ->set('fees.3', '12')
        ->call('saveSchedule')
        ->assertHasNoErrors();

    expect(DunningSchedule::feeCents(2))->toBe(750)
        ->and(DunningSchedule::feeCents(3))->toBe(1200);
});

it('rundet statt abzuschneiden', function () {
    // (int) (19.99 * 100) ist in PHP 1998 — die Gleitkommazahl liegt knapp
    // darunter. Ein Cent, der bei jedem Speichern verschwindet, faellt erst nach
    // Monaten auf.
    Livewire::actingAs(admin(), 'operator')->test(PaymentProblems::class)
        ->set('days', [0, 3, 10, 17, 24])
        ->set('feeFromLevel', 2)
        ->set('fees.2', '19,99')
        ->set('fees.3', '0')
        ->call('saveSchedule')
        ->assertHasNoErrors();

    expect(DunningSchedule::feeCents(2))->toBe(1999);
});

it('nimmt auch einen Punkt als Dezimaltrenner', function () {
    Livewire::actingAs(admin(), 'operator')->test(PaymentProblems::class)
        ->set('days', [0, 3, 10, 17, 24])
        ->set('feeFromLevel', 2)
        ->set('fees.2', '5.25')
        ->set('fees.3', '0')
        ->call('saveSchedule')
        ->assertHasNoErrors();

    expect(DunningSchedule::feeCents(2))->toBe(525);
});

it('weist Unfug zurueck, statt ihn auf null zu runden', function () {
    Livewire::actingAs(admin(), 'operator')->test(PaymentProblems::class)
        ->set('days', [0, 3, 10, 17, 24])
        ->set('feeFromLevel', 2)
        ->set('fees.2', 'fuenf')
        ->set('fees.3', '0')
        ->call('saveSchedule')
        ->assertHasErrors('fees.2');
});
