package hr.com.port.ips.eracun.dao;

import hr.com.port.functions.Functions;
import hr.com.port.ips.eracun.provider.mer.enums.MerEreportingStatus;
import hr.com.port.ips.eracun.modeli.MerEreportingLog;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;

public class MerEreportingLogDao {

    private static final Logger logger = Logger.getLogger(MerEreportingLogDao.class);

    public Long insert(Connection conn, MerEreportingLog m) {
        final String sql = "INSERT INTO eracun_ereporting_log (" +
                "vrsta_dokumenta, godina, opp, onu, broj, " +
                "izvor, akcija, status_id, message, detalji, datum_promjene" +
                ") VALUES (?,?,?,?,?,?,?,?,?,?,?)";

        Long id = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            ps.setInt(1, m.getVrstaDokumenta());
            ps.setInt(2, m.getGodina());
            ps.setInt(3, m.getOpp());
            ps.setInt(4, m.getOnu());
            ps.setInt(5, m.getBroj());
            ps.setString(6, m.getIzvor());
            ps.setString(7, m.getAkcija());

            // ⬇️ status_id je NOT NULL; ako nije postavljen, pišemo UNKNOWN (-1)
            int status = (m.getStatusId() != null)
                    ? m.getStatusId()
                    : MerEreportingStatus.UNKNOWN.getId();
            ps.setInt(8, status);

            ps.setString(9, m.getMessage());
            ps.setString(10, m.getDetalji());

            Timestamp ts = (m.getDatumPromjene() != null)
                    ? m.getDatumPromjene()
                    : new Timestamp(System.currentTimeMillis());
            ps.setTimestamp(11, ts);

            ps.executeUpdate();
            rs = ps.getGeneratedKeys();
            if (rs.next()) {
                id = rs.getLong(1);
                m.setId(id);
            }
        } catch (Exception ex) {
            logger.error(new Functions().logging(ex));
        } finally {
            try { if (rs != null) rs.close(); } catch (Exception ex) { logger.error(new Functions().logging(ex)); }
            try { if (ps != null) ps.close(); } catch (Exception ex) { logger.error(new Functions().logging(ex)); }
        }
        return id;
    }

    // Helper u tvom stilu (kao insertLogJson). */
    public void insertLogJson(Connection conn,
                              int vrstaDokumenta, int godina, int opp, int onu, int broj,
                              String izvor, String akcija,
                              Integer statusId, String message, String detaljiJson) {
        MerEreportingLog m = new MerEreportingLog();
        m.setVrstaDokumenta(vrstaDokumenta);
        m.setGodina(godina);
        m.setOpp(opp);
        m.setOnu(onu);
        m.setBroj(broj);
        m.setIzvor(izvor);
        m.setAkcija(akcija);
        // ⬇️ Ako nije proslijeđen status → UNKNOWN
        m.setStatusId(statusId != null ? statusId : MerEreportingStatus.UNKNOWN.getId());
        m.setMessage(message);
        m.setDetalji(detaljiJson);
        m.setDatumPromjene(new Timestamp(System.currentTimeMillis()));
        insert(conn, m);
    }
	
	public List<MerEreportingLog> listByBusinessKey(Connection conn, int vrstaDokumenta, int godina, int opp, int onu, int broj) {
		final String sql = "SELECT id, vrsta_dokumenta, godina, opp, onu, broj, " +
				"izvor, akcija, status_id, message, detalji, datum_promjene " +
				"FROM eracun_ereporting_log " +
				"WHERE vrsta_dokumenta = ? AND godina = ? AND opp = ? AND onu = ? AND broj = ? " +
				"ORDER BY datum_promjene DESC, id DESC";

		PreparedStatement ps = null;
		ResultSet rs = null;
		List<MerEreportingLog> result = new ArrayList<MerEreportingLog>();
		try {
			ps = conn.prepareStatement(sql);
			ps.setInt(1, vrstaDokumenta);
			ps.setInt(2, godina);
			ps.setInt(3, opp);
			ps.setInt(4, onu);
			ps.setInt(5, broj);

			rs = ps.executeQuery();
			while (rs.next()) {
				result.add(map(rs));
			}
		} catch (Exception ex) {
			logger.error(new Functions().logging(ex));
		} finally {
			try { if (rs != null) rs.close(); } catch (Exception ex) { logger.error(new Functions().logging(ex)); }
			try { if (ps != null) ps.close(); } catch (Exception ex) { logger.error(new Functions().logging(ex)); }
		}
		return result;
	}

	// Privatni mapper za jedan red; ostavi ako već postoji u klasi. */
	private MerEreportingLog map(ResultSet rs) throws Exception {
		MerEreportingLog m = new MerEreportingLog();
		m.setId(rs.getLong("id"));
		m.setVrstaDokumenta(rs.getInt("vrsta_dokumenta"));
		m.setGodina(rs.getInt("godina"));
		m.setOpp(rs.getInt("opp"));
		m.setOnu(rs.getInt("onu"));
		m.setBroj(rs.getInt("broj"));
		m.setIzvor(rs.getString("izvor"));
		m.setAkcija(rs.getString("akcija"));

		int st = rs.getInt("status_id");
		if (rs.wasNull()) {
			// status_id je NOT NULL s defaultom (-1), ali svejedno provjera:
			m.setStatusId(-1);
		} else {
			m.setStatusId(st);
		}

		m.setMessage(rs.getString("message"));
		m.setDetalji(rs.getString("detalji"));
		m.setDatumPromjene(rs.getTimestamp("datum_promjene"));
		return m;
	}
}