package com.clx.performance.sqlProvider;

import com.clx.performance.enums.OrderGoodsStatusEnum;
import com.clx.performance.enums.OrderGoodsTruckBindEnum;
import com.clx.performance.model.OrderGoodsTruckBind;
import org.apache.ibatis.jdbc.SQL;

import java.util.List;
import java.util.StringJoiner;
import java.util.stream.Collectors;

public class OrderGoodsTruckBindSqlProvider {

    public String saveBatchEntity(String orderNo, String orderGoodsNo, List<String> trackList, String now) {
        StringBuffer sqlList = new StringBuffer();

        sqlList.append(" INSERT INTO order_goods_truck_bind(order_no,order_goods_no,truck_no,create_time,modified_time,status)  VALUES ");
        for (int i = 0; i < trackList.size(); i++) {
            String truckNo = trackList.get(i);
            sqlList.append(" ('").append(orderNo).append("','").append(orderGoodsNo).append("','").append(truckNo).append("','")
                    .append(now).append("','").append(now).append("','").append(OrderGoodsTruckBindEnum.Status.NORMAL.getCode())
                    .append("')");
            if (i < trackList.size() - 1) {
                sqlList.append(",");
            }
        }
        return sqlList.toString();
    }


    public String findUnreleasedTruck(){
        return new SQL(){{
            SELECT(" truck_no ");
            FROM("order_goods_truck_bind");
            WHERE("status IN ("  + OrderGoodsTruckBindEnum.Status.GET.getCode() + "," +
                    OrderGoodsTruckBindEnum.Status.NORMAL.getCode() + ")" );

        }}.toString();
    }
    public String selectListByTruckNo(List<String> truckList){
        return new SQL(){{
            SELECT(" a.order_goods_no ");
            FROM("order_goods_truck_bind a");
            LEFT_OUTER_JOIN("order_goods b on a.order_goods_no = b.order_goods_no");
            WHERE("a.truck_no IN ("  + truckList.stream().map(code -> "'"+code+"'").collect(Collectors.joining(","))+ ")" );
            WHERE("a.`status` =" + OrderGoodsTruckBindEnum.Status.NORMAL.getCode());
            WHERE("b.order_goods_status IN ( " + OrderGoodsStatusEnum.Status.PAYING.getCode() + ","
                    + OrderGoodsStatusEnum.Status.GO_TO_SEND.getCode() +")");

        }}.toString();
    }

    public String queryOrderGoodsTruckNum(List<String> fleetNoList){
        return new SQL(){{
            SELECT(" a.order_goods_no,count(*) truckNum ");
            FROM("order_goods_truck_bind a");
            StringJoiner sj = new StringJoiner(",","a.order_goods_no in (",")");
            fleetNoList.forEach(item -> sj.add("'"+item+"'"));
            WHERE(sj.toString());
            GROUP_BY("a.order_goods_no");
        }}.toString();
    }


    public String batchCancelTruckList(List<OrderGoodsTruckBind> updateList){
        StringJoiner sj = new StringJoiner("; ");
        for(OrderGoodsTruckBind bind : updateList){
            sj.add("update order_goods_truck_bind " +
                    "set " +
                    "status = " + bind.getStatus() + " "  +
                    "where order_no = '" +  bind.getOrderNo()+ "' "  +
                    "and order_goods_no = '" + bind.getOrderGoodsNo() + "' "  +
                    "and truck_no = '" + bind.getTruckNo() + "'"
            );
        }
        return sj.toString();
    }
}
