package hu.sch.ejb;

import hu.sch.domain.enums.ValuationPeriod;
import hu.sch.domain.SystemAttribute;
import hu.sch.domain.Semester;
import hu.sch.domain.logging.Log;
import hu.sch.services.SystemManagerLocal;
import hu.sch.services.exceptions.NoSuchAttributeException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @author hege
 */
@Stateless
public class SystemManagerBean implements SystemManagerLocal {

    private static final Logger logger = LoggerFactory.getLogger(SystemManagerBean.class);
    //
    static final String baseLink = "https://korok.sch.bme.hu/korok/";
    static final String showUserLink = baseLink + "showuser/id/";
    static final String valuationLink = baseLink + "valuation";
    static final String considerLink = baseLink + "consider";
    //
    @PersistenceContext
    EntityManager em;
    @EJB
    MailManagerBean mailManager;

    @Override
    public String getAttributeValue(String attributeName) throws NoSuchAttributeException {
        try {
            SystemAttribute attr = getAttribute(attributeName);

            return attr.getAttributeValue();
        } catch (NoResultException nre) {
            throw new NoSuchAttributeException(attributeName);
        }
    }

    private SystemAttribute getAttribute(String attributeName) {
        TypedQuery<SystemAttribute> q = em.createNamedQuery(SystemAttribute.findByAttributeName, SystemAttribute.class);
        q.setParameter("attributeName", attributeName);

        return q.getSingleResult();
    }

    @Override
    public void setAttributeValue(String attributeName, String attributeValue) {
        SystemAttribute attr;
        try {
            attr = getAttribute(attributeName);
        } catch (Exception e) {
            attr = new SystemAttribute();
            attr.setAttributeName(attributeName);
        }

        attr.setAttributeValue(attributeValue);

        em.merge(attr);
    }

    @Override
    public Semester getSzemeszter() {
        String s;
        Semester szemeszter = new Semester();
        s = getAttributeValue(SystemAttribute.SEMESTER);
        szemeszter.setId(s);

        return szemeszter;
    }

    @Override
    public void setSzemeszter(Semester szemeszter) {
        setAttributeValue(SystemAttribute.SEMESTER, szemeszter.getId());
    }

    @Override
    public ValuationPeriod getErtekelesIdoszak() {
        try {
            return ValuationPeriod.valueOf(getAttributeValue(SystemAttribute.VALUATION_PERIOD));
        } catch (Exception any) {
            return ValuationPeriod.NINCSERTEKELES;
        }
    }

    @Override
    public void setErtekelesIdoszak(ValuationPeriod idoszak) {
        setAttributeValue(SystemAttribute.VALUATION_PERIOD, idoszak.toString());
    }

    @Override
    public long getLastLogId() {
        long id;
        final String lastLog = getAttributeValue(SystemAttribute.LAST_LOG);
        try {
            id = Long.parseLong(lastLog);
        } catch (NumberFormatException ex) {
            // TODO - későbbi releasenél (> 2.4) ezt el lehet távolítani, ha biztos,
            // hogy már átállt a DB-ben a dátum mező ID-re.
            // nem szám van ott lehet, hogy egy évszám?
            try {
                logger.info("A DB-ben a(z) " + SystemAttribute.LAST_LOG + " rendszerattribútum még dátumot tartalmaz logID helyett.");
                Date date = new SimpleDateFormat("yyyy-MM-dd").parse(lastLog);
                Calendar c = Calendar.getInstance();
                c.setTime(date);
                c.add(Calendar.DAY_OF_YEAR, -1); // vonjunk ki belőle egyet
                // lekérdezzük az adott napon a legfrissebb ID-t.
                Query q = em.createNamedQuery(Log.getLastLogIdByDate);
                q.setParameter("date", c.getTime());
                q.setMaxResults(1);
                // ezzel az előző napi utolsó logID-t kapjuk meg, ami pont jó,
                // mert akkor feldolgozásra igazából az ezutáni kerül
                id = (Long) q.getSingleResult();
            } catch (ParseException ex1) {
                // se nem szám, se nem évszám, akkor itt gubanc van.
                throw new RuntimeException("A(z) " + SystemAttribute.LAST_LOG + " rendszerattribútum se nem szám, se nem dátum, hogy lehetett ez?");
            }
        }
        return id;
    }

    @Override
    public void setLastLogId(long id) {
        setAttributeValue(SystemAttribute.LAST_LOG, String.valueOf(id));
    }

