package com.eksad.masterdata.repository;

import com.eksad.ddms.common.util.StringUtil;
import com.eksad.masterdata.domain.APIPullNjbNscDetail;
import com.eksad.masterdata.domain.APIPullNjbNscHeader;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.transaction.Transactional;
import org.hibernate.Session;
import org.hibernate.jdbc.Work;
import org.springframework.stereotype.Repository;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

@Repository
@Transactional
public class APIPullNjbNscRepository {

    @PersistenceContext
    EntityManager entityManager;

    public List<APIPullNjbNscHeader> findAllNjbNscHeaderByRangeDate(String from, String to, String ahassID) {
        List<APIPullNjbNscHeader> list = new ArrayList<>();
        try {
            Session session = entityManager.unwrap(Session.class);
            session.doWork(new Work() {
                @Override
                public void execute(Connection cnctn) throws SQLException {
                    String query;
                    if (StringUtil.hasValue(ahassID)) {
                        query = "SELECT * FROM get_pull_njbnsc_by_range_createdat(?,?,?) order by woid desc";
                    } else {
                        query = "SELECT * FROM get_pull_njbnsc_by_range_createdat(?,?) order by woid desc";
                    }
                    PreparedStatement ps = cnctn.prepareStatement(query);
                    ps.setTimestamp(1, Timestamp.valueOf(from));
                    ps.setTimestamp(2, Timestamp.valueOf(to));
                    if (StringUtil.hasValue(ahassID)) ps.setString(3, ahassID);

                    ResultSet rs = ps.executeQuery();
                    while (rs.next()) {
                        APIPullNjbNscHeader data = new APIPullNjbNscHeader();
                        data.setNoWorkOrder(rs.getString("woid"));
                        data.setCreatedTime(rs.getTimestamp("createdtime"));
                        data.setHondaIdMekanik(rs.getString("hondaidmekanik"));
                        data.setHondaIdSA(rs.getString("hondaidsa"));
                        data.setModifiedTime(rs.getTimestamp("modifiedtime"));
                        data.setDealerId(rs.getString("dealerid"));
                        data.setTotalHargaJasa(rs.getDouble("totalhargajasa"));
                        data.setTotalHargaSparepart(rs.getDouble("totalhargasparepart"));
                        data.setPromoIdJasa(rs.getString("promoidjasa"));
                        data.setPromoIdPart(rs.getString("promoidpart"));
                        data.setStartWOTime(rs.getTimestamp("startwotime"));
                        data.setFinishFinalCheckTime(rs.getTimestamp("modifiedtimeorafin"));
                        data.setTotalHargaNJB(rs.getDouble("totalharganjb"));
                        data.setTotalHargaNSC(rs.getDouble("totalhargansc"));
                        data.setTanggalNJB(rs.getTimestamp("tanggalnjb"));
                        data.setTanggalNSC(rs.getTimestamp("tanggalnsc"));
                        data.setNoWorkOrderOrafin(rs.getString("noworkorderorafin"));
                        data.setNoNJB(rs.getString("nonjb"));
                        data.setNoNSC(rs.getString("nonsc"));
                        data.setTotalDP(rs.getDouble("totalbiayajadi"));
                        data.setDiscountCode(rs.getString("discountcode"));
                        list.add(data);
                    }
                }
            });
            return list;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public List<APIPullNjbNscDetail> findAllPullNjbNscDetailByRangeDate(String startDate, String endDate, String ahassID) {
        List<APIPullNjbNscDetail> list = new ArrayList<>();
        try {
            Session session = entityManager.unwrap(Session.class);
            session.doWork(new Work() {
                @Override
                public void execute(Connection cnctn) throws SQLException {
                    String query;
                    if (StringUtil.hasValue(ahassID)) {
                        query = "SELECT * FROM get_detail_pull_njbnsc_by_range_createdat_v2(?,?,?)";
                    } else {
                        query = "SELECT * FROM get_detail_pull_njbnsc_by_range_createdat(?,?)";
                    }
                    PreparedStatement ps = cnctn.prepareStatement(query);
                    ps.setTimestamp(1, Timestamp.valueOf(startDate));
                    ps.setTimestamp(2, Timestamp.valueOf(endDate));
                    if (StringUtil.hasValue(ahassID)) ps.setString(3, ahassID);

                    ResultSet rs = ps.executeQuery();
                    while (rs.next()) {
                        APIPullNjbNscDetail data = new APIPullNjbNscDetail();
                        data.setWoID(rs.getString("woid"));
                        data.setCreatedAt(rs.getTimestamp("createdat"));
                        data.setModifiedAt(rs.getTimestamp("modifiedat"));
                        data.setHarga(rs.getDouble("harga"));
                        data.setDiscount(rs.getDouble("discount"));
                        data.setTotal(rs.getDouble("total"));
                        data.setQty(rs.getDouble("qty"));
                        data.setCwsCode(rs.getString("cwscode"));
                        data.setPartID(rs.getString("partid"));
                        data.setTipe(rs.getString("tipe"));
                        data.setUangMuka(rs.getDouble("uangmuka"));
                        list.add(data);
                    }
                }
            });
            return list;
        } catch (Exception e) {
            e.printStackTrace();
            return list;
        }
    }

    public List<APIPullNjbNscHeader> findAllNjbNscHeaderByWoID(String woID) {
        List<APIPullNjbNscHeader> list = new ArrayList<>();
        try {
            Session session = entityManager.unwrap(Session.class);
            session.doWork(new Work() {
                @Override
                public void execute(Connection cnctn) throws SQLException {
                    String query;
                    String prefix = woID.split("-")[0];
                    if (prefix.equalsIgnoreCase("SO") || prefix.equalsIgnoreCase("SOP")) {
                        query = "SELECT * FROM get_pull_njbnsc_by_soid(?)";
                    } else {
                        query = "SELECT * FROM get_pull_njbnsc_by_woid(?)";
                    }
                    PreparedStatement ps = cnctn.prepareStatement(query);
                    ps.setString(1, woID);

                    ResultSet rs = ps.executeQuery();
                    while (rs.next()) {
                        APIPullNjbNscHeader data = new APIPullNjbNscHeader();
                        data.setNoWorkOrder(rs.getString("woid"));
                        data.setCreatedTime(rs.getTimestamp("createdtime"));
                        data.setHondaIdMekanik(rs.getString("hondaidmekanik"));
                        data.setHondaIdSA(rs.getString("hondaidsa"));
                        data.setModifiedTime(rs.getTimestamp("modifiedtime"));
                        data.setDealerId(rs.getString("dealerid"));
                        data.setTotalHargaJasa(rs.getDouble("totalhargajasa"));
                        data.setTotalHargaSparepart(rs.getDouble("totalhargasparepart"));
                        data.setPromoIdJasa(rs.getString("promoidjasa"));
                        data.setPromoIdPart(rs.getString("promoidpart"));
                        data.setStartWOTime(rs.getTimestamp("startwotime"));
                        data.setFinishFinalCheckTime(rs.getTimestamp("modifiedtimeorafin"));
                        data.setTotalHargaNJB(rs.getDouble("totalharganjb"));
                        data.setTotalHargaNSC(rs.getDouble("totalhargansc"));
                        data.setTanggalNJB(rs.getTimestamp("tanggalnjb"));
                        data.setTanggalNSC(rs.getTimestamp("tanggalnsc"));
                        data.setNoWorkOrderOrafin(rs.getString("noworkorderorafin"));
                        data.setNoNJB(rs.getString("nonjb"));
                        data.setNoNSC(rs.getString("nonsc"));
                        data.setTotalDP(rs.getDouble("totalbiayajadi"));
                        data.setDiscountCode(rs.getString("discountcode"));

                        list.add(data);
                    }
                }
            });
            return list;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public List<APIPullNjbNscDetail> findAllPullNjbNscDetailByWoID(String woID) {
        List<APIPullNjbNscDetail> list = new ArrayList<>();
        try {
            Session session = entityManager.unwrap(Session.class);
            session.doWork(new Work() {
                @Override
                public void execute(Connection cnctn) throws SQLException {
                    String query;
                    String prefix = woID.split("-")[0];
                    if (prefix.equalsIgnoreCase("SO") || prefix.equalsIgnoreCase("SOP")) {
                        query = "SELECT * FROM get_detail_pull_njbnsc_by_soid(?)";
                    } else {
                        query = "SELECT * FROM get_detail_pull_njbnsc_by_woid_v2(?)";
                    }
                    PreparedStatement ps = cnctn.prepareStatement(query);
                    ps.setString(1, woID);

                    ResultSet rs = ps.executeQuery();
                    while (rs.next()) {
                        APIPullNjbNscDetail data = new APIPullNjbNscDetail();
                        data.setWoID(rs.getString("woid"));
                        data.setCreatedAt(rs.getTimestamp("createdat"));
                        data.setModifiedAt(rs.getTimestamp("modifiedat"));
                        data.setHarga(rs.getDouble("harga"));
                        data.setDiscount(rs.getDouble("discount"));
                        data.setTotal(rs.getDouble("total"));
                        data.setQty(rs.getDouble("qty"));
                        data.setCwsCode(rs.getString("cwscode"));
                        data.setPartID(rs.getString("partid"));
                        data.setTipe(rs.getString("tipe"));
                        data.setUangMuka(rs.getDouble("uangmuka"));
                        list.add(data);
                    }
                }
            });
            return list;
        } catch (Exception e) {
            e.printStackTrace();
            return list;
        }
    }
}