package org.jboss.as.test.integration.jpa.hibernate.envers;

import java.util.List;
import jakarta.ejb.Stateless;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;

import org.hibernate.envers.AuditReader;
import org.hibernate.envers.AuditReaderFactory;

/**
 * @author Madhumita Sadhukhan
 */
@Stateless
public class SLSBAuditMO {
    @PersistenceContext(unitName = "myCustPhone")
    EntityManager em;

    public CustomerMO createCustomer(String firstName, String surName, String type, String areacode, String phnumber) {
        PhoneMO phone1 = new PhoneMO();
        phone1.setNumber(phnumber);
        phone1.setAreacode(areacode);
        phone1.setType(type);

        PhoneMO phone2 = new PhoneMO();
        phone2.setNumber("777222123");
        phone2.setAreacode("+420");
        phone2.setType("HOME");

        CustomerMO cust = new CustomerMO();
        cust.setFirstname(firstName);
        cust.setSurname(surName);

        cust.getPhones().add(phone1);
        cust.getPhones().add(phone2);
        em.persist(cust);

        em.persist(phone1);
        em.persist(phone2);

        return cust;
    }

    public CustomerMO updateCustomer(CustomerMO c) {
        return em.merge(c);
    }

    public PhoneMO createPhone(String type, String areacode, String phnumber) {
        PhoneMO phone1 = new PhoneMO();
        phone1.setNumber(phnumber);
        phone1.setAreacode(areacode);
        phone1.setType(type);
        em.persist(phone1);

        return phone1;
    }

    public PhoneMO updatePhone(PhoneMO p) {
        return em.merge(p);
    }

    public void deletePhone(PhoneMO p) {
        em.remove(em.merge(p));
    }

    public int retrieveOldPhoneListSizeFromCustomer(int id) {

        AuditReader reader = AuditReaderFactory.get(em);
        List<Number> revList = reader.getRevisions(CustomerMO.class, id);
        CustomerMO cust_rev = reader.find(CustomerMO.class, id, revList.get(revList.size() - 1));
        return cust_rev.getPhones().size();
    }

    public String retrieveOldPhoneListVersionFromCustomer(int id) {
        AuditReader reader = AuditReaderFactory.get(em);

        CustomerMO cust_rev = reader.find(CustomerMO.class, id, 1);
        return cust_rev.getPhones().get(0).getType();
    }

}