    @Override
    public boolean getNewbieTime() {
        boolean ret;
        try {
            ret = Boolean.parseBoolean(getAttributeValue(SystemAttribute.NEWBIE_TIME));
        } catch (NoSuchAttributeException nsae) {
            ret = false;
        }

        return ret;
    }

    @Override
    public void setNewbieTime(boolean newbieTime) {
        setAttributeValue(SystemAttribute.NEWBIE_TIME, Boolean.toString(newbieTime));
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void sendExceptionReportMail(final Map<SystemManagerLocal.EXC_REPORT_KEYS, String> params) {
        final String subject =
                MailManagerBean.getMailString(MailManagerBean.MAIL_SYSTEM_EXCEPTIONREPORT_SUBJECT);

        final String body =
                MailManagerBean.getMailString(MailManagerBean.MAIL_SYSTEM_EXCEPTIONREPORT_BODY);

        final Object[] args = new Object[]{
            params.get(SystemManagerLocal.EXC_REPORT_KEYS.PAGE_NAME),
            params.get(SystemManagerLocal.EXC_REPORT_KEYS.PAGE_PATH),
            params.get(SystemManagerLocal.EXC_REPORT_KEYS.PAGE_PARAMS),
            params.get(SystemManagerLocal.EXC_REPORT_KEYS.REMOTE_USER),
            params.get(SystemManagerLocal.EXC_REPORT_KEYS.REMOTE_ADDRESS),
            params.get(SystemManagerLocal.EXC_REPORT_KEYS.EMAIL),
            params.get(SystemManagerLocal.EXC_REPORT_KEYS.VIRID),
            params.get(SystemManagerLocal.EXC_REPORT_KEYS.EXCEPTION)
        };

        mailManager.sendEmail("jee-dev@sch.bme.hu", subject, String.format(body, args));
    }
}

@@ -3186,25 +3186,8 @@
 ) %7B%0A
-        long id;%0A
     
@@ -3270,1422 +3270,38 @@
     
-try %7B%0A            id = Long.parseLong(lastLog);%0A        %7D catch (NumberFormatException ex) %7B%0A            // TODO - k%C3%A9s%C5%91bbi releasen%C3%A9l (%3E 2.4) ezt el lehet t%C3%A1vol%C3%ADtani, ha biztos,%0A            // hogy m%C3%A1r %C3%A1t%C3%A1llt a DB-ben a d%C3%A1tum mez%C5%91 ID-re.%0A            // nem sz%C3%A1m van ott lehet, hogy egy %C3%A9vsz%C3%A1m?%0A            try %7B%0A                logger.info(%22A DB-ben a(z) %22 + SystemAttribute.LAST_LOG + %22 rendszerattrib%C3%BAtum m%C3%A9g d%C3%A1tumot tartalmaz logID helyett.%22);%0A                Date date = new SimpleDateFormat(%22yyyy-MM-dd%22).parse(lastLog);%0A                Calendar c = Calendar.getInstance();%0A                c.setTime(date);%0A                c.add(Calendar.DAY_OF_YEAR, -1); // vonjunk ki bel%C5%91le egyet%0A                // lek%C3%A9rdezz%C3%BCk az adott napon a legfrissebb ID-t.%0A                Query q = em.createNamedQuery(Log.getLastLogIdByDate);%0A                q.setParameter(%22date%22, c.getTime());%0A                q.setMaxResults(1);%0A                // ezzel az el%C5%91z%C5%91 napi utols%C3%B3 logID-t kapjuk meg, ami pont j%C3%B3,%0A                // mert akkor feldolgoz%C3%A1sra igaz%C3%A1b%C3%B3l az ezut%C3%A1ni ker%C3%BCl%0A                id = (Long) q.getSingleResult();%0A            %7D catch (ParseException ex1) %7B%0A                // se nem sz%C3%A1m, se nem %C3%A9vsz%C3%A1m, akkor itt gubanc van.%0A                throw new RuntimeException(%22A(z) %22 + SystemAttribute.LAST_LOG + %22 rendszerattrib%C3%BAtum se nem sz%C3%A1m, se nem d%C3%A1tum, hogy lehetett ez?%22);%0A            %7D%0A        %7D%0A        return id
+return Long.parseLong(lastLog)
 ;%0A  

Remove deprecated code, db value of LAST_LOG checked