package gov.nysenate.openleg.dao.activelist;
import com.google.common.collect.Range;
import gov.nysenate.openleg.dao.base.SqlBaseDao;
import gov.nysenate.openleg.model.bill.BillId;
import gov.nysenate.openleg.model.calendar.CalendarEntry;
import gov.nysenate.openleg.model.calendar.CalendarActiveListId;
import gov.nysenate.openleg.model.calendar.CalendarId;
import gov.nysenate.openleg.model.spotcheck.ActiveListSpotcheckReference;
import gov.nysenate.openleg.util.DateUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
/**
* Created by kyle on 11/21/14.
*/
@Repository
public class SqlActiveListReferenceDAO extends SqlBaseDao implements ActiveListReferenceDAO {
@Override
public void addCalendarReference(ActiveListSpotcheckReference act) {
MapSqlParameterSource params = getActiveListParams(act);
KeyHolder key = new GeneratedKeyHolder();
if (jdbcNamed.update(SqlActiveListReferenceQuery.UPDATE_ACTIVE_LIST.getSql(schema()), params, key,new String[] { "id" }) == 0){
jdbcNamed.update(SqlActiveListReferenceQuery.INSERT_ACTIVE_LIST_REFERENCE.getSql(schema()), params, key,new String[] { "id" });
}
// use for adding new entries
int alId = key.getKey().intValue();
MapSqlParameterSource paramId = new MapSqlParameterSource();
paramId.addValue("active_list_reference_id", alId);
jdbcNamed.update(SqlActiveListReferenceQuery.DELETE_REFERENCE_ENTRIES.getSql(schema()), paramId);
act.getEntries().forEach(entry -> addActiveListEntry(alId, entry));
act.getEntries().stream()
.map(CalendarEntry::getBillId)
.collect(Collectors.toList());
}
void addActiveListEntry(int keyId, CalendarEntry entry){
MapSqlParameterSource params = getEntryParams(keyId, entry);
jdbcNamed.update(SqlActiveListReferenceQuery.INSERT_ACTIVE_LIST_REFERENCE_ENTRY.getSql(schema()), params);
}
@Override
public ActiveListSpotcheckReference getCalendarReference(CalendarActiveListId cal, LocalDateTime time) {
MapSqlParameterSource params = getActiveListIdParams(cal, time);
return jdbcNamed.queryForObject(SqlActiveListReferenceQuery.SELECT_ACTIVE_LIST.getSql(schema()), params, new ActiveRowMapper());
}
@Override
public ActiveListSpotcheckReference getMostRecentReference(CalendarActiveListId cal) {
MapSqlParameterSource params =getActiveListIdParams(cal);
return jdbcNamed.queryForObject(SqlActiveListReferenceQuery.SELECT_MOST_RECENT_REPORT.getSql(schema()), params, new ActiveRowMapper());
}
@Override
public List<ActiveListSpotcheckReference> getMostRecentEachYear(int year) {
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("calendar_year", year);
return jdbcNamed.query(SqlActiveListReferenceQuery.SELECT_MOST_RECENT_FROM_EACH_YEAR.getSql(schema()), params, new ActiveRowMapper());
}
//todo
@Override
public ActiveListSpotcheckReference getCurrentCalendar(CalendarActiveListId cal, Range<LocalDateTime> dateRange) throws DataAccessException {
MapSqlParameterSource params= null;// = getActiveListIdParams(cal, dateRange);
return jdbcNamed.queryForObject(SqlActiveListReferenceQuery.SELECT_ACTIVE_LIST.getSql(schema()), params, new ActiveRowMapper());
}
List<CalendarEntry> getEntries(CalendarActiveListId cal, CalendarEntry entry){
MapSqlParameterSource params = getEntryParams(cal, entry);
return jdbcNamed.query(SqlActiveListReferenceQuery.SELECT_ACTIVE_LIST_REFERENCE_ENTRIES.getSql(schema()), params, new EntryRowMapper());
}
public MapSqlParameterSource getEntryParams(int keyId, CalendarEntry entry){
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("bill_print_no", entry.getBillId().getPrintNo());
params.addValue("bill_session_no", entry.getBillId().getSession().getYear());
params.addValue("bill_calendar_no", entry.getBillCalNo());
params.addValue("active_list_reference_id", keyId);
params.addValue("bill_amend_version", entry.getBillId().getVersion().getValue());
params.addValue("bill_session_year", entry.getBillId().getSession().getYear());
params.addValue("created_date_time", entry.getBillId().getSession());
return params;
}
public MapSqlParameterSource getEntryParams(CalendarActiveListId cal, CalendarEntry entry){
MapSqlParameterSource params = getActiveListIdParams(cal);
params.addValue("bill_print_no", entry.getBillId().getPrintNo());
params.addValue("bill_session_no", entry.getBillId().getSession().getYear());
params.addValue("bill_calendar_no", entry.getBillCalNo());
return params;
}
//todo create get range parameter method for use in getcurrentcalendar method
public MapSqlParameterSource getActiveListIdParams(CalendarActiveListId cal, LocalDateTime time){
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("sequence_no", cal.getSequenceNo());
params.addValue("calendar_year", cal.getYear());
params.addValue("calendar_no", cal.getCalNo());
params.addValue("reference_date", DateUtils.toDate(time));
return params;
}
public MapSqlParameterSource getActiveListIdParams(CalendarActiveListId cal){
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("sequence_no", cal.getSequenceNo());
params.addValue("calendar_year", cal.getYear());
params.addValue("calendar_no", cal.getCalNo());
return params;
}
public MapSqlParameterSource getActiveListParams( ActiveListSpotcheckReference activeList){
MapSqlParameterSource params = getActiveListIdParams(new CalendarActiveListId(activeList.getCalendarId(), activeList.getSequenceNo()));
params.addValue("calendar_date", DateUtils.toDate(activeList.getCalDate()));
params.addValue("release_date_time", DateUtils.toDate(activeList.getReleaseDateTime()));
params.addValue("reference_date", DateUtils.toDate(activeList.getReferenceDate()));
return params;
}
private class ActiveRowMapper implements RowMapper<ActiveListSpotcheckReference>
{
@Override
public ActiveListSpotcheckReference mapRow(ResultSet rs, int rowNum) throws SQLException {
ActiveListSpotcheckReference activeList = new ActiveListSpotcheckReference();
activeList.setCalDate(DateUtils.getLocalDate(rs.getTimestamp("calendar_date")));
activeList.setCalendarId(new CalendarId(rs.getInt("calendar_year"), rs.getInt("calendar_no")));
activeList.setReleaseDateTime(DateUtils.getLocalDateTime(rs.getTimestamp("release_date_time")));
activeList.setReferenceDate(DateUtils.getLocalDateTime(rs.getTimestamp("reference_date")));
activeList.setSequenceNo(rs.getInt("sequence_no"));
//activeList.setEntries();
return activeList;
}
}
private class EntryRowMapper implements RowMapper<CalendarEntry>
{
@Override
public CalendarEntry mapRow(ResultSet rs, int rowNum) throws SQLException {
CalendarEntry entry = new CalendarEntry();
entry.setBillId(new BillId(rs.getString("bill_print_no"), rs.getInt("bill_session_year")));
entry.setBillCalNo(rs.getInt("bill_calendar_no"));
return entry;
}
}
}