package hr.com.port.ips.eracun.service;

import hr.com.port.eracun.codelists.DocumentTypeCode;
import hr.com.port.functions.Functions;
import hr.com.port.ips.eracun.dao.DokumentiVrsteDao;
import hr.com.port.ips.eracun.dao.EracunDokumentDao;
import hr.com.port.ips.eracun.dao.EracunDokumentLogDao;
import hr.com.port.ips.eracun.provider.mer.enums.MerFiscalizationStatus;
import hr.com.port.ips.eracun.provider.mer.enums.MerMarkPaidStatus;
import hr.com.port.ips.eracun.provider.mer.enums.MerRejectStatus;
import hr.com.port.ips.eracun.provider.mer.enums.MerTransportStatus;
import hr.com.port.ips.eracun.provider.mer.dto.document.SendResponse;
import hr.com.port.ips.eracun.modeli.EracunDokument;
import hr.com.port.ips.eracun.modeli.EracunDokumentLog;
import hr.com.port.ips.eracun.modeli.EracunStatus;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Timestamp;
import org.apache.log4j.Logger;

public class EracunSendService {

    private static final Logger logger = Logger.getLogger(EracunSendService.class);

    // Usklađeno s v1.7/v1.8 i "Getting started":
    // - početni transportni status: IN_PREPARATION (bez promjene)
    // - procesniStatusNaziv ostaje null (ne "N/A")
    // - null-safe inkrement brojSlanja

