package sac.pessoa.juridica.jdbc;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import sac.exception.ItemNaoCadastradoException;
import sac.pessoa.juridica.OfertaTrabalho;
import sac.pessoa.juridica.RepositorioOfertaTrabalho;
import sac.pessoa.fisica.RepositorioTipoServico;
import sac.pessoa.fisica.jdbc.DBTipoServico;
import sac.pessoa.util.jdbc.DBRepository_Abstract;
import sac.pessoa.util.jdbc.PersistenteFactory;
import sac.persistencia.OID;
import sac.persistencia.OIDFactory;
import sac.persistencia.PersistenceException;



public class DBOfertaTrabalho extends DBRepository_Abstract
    implements RepositorioOfertaTrabalho{

    private static DBOfertaTrabalho instancia;

    private final String preparedSelectIdOfertaSql =
        "select cd_oferta as id from oferta_trabalho "+
        " where  vl_carga_horaria= ? and ds_requisitos= ? and "+
        " cd_tipo_servico = ?";

    private final String preparedSelectOferta =
         "select cd_oferta, vl_carga_horaria, ds_requisitos, cd_tipo_servico "+
         " from oferta_trabalho  where cd_oferta =  ? ";

    //Insere uma oferta na Tabela Oferta_Trabalho
    private final String preparedInsertOferta =
        "insert into oferta_trabalho (cd_oferta, vl_carga_horaria, "+
        "ds_requisitos, cd_tipo_servico) values (?,?,?,?)";

    private OIDFactory oidFactory;
    private RepositorioTipoServico repositorioServico;
    private PersistenteFactory ofertaFactory;

    public DBOfertaTrabalho() throws PersistenceException {
        oidFactory = OIDFactory.getInstancia();

        repositorioServico = DBTipoServico.getInstancia();
        ofertaFactory = new PersistenteFactory_Oferta();
    }

    public static synchronized DBOfertaTrabalho getInstancia()
        throws PersistenceException {
        if (instancia == null) {
            instancia = new DBOfertaTrabalho();
        }
        return instancia;
    }

    /**
    * Assinatura de método para conlsuta de um tipo de servico
    *
    * @param id            Long contendo ID do tipo de servico.
    *
    * @return String que representa o nome do tipo de servico.
    */
    public OfertaTrabalho procurar (OID oid )
        throws PersistenceException, ItemNaoCadastradoException {

        Connection con = getConnection();
        PreparedStatement preOferta = createPreparedStatement(con,
            preparedSelectOferta);

        try {
            preOferta.setLong(1,  oid.getLongValue());
            OfertaTrabalho oferta = (OfertaTrabalho) selectObject( oid,
                preOferta, ofertaFactory);
            if (oferta == null) {
                throw new ItemNaoCadastradoException(" Oferta não cadastrada  oid ="+
                    oid.getLongValue() );
            }
            return oferta;
        } catch (SQLException sqle){
            throw new PersistenceException("Problemas no Banco.", sqle);
        }
    }

    public OfertaTrabalho procurar (OfertaTrabalho oferta)
        throws PersistenceException, ItemNaoCadastradoException {

        Connection con = getConnection();
        PreparedStatement preCodigo = createPreparedStatement(con,
            preparedSelectIdOfertaSql);

        String tiposervico = oferta.getTipoServico();
        try {
            OID oidservico;
            try {
                oidservico = repositorioServico.procurarOID( tiposervico );
            } catch (ItemNaoCadastradoException iteme) {
                throw new PersistenceException("Oferta de Trabalho inconsistente, "+
                    " tipo de servico inexeistente", iteme);
            }
            preCodigo.setInt(1,oferta.getCargaHoraria());
            preCodigo.setString(2,oferta.getRequisitos());
            preCodigo.setLong(3, oidservico.getLongValue());

            OID oid = (OID) selectObjectFromBd(preCodigo, getCodeFactory() );
            if ( oid == null) {
                throw new ItemNaoCadastradoException(" Oferta não cadastrada ="+
                    oferta.toString() );
            }
            oferta.setId(oid);
            return oferta;
        } catch (SQLException sqle){
            throw new PersistenceException("Problemas no Banco.", sqle);
        }
    }



   /**
   * Funcao para adicionar Tipo de Servico de Pessoa Fisica
   * executada por um usuário operadoe que extende de
   * pessoa fisica.
   *
   * @param categoria	String contendo categoria a ser cadastrada
   */
    public void inserir(OfertaTrabalho oferta, Connection con) throws PersistenceException {

    	long id = 0;
        OID oidservico;
        PreparedStatement preOferta    = createPreparedStatement(con, preparedInsertOferta);

    	try{
            String tiposervico = oferta.getTipoServico();
            try {
                oidservico = repositorioServico.procurarOID( tiposervico );
            } catch (ItemNaoCadastradoException iteme) {
                throw new PersistenceException("Oferta de Trabalho inconsistente, "+
                " tipo de servico inexeistente", iteme);
            }
            try {
                procurar(oferta).getId();
            } catch (ItemNaoCadastradoException iteme){
                OID oid = oidFactory.novoOID();

                preOferta.setLong(1, oid.getLongValue());
                preOferta.setInt(2,oferta.getCargaHoraria());
                preOferta.setString(3,oferta.getRequisitos());
                preOferta.setLong(4, oidservico.getLongValue());
                preOferta.executeUpdate();
                oferta.setId(oid);
            }
        }catch(SQLException e){
            throw new PersistenceException("Problema no Banco",e);
        }finally{
            closeStatement(preOferta);
        }
    }

}