package no.valg.valgnatt.backend.rapport;

import java.util.List;

import javax.annotation.Resource;
import javax.sql.DataSource;
import no.valg.valgnatt.database.GrunnlagsdataCache;
import no.valg.valgnatt.database.dao.RapportDao;
import no.valg.valgnatt.database.domene.ValgType;
import no.valg.valgnatt.database.geografi.Land;
import no.valg.valgnatt.database.hibernate.Rapport;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Transactional
@Service
public class RapportService {

	private static final Logger LOG = LogManager.getLogger(RapportService.class);

	@Resource
	private RapportDao rapportDao;
	@Resource
	private DataSource dataSource;
	@Resource
	private GrunnlagsdataCache grunnlagsdataCache;

	public List<Rapport> getReports() {
		return rapportDao.list();
	}

	public Rapport lagRapport(String rapportNavn, MainRapport main, int sisteSekvensNr) {
		long start = System.currentTimeMillis();
		String rapportInnhold;
		if (rapportNavn.endsWith("/ujm")) {
			rapportInnhold = UtjevningsmandatRapport.lagRapport(dataSource, grunnlagsdataCache, main);
		} else if (rapportNavn.startsWith("totalrapport")) {
			Land land = main.getGrunnlagsdataCache().getLand(ValgType.valueOf(rapportNavn.split("/")[1].toUpperCase()));
			rapportInnhold = TotalRapport.lagRapport(rapportNavn, main.getValgAar(), land, main.getRapportNavnMap());
		} else {
			Land land = main.getGrunnlagsdataCache().getLand(ValgType.valueOf(rapportNavn.split("/")[0].toUpperCase()));
			rapportInnhold = ResultatRapport.lagRapport(rapportNavn, main.getValgAar(), land, main.getRapportNavnMap());
		}
		Rapport rapport = new Rapport();
		rapport.setRappnavn(rapportNavn);
		rapport.setRappsekvens(sisteSekvensNr + 1);
		rapport.setJson(rapportInnhold);
		long middle = System.currentTimeMillis();
		rapportDao.saveOrUpdate(rapport);
		String saveUpdateMs = (System.currentTimeMillis() - middle) + " ms";
		String totalMs = (System.currentTimeMillis() - start) + " ms";
		LOG.info(String.format("createReport: %-15s (%9s) (%9s)", rapportNavn, saveUpdateMs, totalMs));
		return rapport;
	}
}
