package hr.com.port.ips.eracun.dao;

import hr.com.port.ips.eracun.modeli.EracunSyncState;

public class EracunSyncStateDao {

    private static final String SQL_SELECT =
        "SELECT posrednik_id, smjer, zadnji_sent, zadnji_eid, updated_at " +
        "FROM eracun_sync_state WHERE posrednik_id=? AND smjer=?";

    private static final String SQL_UPSERT =
        "INSERT INTO eracun_sync_state (posrednik_id, smjer, zadnji_sent, zadnji_eid) " +
        "VALUES (?, ?, ?, ?) " +
        "ON DUPLICATE KEY UPDATE " +
        "  zadnji_sent=VALUES(zadnji_sent), " +
        "  zadnji_eid =VALUES(zadnji_eid), " +
        "  updated_at =CURRENT_TIMESTAMP";

    // Dohvati stanje za (posrednik, smjer). Ako nema reda, vraća null.
    public EracunSyncState getState(int posrednikId, String smjer, java.sql.Connection conn) throws java.sql.SQLException {
        try (java.sql.PreparedStatement ps = conn.prepareStatement(SQL_SELECT)) {
            ps.setInt(1, posrednikId);
            ps.setString(2, smjer);
            try (java.sql.ResultSet rs = ps.executeQuery()) {
                if (rs.next()) {
                    EracunSyncState s = new EracunSyncState();
                    s.setPosrednikId(rs.getInt("posrednik_id"));
                    s.setSmjer(rs.getString("smjer"));
                    s.setZadnjiSent(rs.getTimestamp("zadnji_sent"));
                    Long eid = rs.getObject("zadnji_eid") != null ? ((Number) rs.getObject("zadnji_eid")).longValue() : null;
					s.setZadnjiEid(eid);
                    s.setUpdatedAt(rs.getTimestamp("updated_at"));
                    return s;
                }
                return null;
            }
        }
    }

   
    //  Spremi/azuriraj stanje (UPSERT). 'updated_at' puni baza.
    public void saveState(EracunSyncState state, java.sql.Connection conn) throws java.sql.SQLException {
        try (java.sql.PreparedStatement ps = conn.prepareStatement(SQL_UPSERT)) {
            ps.setInt(1, state.getPosrednikId());
            ps.setString(2, state.getSmjer());
            ps.setTimestamp(3, state.getZadnjiSent());
            ps.setObject(4, state.getZadnjiEid(), java.sql.Types.BIGINT);
            ps.executeUpdate();
        }
    }

    
    // Pomoćna: upiši (posrednik, smjer, zadnji_sent, zadnji_eid) bez kreiranja DTO-a.
    public void saveState(int posrednikId, String smjer, java.sql.Timestamp zadnjiSent, Long zadnjiEid,
                          java.sql.Connection conn) throws java.sql.SQLException {
        EracunSyncState s = new EracunSyncState();
        s.setPosrednikId(posrednikId);
        s.setSmjer(smjer);
        s.setZadnjiSent(zadnjiSent);
        s.setZadnjiEid(zadnjiEid);
        saveState(s, conn);
    }
}