package no.valg.valgnatt.database.hibernate;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import no.valg.valgnatt.database.domene.Kjonn;

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

@Entity
@Table(name = "KANDIDATER")
@NoArgsConstructor //Hibernate-krav
@AllArgsConstructor //Builder-krav
@Builder
public class Kandidat implements java.io.Serializable {

	private static final int ANT_SIFFER_I_ÅRSTALL = 4;

	@Getter
	@Setter
	@EmbeddedId
	private KandidatId id;

	@Getter
	@Setter
	@Column(name = "NAVN", nullable = false, length = 200)
	private String navn;

	@Getter
	@Setter
	@Column(name = "FODSELSDATO", nullable = false, length = 44)
	private String fodselsdato;

	@Getter
	@Setter
	@Column(name = "BOSTED", length = 16)
	private String bosted;

	@Setter
	@Column(name = "KJONN")
	private String kjonn;

	public Kjonn getKjonn() {
		return kjonn == null ? null : Kjonn.valueOf(kjonn);
	}

	public Integer getAlder() {
		if (fodselsdato != null) {
			return beregnAlder(id.getValgaar(), fodselsdato);
		}
		return null;
	}

	private Integer beregnAlder(int valgår, String fødselsdato) {
		LocalDate valgdag = beregnValgdag(valgår);
		LocalDate fodselsdag = LocalDate.parse(fødselsdato, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
		return (int) ChronoUnit.YEARS.between(fodselsdag, valgdag);
	}

	// Antar valgdagen er 2. mandag i september i valgåret - det stemmer stort sett (unntak i 1997)
	private LocalDate beregnValgdag(int valgår) {
		LocalDate dato = LocalDate.of(valgår, 9,1);
		int ukedagNr = dato.getDayOfWeek().getValue();
		int andreMandagISep;
		if (ukedagNr == 1) {
			andreMandagISep = 7;
		} else {
			andreMandagISep = (8-ukedagNr)+ 7;
		}
		return dato.plusDays(andreMandagISep);
	}

	@Override
	public String toString() {
		return "Kandidat{" +
				"id=" + id +
				", navn='" + navn + '\'' +
				", fodselsdato='" + fodselsdato + '\'' +
				", bosted='" + bosted + '\'' +
				'}';
	}

}
