package com.casic.PgInterface.devTable.manager;

import com.casic.PgInterface.core.hibernate.HibernateEntityDao;
import com.casic.PgInterface.core.util.StringUtils;
import com.casic.PgInterface.devTable.domain.PgIntelPlan;
import com.casic.PgInterface.devTable.dto.PgIntelPlanDto;
import com.casic.PgInterface.devTable.dto.PgIntelPlanTypeDto;
import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class PgIntelPlanManager extends HibernateEntityDao<PgIntelPlan> {

    public List<PgIntelPlanDto> getPgIntelPlanListByPartion(String lineName,String partitionStr){
        try {
            List<PgIntelPlan> pgIntelPlanList=getPgIntelPlan(lineName,partitionStr);
            List<PgIntelPlanDto> pgIntelPlanDtoList=PgIntelPlanDto.ConvertToDTOList(pgIntelPlanList);

            return pgIntelPlanDtoList;
        }
        catch(Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }

    private List<PgIntelPlan> getPgIntelPlan(String lineName,String partitionStr){

        List<PgIntelPlan> pgIntelPlanList=new ArrayList<>();

        if(StringUtils.isNotBlank(partitionStr)) {
            String[] parNameArray = partitionStr.split(",");
            for (String parName : parNameArray) {

                PgIntelPlan pgIntelPlan = getPgIntelPlanByParNameAndLine(lineName, parName);

                //如果分区不存对应的排线信息
                if (pgIntelPlan == null) {
                    pgIntelPlan = new PgIntelPlan();
                    pgIntelPlan.setLineName(lineName);
                    pgIntelPlan.setParName(parName);
                    pgIntelPlan.setMaxNum(0);
                    pgIntelPlan.setExistNum(0);
                }
                pgIntelPlanList.add(pgIntelPlan);
            }
        }
        else{
            Criteria criteria = createCriteria(PgIntelPlan.class);
            if (StringUtils.isNotBlank(lineName)) {
                criteria.add(Restrictions.eq("lineName", lineName));
            }

            criteria.add(Restrictions.eq("active", true));
            criteria.addOrder(Order.desc("id"));

            pgIntelPlanList=criteria.list();
        }

        return pgIntelPlanList;
    }

    public PgIntelPlan getPgIntelPlanByParNameAndLine(String lineName,String parName){

        Criteria criteria = createCriteria(PgIntelPlan.class);
        if (StringUtils.isNotBlank(lineName)) {
            criteria.add(Restrictions.eq("lineName", lineName));
        }

        if (StringUtils.isNotBlank(parName)) {
            criteria.add(Restrictions.eq("parName", parName));
        }

        criteria.add(Restrictions.eq("active", true));
        criteria.addOrder(Order.desc("id"));

        List<PgIntelPlan> pgIntelPlanList=criteria.list();

        if(pgIntelPlanList==null||pgIntelPlanList.size()==0)
            return null;
        else
            return pgIntelPlanList.get(0);
    }

    public void savePgIntelPlan(String parName,String lineName,String maxNumStr,String existNumStr){

        int maxNum= Integer.valueOf(maxNumStr);
        int existNum=Integer.valueOf(existNumStr);
        PgIntelPlan pgIntelPlan=null;

        PgIntelPlan pgIntelPlan1=getPgIntelPlanByParNameAndLine(lineName,parName);
        if(pgIntelPlan1!=null)
            pgIntelPlan=pgIntelPlan1;
        else
            pgIntelPlan=new PgIntelPlan();

        pgIntelPlan.setParName(parName);
        pgIntelPlan.setLineName(lineName);
        pgIntelPlan.setMaxNum(maxNum);
        pgIntelPlan.setExistNum(existNum);
        pgIntelPlan.setActive(true);

        this.save(pgIntelPlan);
    }

    public List<PgIntelPlanTypeDto> getIntelPlanType() {

        List<PgIntelPlanTypeDto> pgIntelPlanTypeDtoList=new ArrayList<>();

        String sql = "select distinct lineName from PG_INTELPLAN";
        List<Object> objects = this.getSession().createSQLQuery(sql).list();

        for (Object objects1 : objects) {
            PgIntelPlanTypeDto pgIntelPlanTypeDto=new PgIntelPlanTypeDto();
            pgIntelPlanTypeDto.setLineName(objects1.toString());

            pgIntelPlanTypeDtoList.add(pgIntelPlanTypeDto);
        }

        return pgIntelPlanTypeDtoList;
    }

    public boolean addLineUse(String lineName,String parName,String numStr){
        PgIntelPlan pgIntelPlan=getPgIntelPlanByParNameAndLine(lineName,parName);

        int num=Integer.valueOf(numStr);

        if(pgIntelPlan==null) return false;
        else
        {
            int existNum=pgIntelPlan.getExistNum();

            if((existNum+num)>pgIntelPlan.getMaxNum())
                return false;
            else{
                pgIntelPlan.setExistNum(existNum+num);
                this.save(pgIntelPlan);

                return true;
            }
        }

    }

}