package at.vvo.omds.client;

import at.vvo.omds.types.omds2.v2_17.NATUERLICHEPERSONType;
import at.vvo.omds.types.omds2.v2_17.PersArtCdType;
import at.vvo.omds.types.omds3.r2025_05.common.AdresseType;
import at.vvo.omds.types.omds3.r2025_05.common.ObjektIdType;
import at.vvo.omds.types.omds3.r2025_05.common.PersonType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.GregorianCalendar;
/**
 * Hilfsmethoden für die Erzeugung von Requests.
 */
public class BuildRequestHelper {

    static Logger log = LoggerFactory.getLogger(BuildRequestHelper.class);
    /** Privater default Constructor versteckt den nicht benötigten Default-Constructor. */
    private BuildRequestHelper() {
    }

    public static XMLGregorianCalendar omdsDatum(int year, int month, int day) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd");
        try {
            GregorianCalendar c = new GregorianCalendar();
            c.set(year, month, day);
            return DatatypeFactory.newInstance().newXMLGregorianCalendar(c.toZonedDateTime().format(formatter));
        } catch (DatatypeConfigurationException e) {
            log.atError().log("Datum konnte nicht erzeugt werden");
            throw new RuntimeException(e);
        }
    }

    public static XMLGregorianCalendar aktuellesDatum() {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss");
        try {
            GregorianCalendar c = new GregorianCalendar();
            return DatatypeFactory.newInstance().newXMLGregorianCalendar(c.toZonedDateTime().format(formatter));
        } catch (DatatypeConfigurationException e) {
            log.atError().log("Datum konnte nicht erzeugt werden");
            throw new RuntimeException(e);
        }
    }

    public static XMLGregorianCalendar zuXml(LocalDate localDate) {
        XMLGregorianCalendar xmlGregorianCalendar = null;
        try {
            xmlGregorianCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(localDate.toString());
        } catch (DatatypeConfigurationException e) {
            log.atError().log(String.format("DatatypeConfigurationException %s", e.getMessage()));
        }
        return xmlGregorianCalendar;
    }

    public static XMLGregorianCalendar hauptfalligkeit(int monat) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss");
        try {
            GregorianCalendar c = new GregorianCalendar();
            c.set(Calendar.MONTH, monat);
            c.set(Calendar.DAY_OF_MONTH, 1);
            c.set(Calendar.HOUR_OF_DAY, 0);
            c.set(Calendar.MINUTE, 0);
            c.set(Calendar.SECOND, 0);
            c.set(Calendar.MILLISECOND, 0);
            return DatatypeFactory.newInstance().newXMLGregorianCalendar(c.toZonedDateTime().format(formatter));
        } catch (DatatypeConfigurationException e) {
            log.atError().log("Datum konnte nicht erzeugt werden");
            throw new RuntimeException(e);
        }
    }

    public static PersonType createNatPerson(String vorname, String nachname, LocalDate gebDat, String strasse, String hausnr, int plz, String ort) {
        PersonType person = new PersonType();

        person.setPersArtCd(PersArtCdType.N);   //neu
        NATUERLICHEPERSONType natPerson = new NATUERLICHEPERSONType();
        natPerson.setFamilienname(nachname);
        natPerson.setVorname(vorname);
        natPerson.setGebdat(BuildRequestHelper.zuXml(gebDat));
        natPerson.setGeschlechtCd("1");
        natPerson.setFamilienstandCd("0");  // neu
        natPerson.setLandesCd("AUT");       // neu
        person.setNATUERLICHEPERSON(natPerson);
        AdresseType adresse = new AdresseType();
        person.setAdresse(adresse);
        adresse.setOrt(ort);
        adresse.setPLZ(Integer.toString(plz));
        adresse.setStrasse(strasse);
        adresse.setHausnr(hausnr);
        adresse.setLandesCd("AUT");         //neu
        ObjektIdType objektId = new ObjektIdType(); //neu
        objektId.setId("1");                        //neu
        adresse.setObjektId(objektId);              //neu
        return person;
    }

    public static PersonType createNatPerson(String vorname, String nachname, int gebJahr, int gebMonat, int gebTag) {
        PersonType person = new PersonType();

        person.setPersArtCd(PersArtCdType.N);   //neu
        NATUERLICHEPERSONType natPerson = new NATUERLICHEPERSONType();
        natPerson.setFamilienname(nachname);
        natPerson.setVorname(vorname);
        natPerson.setGebdat(BuildRequestHelper.omdsDatum(gebJahr, gebMonat, gebTag));
        natPerson.setGeschlechtCd("1");
        natPerson.setFamilienstandCd("0");  // neu
        natPerson.setLandesCd("AUT");       // neu
        person.setNATUERLICHEPERSON(natPerson);
        AdresseType adresse = new AdresseType();
        person.setAdresse(adresse);
        adresse.setOrt("Wien");
        adresse.setPLZ("1020");
        adresse.setStrasse("Schüttelstraße");
        adresse.setHausnr("99");
        adresse.setZusatz("7");
        adresse.setLandesCd("AUT");         //neu
        ObjektIdType objektId = new ObjektIdType(); //neu
        objektId.setId("1");                        //neu
        adresse.setObjektId(objektId);              //neu

        return person;
    }

}
