package com.fp.general.rules.query.trans.panel;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fp.persistence.commondb.HqlStatement;
import com.fp.dto.Response;
import com.fp.dto.query.QueryRequest;
import com.fp.dto.rules.QueryRule;
import com.fp.persistence.pgeneral.page.TgeneTransactionPages;

/**
 * Clase que se encarga de entregar una lista con las paginas a contruir paneles dinamicamente 
 * en la pantalla. 
 * @author Jorge Vaca
 * @version 2.1
 */
public class TransactionPanels extends QueryRule {

    private String filterTitle;

    /**
     * Metodo que obtiene saldos promedio de una cuenta a la vista.
     * @param pQueryRequest  Datos de entrada de la consulta.
     */
    public QueryRequest process(QueryRequest pQueryRequest) throws Exception {
        Response response = pQueryRequest.getResponse();
        this.filterTitle = (String) pQueryRequest.get("filterTitle");
        List<Map<String, Object>> lData = this.fillData(pQueryRequest);
        response.put("TRANSPANELS", lData);
        return pQueryRequest;
    }

    /**
     * Metodo que llena una lista de paginas asociadas a una transaccion.
     * @param pQueryRequest  Datos del request.
     * @return  List<Map<String, Object>>
     * @throws Exception
     */
    private List<Map<String, Object>> fillData(QueryRequest pQueryRequest) throws Exception {
        List<Map<String, Object>> lData = new ArrayList<Map<String, Object>>();
        List<TgeneTransactionPages> lPages = this.getTgeneTransactionPages(pQueryRequest.getTransactionModule(),
                pQueryRequest.getTransactionCode(), pQueryRequest.getTransactionVersion());
        for (TgeneTransactionPages tgeneTransactionPages : lPages) {
            Map<String, Object> m = new HashMap<String, Object>();
            m.put("cod", tgeneTransactionPages.getPk().getSequence());
            m.put("t", tgeneTransactionPages.getTitle());
            m.put("p", tgeneTransactionPages.getPage());
            m.put("q", tgeneTransactionPages.getQueryfunction());
            m.put("s", tgeneTransactionPages.getSavefunction());
            m.put("d", "N");
            m.put("down", tgeneTransactionPages.getAutodownload());
            lData.add(m);
        }
        lPages = null;
        return lData;
    }

    /**
     * Metodo que entrega una lista de paginas a asociar en paneles en paginas.
     * @param pModule  Codigo de modulo.
     * @param pTransaction  Codigo de transaccion.
     * @param pVersion  Version de la transaccion.
     * @return	List<TgeneTransactionPages>
     * @throws Exception
     */
    @SuppressWarnings("unchecked")
    private List<TgeneTransactionPages> getTgeneTransactionPages(String pModule, Integer pTransaction, Integer pVersion) throws Exception {
        List<TgeneTransactionPages> lData = null;
        String sentence = null;
        if (this.filterTitle != null) {
            sentence = HQL_HEADER + " and title " + this.filterTitle + " " + HQL_FOOTER;
        } else {
            sentence = HQL_HEADER + HQL_FOOTER;
        }
        HqlStatement hql = new HqlStatement(sentence);
        hql.setString("module", pModule);
        hql.setInteger("transaction", pTransaction);
        hql.setInteger("version", pVersion);
        lData = hql.execute().getResultList();
        return lData;
    }
    /**
     * Sentencia cabecera que entrega las paginas asociadas a una transaccion.
     */
    private static final String HQL_HEADER =
            " from TgeneTransactionPages t "
            + " where t.pk.transactionmodule = :module"
            + " and t.pk.transactioncode = :transaction"
            + " and t.pk.transactionversion = :version"
            + " and coalesce(t.active,'N') = 'Y'";
    /**
     * Sentencia cabecera que entrega las paginas asociadas a una transaccion.
     */
    private static final String HQL_FOOTER = " order by t.presentationorder ";
}
