package no.valg.valgnatt.database.geografi;

import lombok.Getter;
import lombok.Setter;

import java.math.BigDecimal;

@Getter
@Setter
public class Mandater {

    private int antall; // mandater
    private int sisteAntall; // mandater siste valg (vil være av annen type enn dette valget)
    private int nestsisteAntall; // mandater nestsiste valg
    private BigDecimal lavesteKvotientMedMandat;
    private BigDecimal høyesteKvotientUtenMandat;
    private Integer lavesteMandatrangMedMandat;
    private Integer høyesteMandatrangUtenMandat;

    Mandater() {
    }

    public Mandater(int antall, int sisteAntall, int nestsisteAntall) {
        this.antall = antall;
        this.sisteAntall = sisteAntall;
        this.nestsisteAntall = nestsisteAntall;
    }

    void aggreger(Mandater mandater, boolean harStartetOpptelling) {
        this.antall += mandater.getAntall();
        if (harStartetOpptelling) {
            this.sisteAntall += mandater.getSisteAntall();
            this.nestsisteAntall += mandater.getNestsisteAntall();
        }
        oppdaterLavesteKvotientMedMandat(mandater.getLavesteKvotientMedMandat());
        oppdaterHøyesteKvotientUtenMandat(mandater.getHøyesteKvotientUtenMandat());
        oppdaterLavesteMandatrangMedMandat(mandater.getLavesteMandatrangMedMandat());
        oppdaterHøyesteMandatrangUtenMandat(mandater.getHøyesteMandatrangUtenMandat());
    }

    private void oppdaterLavesteKvotientMedMandat(BigDecimal kvotient) {
        if (kvotient == null || kvotient.equals(BigDecimal.ZERO)) {
            return;
        }
        if (this.lavesteKvotientMedMandat == null || (kvotient.doubleValue() < this.lavesteKvotientMedMandat.doubleValue() && kvotient.doubleValue() > 0)) {
            this.lavesteKvotientMedMandat = kvotient;
        }
    }
    
    private void oppdaterHøyesteKvotientUtenMandat(BigDecimal kvotient) {
        if (kvotient == null || kvotient.equals(BigDecimal.ZERO)) {
            return;
        }
        if (this.høyesteKvotientUtenMandat == null || (kvotient.doubleValue() > this.høyesteKvotientUtenMandat.doubleValue() && kvotient.doubleValue() > 0)) {
            this.høyesteKvotientUtenMandat = kvotient;
        }
    }

    private void oppdaterLavesteMandatrangMedMandat(Integer mandatrang) {
        if (mandatrang == null || mandatrang == 0) {
            return;
        }
        if (this.lavesteMandatrangMedMandat == null || (mandatrang > this.lavesteMandatrangMedMandat && mandatrang > 0)) {
            this.lavesteMandatrangMedMandat = mandatrang;
        }
    }
    
    private void oppdaterHøyesteMandatrangUtenMandat(Integer mandatrang) {
        if (mandatrang == null || mandatrang == 0) {
            return;
        }
        if (this.høyesteMandatrangUtenMandat == null || (mandatrang < this.høyesteMandatrangUtenMandat && mandatrang > 0)) {
            this.høyesteMandatrangUtenMandat = mandatrang;
        }
    }

    @Override
    public String toString() {
        return "Ant: " + antall + "/" + sisteAntall + "/" + nestsisteAntall;
    }

    public void nullstill() {
        antall = 0;
    }
}
