package de.accso.flexinale.data.model;

import de.accso.flexinale.application.KontingentBereitsAusgeschoepftException;
import de.accso.flexinale.shared_code_for_test.TestDataBuilder;
import org.junit.jupiter.api.Test;

import java.time.LocalDateTime;

import static de.accso.flexinale.data.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() {
        Kontingent kontingent = TestDataBuilder.createKontingent(30, 33);

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

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

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

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

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

    @Test
    void testOnlineKontingentCalculationQuote0() {
        Kontingent kontingent = TestDataBuilder.createKontingent(29, 0);
        assertThat(kontingent.getRestKontingentOnline()).isEqualTo(0);
        assertThat(kontingent.getRestKontingentZentral()).isEqualTo(14);
        assertThat(kontingent.getRestKontingentKinokasse()).isEqualTo(15);
    }

    @Test
    void testNotEnoughKontingent() {
        KinoSaal kinoSaal = TestDataBuilder.createKinoWithKinosaele(20).kinoSaele.iterator().next();
        Vorfuehrung vorfuehrung = TestDataBuilder.createVorfuehrung(LocalDateTime.now(), null, kinoSaal, 90);

        assertThatThrownBy(() -> {
            vorfuehrung.verkaufeTickets(KINOKASSE, 4);
        })
        .isInstanceOf(KontingentBereitsAusgeschoepftException.class);

        assertThat(vorfuehrung.kontingent.getRestKontingentOnline()).isEqualTo(18);
        assertThat(vorfuehrung.kontingent.getRestKontingentZentral()).isEqualTo(1);
        assertThat(vorfuehrung.kontingent.getRestKontingentKinokasse()).isEqualTo(1);
        assertThat(vorfuehrung.getGesamtkapazitaetVerkauf()).isEqualTo(20);
    }
}
