package gov.nysenate.openleg.dao.bill.data;
import gov.nysenate.openleg.dao.base.LimitOffset;
import gov.nysenate.openleg.dao.base.OrderBy;
import gov.nysenate.openleg.dao.base.SortOrder;
import gov.nysenate.openleg.dao.base.SqlBaseDao;
import gov.nysenate.openleg.model.bill.BaseBillId;
import gov.nysenate.openleg.model.bill.VetoId;
import gov.nysenate.openleg.model.bill.VetoMessage;
import gov.nysenate.openleg.model.bill.VetoType;
import gov.nysenate.openleg.model.sobi.SobiFragment;
import gov.nysenate.openleg.util.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.stereotype.Repository;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static gov.nysenate.openleg.util.DateUtils.toDate;
@Repository
public class SqlVetoDao extends SqlBaseDao implements VetoDao
{
public static final Logger logger = LoggerFactory.getLogger(SqlVetoDao.class);
/** @inheritDoc */
@Override
public VetoMessage getVetoMessage(VetoId vetoId) throws DataAccessException {
MapSqlParameterSource params = getVetoIdParams(vetoId);
return jdbcNamed.queryForObject(SqlVetoQuery.SELECT_VETO_MESSAGE_SQL.getSql(schema()), params, new VetoRowMapper());
}
/** @inheritDoc */
@Override
public Map<VetoId,VetoMessage> getBillVetoes(BaseBillId baseBillId) throws DataAccessException {
MapSqlParameterSource params = getBaseBillIdParams(baseBillId);
OrderBy orderBy = new OrderBy("year", SortOrder.ASC, "veto_number", SortOrder.ASC);
List<VetoMessage> vetoMessageList = jdbcNamed.query(
SqlVetoQuery.SELECT_BILL_VETOES_SQL.getSql(schema(), orderBy, LimitOffset.ALL), params, new VetoRowMapper());
Map<VetoId,VetoMessage> vetoMap = new HashMap<>();
for (VetoMessage vetoMessage : vetoMessageList) {
vetoMap.put(vetoMessage.getVetoId(), vetoMessage);
}
return vetoMap;
}
/** @inheritDoc */
@Override
public void updateVetoMessage(VetoMessage vetoMessage, SobiFragment sobiFragment) throws DataAccessException {
MapSqlParameterSource params = getVetoParams(vetoMessage, sobiFragment);
if (jdbcNamed.update(SqlVetoQuery.UPDATE_VETO_MESSAGE_SQL.getSql(schema()), params) == 0){
jdbcNamed.update(SqlVetoQuery.INSERT_VETO_MESSAGE_SQL.getSql(schema()), params);
}
}
/** @inheritDoc */
@Override
public void deleteVetoMessage(VetoId vetoId) {
MapSqlParameterSource params = getVetoIdParams(vetoId);
jdbcNamed.update(SqlVetoQuery.DELETE_VETO_MESSAGE.getSql(schema()), params);
}
/** @inheritDoc */
@Override
public void deleteBillVetoes(BaseBillId baseBillId) {
MapSqlParameterSource params = getBaseBillIdParams(baseBillId);
jdbcNamed.update(SqlVetoQuery.DELETE_BILL_VETOES.getSql(schema()), params);
}
private class VetoRowMapper implements RowMapper<VetoMessage>
{
@Override
public VetoMessage mapRow(ResultSet rs, int rowNum) throws SQLException {
VetoMessage vetoMessage = new VetoMessage();
vetoMessage.setYear(rs.getInt("year"));
vetoMessage.setVetoNumber(rs.getInt("veto_number"));
vetoMessage.setBillId(new BaseBillId(rs.getString("bill_print_no"), rs.getInt("bill_session_year")));
vetoMessage.setSession(getSessionYearFromRs(rs, "bill_session_year"));
vetoMessage.setType(VetoType.valueOf(rs.getString("type").toUpperCase()));
vetoMessage.setChapter(rs.getInt("chapter"));
vetoMessage.setBillPage(rs.getInt("page"));
vetoMessage.setLineStart(rs.getInt("line_start"));
vetoMessage.setLineEnd(rs.getInt("line_end"));
vetoMessage.setSigner(rs.getString("signer"));
vetoMessage.setSignedDate(DateUtils.getLocalDate(rs.getTimestamp("date")));
vetoMessage.setMemoText(rs.getString("memo_text"));
setModPubDatesFromResultSet(vetoMessage, rs);
return vetoMessage;
}
}
private MapSqlParameterSource getVetoIdParams(VetoId vetoId){
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("vetoNumber", vetoId.getVetoNumber());
params.addValue("year", vetoId.getYear());
return params;
}
private MapSqlParameterSource getVetoParams(VetoMessage vetoMessage, SobiFragment sobiFragment){
MapSqlParameterSource params = getVetoIdParams(vetoMessage.getVetoId());
params.addValue("printNum", vetoMessage.getBillId().getBasePrintNo());
params.addValue("sessionYear", vetoMessage.getSession().getYear());
params.addValue("chapter", vetoMessage.getChapter());
params.addValue("page", vetoMessage.getBillPage());
params.addValue("lineStart", vetoMessage.getLineStart());
params.addValue("lineEnd", vetoMessage.getLineEnd());
params.addValue("signer", vetoMessage.getSigner());
params.addValue("date", toDate(vetoMessage.getSignedDate()));
params.addValue("memoText", vetoMessage.getMemoText());
params.addValue("type", vetoMessage.getType().toString().toLowerCase());
addLastFragmentParam(sobiFragment, params);
addModPubDateParams(vetoMessage.getModifiedDateTime(), vetoMessage.getPublishedDateTime(), params);
return params;
}
private MapSqlParameterSource getBaseBillIdParams(BaseBillId baseBillId){
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("printNum", baseBillId.getBasePrintNo());
params.addValue("sessionYear", baseBillId.getSession().getYear());
return params;
}
}