package easydo.technology.service.impl;

import easydo.technology.components.JdbcClient;
import easydo.technology.enums.MESEnum;
import easydo.technology.exception.BizException;
import easydo.technology.model.*;
import easydo.technology.service.FlowNoService;
import easydo.technology.service.PurchaseOrderService;
import easydo.technology.system.model.SysUser;
import easydo.technology.utils.StringUtil;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Service
public class PurchaseOrderServiceImpl implements PurchaseOrderService {

    @Resource
    private JdbcClient jdbcClient;

    @Resource
    private DataSource dataSource;

    @Resource
    private FlowNoService flowNoService;

    @Override
    @SuppressWarnings("unchecked")
    public Map<String, Object> getPage(Map<String, Object> map) throws Exception {
        Connection connection = dataSource.getConnection();
        try {
            // 1. 获取主表分页数据
            Map<String, Object> result = jdbcClient.getJdbcPage(map, PurchaseOrder.class, connection);
            List<PurchaseOrder> list = (List<PurchaseOrder>) result.get("records");
            if (list == null || list.isEmpty()) {
                if (result != null) {
                    result.put("records", new ArrayList<>());
                }
                return result;
            }

            for (PurchaseOrder model : list) {
                // 2. 补全文件列表 FileList
                try {
                    jdbcClient.getMinioFile(model, connection);
                } catch (Exception e) {
                    // 打印错误但继续执行
                }

                // 3. 补全采购计划 PurchasePlan
                if (model.getPurchasePlanId() != null) {
                    PurchasePlan purchasePlanParam = new PurchasePlan();
                    purchasePlanParam.setId(model.getPurchasePlanId());
                    model.setPurchasePlan(jdbcClient.getJdbcModelById(purchasePlanParam, connection));
                }

                // 4. 补全销售订单 SaleOrder
                if (model.getSaleOrderId() != null) {
                    SaleOrder saleOrderParam = new SaleOrder();
                    saleOrderParam.setId(model.getSaleOrderId());
                    model.setSaleOrder(jdbcClient.getJdbcModelById(saleOrderParam, connection));
                }

                // 5. 补全客户信息 Customer
                if (model.getCustomerId() != null) {
                    Customer customerParam = new Customer();
                    customerParam.setId(model.getCustomerId());
                    Customer customer = jdbcClient.getJdbcModelById(customerParam, connection);
                    if (customer != null) {
                        model.setCustomerName(customer.getName());
                    }
                }

                // 6. 补全负责人姓名 ManagerName
                if (model.getManagerId() != null) {
                    SysUser managerParam = new SysUser();
                    managerParam.setId(model.getManagerId());
                    SysUser manager = jdbcClient.getJdbcModelById(managerParam, connection);
                    if (manager != null) {
                        model.setManagerName(manager.getNickName());
                    }
                }

                // 7. 补全明细列表 ChildrenList
                PurchaseOrderDetail detailParam = new PurchaseOrderDetail();
                detailParam.setOrderId(model.getId());
                List<PurchaseOrderDetail> detailList = jdbcClient.getJdbcList(detailParam, connection);
                if (detailList != null) {
                    for (PurchaseOrderDetail detail : detailList) {
                        // 6.1 补全明细中的物料信息 ProductMaterial
                        if (detail.getMaterialCode() != null) {
                            ProductMaterial materialParam = new ProductMaterial();
                            materialParam.setCode(detail.getMaterialCode());
                            detail.setMaterial(jdbcClient.getJdbcModel(materialParam, connection));
                        }
                    }
                    model.setChildrenList(detailList);
                } else {
                    model.setChildrenList(new ArrayList<>());
                }
            }

            result.put("records", list);
            return result;
        } catch (Exception e) {
            throw new BizException(e.getMessage());
        } finally {
            if (connection != null) {
                connection.close();
            }
        }
    }

    @Override
    public PurchaseOrder save(PurchaseOrder model) throws Exception {
        Connection connection = dataSource.getConnection();
        connection.setAutoCommit(false);
        try {
            // 1) 生成编码（支持手填校验 + 自动生成）
            String code = flowNoService.generatePurchaseOrderCode(model, connection);
            model.setCode(code);

            // 2) 初始状态 pending
            model.setStatus(MESEnum.PURCHASE_ORDER_OF_STATUS_PENDING.getValue());

            // 3) 插入主表（会自动保存附件 fileList）
            jdbcClient.jdbcInsert(model, connection);

            // 4) 插入明细
            List<PurchaseOrderDetail> detailList = model.getChildrenList();
            if (detailList != null) {
                for (PurchaseOrderDetail detail : detailList) {
                    detail.setOrderId(model.getId());
                    jdbcClient.jdbcInsert(detail, connection);
                }
            }

            // 5) 更新采购计划状态为 processing
            if (StringUtil.isNotEmpty(model.getPurchasePlanId())) {
                PurchasePlan purchasePlan = new PurchasePlan();
                purchasePlan.setId(model.getPurchasePlanId());
                purchasePlan.setStatus(MESEnum.PURCHASE_PLAN_OF_STATUS_PROCESSING.getValue());
                jdbcClient.jdbcUpdateById(purchasePlan, connection);
            }

            connection.commit();
            return model;
        } catch (Exception e) {
            connection.rollback();
            throw new BizException(e.getMessage());
        } finally {
            connection.close();
        }
    }

    @Override
    public PurchaseOrder update(PurchaseOrder model) throws Exception {
        Connection connection = dataSource.getConnection();
        connection.setAutoCommit(false);
        try {
            // 1) 更新主表（会自动保存附件 fileList）
            jdbcClient.jdbcUpdateById(model, connection);

            // 2) 删除旧明细
            PurchaseOrderDetail removeParam = new PurchaseOrderDetail();
            removeParam.setOrderId(model.getId());
            jdbcClient.jdbcRemove(removeParam, connection);

            // 3) 插入新明细
            List<PurchaseOrderDetail> detailList = model.getChildrenList();
            if (detailList != null) {
                for (PurchaseOrderDetail detail : detailList) {
                    detail.setOrderId(model.getId());
                    jdbcClient.jdbcInsert(detail, connection);
                }
            }

            connection.commit();
            return model;
        } catch (Exception e) {
            connection.rollback();
            throw new BizException(e.getMessage());
        } finally {
            connection.close();
        }
    }

    @Override
    public PurchaseOrder remove(PurchaseOrder model) throws Exception {
        Connection connection = dataSource.getConnection();
        connection.setAutoCommit(false);
        try {
            // 1) 删除主表（JdbcClient 会自动删除附件）
            jdbcClient.jdbcRemoveById(model, connection);

            // 2) 删除明细
            PurchaseOrderDetail removeParam = new PurchaseOrderDetail();
            removeParam.setOrderId(model.getId());
            jdbcClient.jdbcRemove(removeParam, connection);

            connection.commit();
            return model;
        } catch (Exception e) {
            connection.rollback();
            throw new BizException(e.getMessage());
        } finally {
            connection.close();
        }
    }


}
