package de.accso.flexinale.ticketing.domain.model;

import de.accso.flexinale.backoffice.domain.model.Vorfuehrung;
import de.accso.flexinale.shared_code_for_test.TestDataBuilder;
import de.accso.flexinale.ticketing_api_contract.api_contract.KontingentBereitsAusgeschoepftException;
import org.junit.jupiter.api.Test;

import static de.accso.flexinale.ticketing.domain.model.Ticket.VerkaufsKanal.KINOKASSE;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

class KontingentTest {

    @Test
    void testOnlineKontingentCalculationQuote33() {
        Vorfuehrung vorfuehrung = TestDataBuilder.createVorfuehrung();
        Kontingent kontingent = TestDataBuilder.createKontingent(30, 33, vorfuehrung);

        assertThat(kontingent.getRestKontingentOnline().raw()).isEqualTo(10);
        assertThat(kontingent.getRestKontingentZentral().raw()).isEqualTo(10);
        assertThat(kontingent.getRestKontingentKinokasse().raw()).isEqualTo(10);
    }

    @Test
    void testOnlineKontingentCalculationQuote25() {
        Vorfuehrung vorfuehrung = TestDataBuilder.createVorfuehrung();
        Kontingent kontingent = TestDataBuilder.createKontingent(30, 25, vorfuehrung);

        assertThat(kontingent.getRestKontingentOnline().raw()).isEqualTo(8);
        assertThat(kontingent.getRestKontingentZentral().raw()).isEqualTo(11);
        assertThat(kontingent.getRestKontingentKinokasse().raw()).isEqualTo(11);
    }

    @Test
    void testOnlineKontingentCalculationQuote100() {
        Vorfuehrung vorfuehrung = TestDataBuilder.createVorfuehrung();
        Kontingent kontingent = TestDataBuilder.createKontingent(30, 100, vorfuehrung);

        assertThat(kontingent.getRestKontingentOnline().raw()).isEqualTo(30);
        assertThat(kontingent.getRestKontingentZentral().raw()).isEqualTo(0);
        assertThat(kontingent.getRestKontingentKinokasse().raw()).isEqualTo(0);
    }

    @Test
    void testOnlineKontingentCalculationQuote0() {
        Vorfuehrung vorfuehrung = TestDataBuilder.createVorfuehrung();
        Kontingent kontingent = TestDataBuilder.createKontingent(29, 0, vorfuehrung);

        assertThat(kontingent.getRestKontingentOnline().raw()).isEqualTo(0);
        assertThat(kontingent.getRestKontingentZentral().raw()).isEqualTo(14);
        assertThat(kontingent.getRestKontingentKinokasse().raw()).isEqualTo(15);
    }

    @Test
    void testNotEnoughKontingent() {
        Vorfuehrung vorfuehrung = TestDataBuilder.createVorfuehrung();
        Kontingent kontingent = TestDataBuilder.createKontingent(20, 90, vorfuehrung);

        assertThatThrownBy(() -> {
            kontingent.reduziereKontingent(KINOKASSE, 4);
        })
        .isInstanceOf(KontingentBereitsAusgeschoepftException.class);

        assertThat(kontingent.getRestKontingentOnline().raw()).isEqualTo(18);
        assertThat(kontingent.getRestKontingentKinokasse().raw()).isEqualTo(1);
        assertThat(kontingent.getRestKontingentZentral().raw()).isEqualTo(1);
    }

}