    public long processSendResponse(
            Connection conn,
            SendResponse response,
            int godina,
            int dokumentVrsta,
            int onu,
            int opp,
            int broj,
            int posrednikId,
            String posrednikNaziv,
            String putanjaXml,
            String documentNr,
            boolean izlazni,
            String izvor
    ) throws SQLException {

        if (response == null) {
            throw new IllegalArgumentException("SendResponse je null.");
        }
        if (putanjaXml == null || putanjaXml.trim().isEmpty()) {
            // bez putanje XML-a ne smijemo nastaviti
            throw new IllegalStateException("putanjaXml je null/prazna – ne mogu upisati eracun_dokument.");
        }

        final long electronicId = response.ElectronicId;
        final Timestamp now = new Timestamp(System.currentTimeMillis());

        EracunDokumentDao dokumentDao = new EracunDokumentDao();
        EracunDokumentLogDao logDao = new EracunDokumentLogDao();

        EracunDokument postojeci = null;
        try {
            postojeci = dokumentDao.findByElectronicId(electronicId, izlazni, conn);
        } catch (Exception ex) {
            logger.error(new Functions().logging(ex));
            throw ex instanceof SQLException ? (SQLException) ex : new SQLException(ex);
        }

        if (postojeci == null) {
            // INSERT
            EracunDokument d = new EracunDokument();
            d.setIzlazni(izlazni);
            d.setGodina(godina);
            d.setPosrednik(posrednikId);
            d.setPosrednikNaziv(posrednikNaziv);

            d.setVrstaDokumenta(dokumentVrsta);
            String naziv = DokumentiVrsteDao.findNazivById(dokumentVrsta, conn);
            String ublCode = DokumentiVrsteDao.findUblById(dokumentVrsta, conn);
            d.setVrstaDokumentaNaziv(naziv);
            d.setTipDokumenta(ublCode);
            d.setTipDokumentaNaziv(DocumentTypeCode.fromCode(ublCode).getNaziv());

            d.setOnu(onu);
            d.setOpp(opp);
            d.setBroj(broj);

            d.setPutanjaXml(putanjaXml);
            d.setElectronicId(electronicId);
            d.setDocumentNr(documentNr);

            // MER header info (nije dostupno iz send response-a)
            d.setDocumentTypeId(0);
            d.setDocumentTypeName(null);
            d.setPartnerBusinessNumber(null);
            d.setPartnerBusinessUnit(null);
            d.setPartnerBusinessName(null);

            // Remote datumi (u ovoj fazi nepoznato)
            d.setCreated(null);
            d.setUpdated(null);
            d.setSent(null);
            d.setDelivered(null);
            d.setIssueDate(null);

            d.setAdditionalDokumentStatusId(0);
            d.setRejectReason(null);

            // statusi
            d.setLokalniStatusId(EracunStatus.POSLAN.getId());
            d.setLokalniStatusNaziv(EracunStatus.POSLAN.getNaziv());
            d.setTransportniStatusId(MerTransportStatus.IN_PREPARATION.getId());
            d.setTransportniStatusNaziv(MerTransportStatus.IN_PREPARATION.getNaziv());
            d.setProcesniStatusId(null);
            d.setProcesniStatusNaziv(null); // usklađeno: bez "N/A"

            // lokalni datumi
            d.setDatumKreiranja(now);
            d.setDatumSlanja(now);
            d.setBrojSlanja(1);
            d.setDatumZadnjegStatusa(now);

            d.setPorukaGreske(null);
            d.setSyncToken(null);

            d.setFiskaliziranStatus(MerFiscalizationStatus.UNKNOWN.getId());
            d.setPlacenStatus(MerMarkPaidStatus.UNKNOWN.getId());
            d.setOdbijenStatus(MerRejectStatus.UNKNOWN.getId());
            d.setVizualiziran(false);

            try {
                EracunDokumentDao.insertNoviDokument(conn, d);
            } catch (Exception ex) {
                logger.error(new Functions().logging(ex));
                throw ex instanceof SQLException ? (SQLException) ex : new SQLException(ex);
            }

        } else {
            // UPDATE nužnih polja
            if (putanjaXml != null && !putanjaXml.trim().isEmpty()) {
                postojeci.setPutanjaXml(putanjaXml);
            }
            if (documentNr != null && !documentNr.trim().isEmpty()) {
                postojeci.setDocumentNr(documentNr);
            }

            postojeci.setTransportniStatusId(MerTransportStatus.IN_PREPARATION.getId());
            postojeci.setTransportniStatusNaziv(MerTransportStatus.IN_PREPARATION.getNaziv());
            postojeci.setProcesniStatusId(null);
            postojeci.setProcesniStatusNaziv(null); // usklađeno: bez "N/A"
            postojeci.setLokalniStatusId(EracunStatus.POSLAN.getId());
            postojeci.setLokalniStatusNaziv(EracunStatus.POSLAN.getNaziv());

            postojeci.setDatumSlanja(now);
            Integer brojSlanja = postojeci.getBrojSlanja();
            if (brojSlanja == null) brojSlanja = 0; // null-safe usklađenje
            postojeci.setBrojSlanja(Math.max(1, brojSlanja + 1));
            postojeci.setDatumZadnjegStatusa(now);

            try {
                dokumentDao.updateAll(conn, postojeci);
            } catch (Exception ex) {
                logger.error(new Functions().logging(ex));
                throw ex instanceof SQLException ? (SQLException) ex : new SQLException(ex);
            }
        }

        // LOG
        EracunDokumentLog log = new EracunDokumentLog();
        log.setIzlazni(izlazni);
        log.setGodina(godina);
        log.setPosrednik(posrednikId);
        log.setVrstaDokumenta(dokumentVrsta);
        log.setOnu(onu);
        log.setOpp(opp);
        log.setBroj(broj);

        log.setElectronicId(electronicId);

        log.setLokalniStatusId(EracunStatus.POSLAN.getId());
        log.setLokalniStatusNaziv(EracunStatus.POSLAN.getNaziv());
        log.setTransportniStatusId(MerTransportStatus.IN_PREPARATION.getId());
        log.setTransportniStatusNaziv(MerTransportStatus.IN_PREPARATION.getNaziv());
        log.setProcesniStatusId(null);
        log.setProcesniStatusNaziv(null); // usklađeno

        log.setDatumStatusa(now);
        log.setDatumPromjene(now);

        log.setPorukaGreske(null);
        log.setOpis("SEND OK (electronicId=" + electronicId + ")");
        log.setPutanjaXml(putanjaXml);
        log.setIzvor(izvor);
        log.setAkcija("SEND");
        log.setOibOperatera(null); // ako imaš, postavi

        try {
            logDao.insert(log, conn);
        } catch (Exception ex) {
            logger.error(new Functions().logging(ex));
            throw ex instanceof SQLException ? (SQLException) ex : new SQLException(ex);
        }
        return electronicId;
    }
}