package com.fp.viaticos.task;

import java.util.HashMap;
import java.util.Map;

import javax.persistence.NoResultException;
import javax.persistence.Query;

import com.fp.persistence.commondb.PersistenceHelper;
import com.fp.persistence.pviaticos.hra.Empleado;
import com.fp.persistence.pviaticos.hra.EmpleadoJpql;
import com.fp.persistence.pviaticos.param.ViaCiudadUsuario;
import com.fp.persistence.pviaticos.solicitud.ViaSolicitud;
import com.fp.persistence.pviaticos.solicitud.ViaSolicitudKey;
import com.fp.simple.action.TaskAction;
import com.fp.viaticos.rules.exception.ViaticosException;

/**
 * Clase que se encarga de obtener y fijar el usuario responsable de ejecutar la tarea de talento humano.
 * 
 * @version 2.1
 */
public class AsignarTalentoHumano extends TaskAction {

    /*
     * (non-Javadoc)
     * 
     * @see com.fp.simple.action.TaskAction#assignOwner(com.fp.simple.flow.DataMap)
     */
    @SuppressWarnings("unchecked")
    @Override
    public void assignOwner(Object pParam) throws Exception {
        HashMap<String, Object> m = (HashMap<String, Object>) pParam;
        Map<String, Object> mrequest = (Map<String, Object>) m.get("request");
        if (mrequest.get("csolicitud") == null) {
            return;
        }
        String solicitud = (String) mrequest.get("csolicitud");
        ViaSolicitud vsol = ViaSolicitud.find(PersistenceHelper.getEntityManager(), new ViaSolicitudKey(solicitud, "S"));

        EmpleadoJpql ejpql = new EmpleadoJpql();
        Empleado e = ejpql.find(vsol.getCod_empleado());
        if (e.getCodigoLocalidad() == null) {
            throw new ViaticosException("VIA-0001", "CODIGO DE LOCALIDAD NO ASOCIADO AL EMPLEADO: {0} {1}", e.getCodigo(), e.getNombre());
        }
        // El userID va en mayusculas asi esta definido en las tablas de jbpm y maia.
        m.put("userId", this.getUsuario(e.getCodigoLocalidad(), "TALENTOHUMANO"));
        m.put("action", "A");
    }

    /**
     * Busca en la tabla ViaCiudadUsuario, el codigo de usuario asociado a una localidad a la que pertence un
     * funcionario de la SBS.
     * 
     * @param ciudad Codigo de ciudad a obtener el usuario.
     * @return String
     * @throws Exception
     */
    private String getUsuario(String ciudad, String actividad) throws Exception {
        Query qry = PersistenceHelper.getEntityManager().createQuery(
                "from ViaCiudadUsuario t where t.pk.cod_actividad_catalog = :actividad and t.pk.cod_ciudad_catalog = :ciudad ");
        qry.setParameter("ciudad", ciudad);
        qry.setParameter("actividad", actividad);
        ViaCiudadUsuario obj = null;
        try {
            obj = (ViaCiudadUsuario) qry.getSingleResult();
        } catch (NoResultException e) {
            throw new ViaticosException("VIA-0002", "USUARIO NO DEFINIDO EN VIA_CIUDAD_USUARIO CIUDAD: {0} ACTIVIDAD: {1} ", ciudad, actividad);
        }
        return obj.getCod_usuario();
    }
}
