package com.app.hxqh.routes;

import com.app.crontask.ChangeTimeUtils;
import psdi.app.route.Route;
import psdi.app.route.RouteRemote;
import psdi.mbo.Mbo;
import psdi.mbo.MboRemote;
import psdi.mbo.MboSet;
import psdi.mbo.MboSetRemote;
import psdi.server.MXServer;
import psdi.util.MXException;

import java.rmi.RemoteException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

/**
 * 检修路线Mbo
 */
public class UdRoutesMbo extends Route implements RouteRemote {

    public UdRoutesMbo(MboSet ms) throws MXException, RemoteException {
        super(ms);
    }

    @Override
    public void init() throws MXException {
        super.init();
        try {
            String[] mainFields = new String[] {"ROUTE","DESCRIPTION"};
            String status=getString("STATUS");
            if("ACTIVE".equalsIgnoreCase(status)){
                setFieldFlag(mainFields, 7L, true);
                getMboSet("ROUTE_STOP").setFlag(7L, true);
            }
        } catch (RemoteException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void save() throws MXException, RemoteException {
        super.save();
        MboSetRemote routeLineSet=getMboSet("ROUTE_STOP");
        if(null!=routeLineSet && !routeLineSet.isEmpty()){
            String orgid=getString("ORGID");
            String siteid=getString("SITEID");
            String status=getString("STATUS");
            int routesid=getInt("ROUTESID");
            MboSetRemote djkssjwhbSet=getMboSet("$UDDJKSSJWH", "UDDJKSSJWH","ORGID='"+orgid+"' AND SITEID='"+siteid+"'");
            if(null!=djkssjwhbSet && !djkssjwhbSet.isEmpty() && ("ACTIVE".equalsIgnoreCase(status) && isModified("STATUS"))){
                Date serverstart=djkssjwhbSet.getMbo(0).getDate("SERVERSTART");
                int hours = serverstart.getHours();
                int minutes = serverstart.getMinutes();
                int seconds = serverstart.getSeconds();
                Calendar calendar = Calendar.getInstance();

                MboSetRemote djbzpmlineSet = MXServer.getMXServer().getMboSet("PMSTDARDLINES",MXServer.getMXServer().getSystemUserInfo());
                MboRemote zctzdjbzMbo=null;
                for(int i=0;i<routeLineSet.count();i++){
                    MboRemote routelineMbo=routeLineSet.getMbo(i);
                    String assetTemp=routelineMbo.getString("ASSET.TEMPLATEID");
                    String assetnum=routelineMbo.getString("ASSETNUM");
                    Date assetTyrq=getMboSet("$ASSET", "ASSET","ASSETNUM='"+assetnum+"'").getMbo(0).getDate("CREATEDATE");

                    int route_stopid=routelineMbo.getInt("ROUTE_STOPID");
//                    MboSetRemote pmlineSet=getMboSet("$PMSTDARDLINES", "PMSTDARDLINES","PMPOINTNUM in(SELECT PMPOINTNUM FROM PMSTDARD WHERE TEMPLATEID='"+assetTemp+"') AND ORGID='"+orgid+"'");
                    MboSetRemote pmlineSet = MXServer.getMXServer().getMboSet("PMSTDARDLINES",MXServer.getMXServer().getSystemUserInfo());
                    //ORGID=:ORGID and SITEID =:SITEID and PMPOINTNUM =:PMPOINTNUM
                    pmlineSet.setWhere(" PMPOINTNUM in(SELECT PMPOINTNUM FROM PMSTDARD WHERE TEMPLATEID='"+assetTemp+"' AND ORGID='"+orgid+"') AND ORGID='"+orgid+"'");
                    pmlineSet.reset();
                    pmlineSet.setOrderBy("NUM");

                    if(null!=pmlineSet && !pmlineSet.isEmpty()){
                        for(int j=0;j<pmlineSet.count();j++){
                            MboRemote pmlineMbo=pmlineSet.getMbo(j);
                            djbzpmlineSet.setWhere("PARENTID="+pmlineMbo.getInt("PMSTDARDLINESID")+" and ASSETNUM='"+assetnum+"' and SPOTRUNID="+route_stopid+" ");
                            djbzpmlineSet.reset();
                            if(null!=djbzpmlineSet && !djbzpmlineSet.isEmpty()){
                                zctzdjbzMbo=djbzpmlineSet.getMbo(0);
                                zctzdjbzMbo.setValue("NUM", pmlineMbo.getInt("NUM"), 2L);
                                zctzdjbzMbo.setValue("DESCRIPTION",pmlineMbo.getString("DESCRIPTION"),2L);
                                zctzdjbzMbo.setValue("POSITION",pmlineMbo.getString("POSITION"),2L);
                                zctzdjbzMbo.setValue("POINTTOOLS",pmlineMbo.getString("POINTTOOLS"),2L);
                                zctzdjbzMbo.setValue("WORKTYPE",pmlineMbo.getString("WORKTYPE"),2L);
                                zctzdjbzMbo.setValue("STATUS",pmlineMbo.getString("STATUS"),2L);
                                zctzdjbzMbo.setValue("PERGROUP",pmlineMbo.getString("PERGROUP"),2L);
                                zctzdjbzMbo.setValue("ISINPUT",pmlineMbo.getBoolean("ISINPUT"),2L);
                                zctzdjbzMbo.setValue("POINTDATUM",pmlineMbo.getString("POINTDATUM"),2L);
                                zctzdjbzMbo.setValue("FWAY",pmlineMbo.getString("FWAY"),2L);
                                zctzdjbzMbo.setValue("UNSUAL",pmlineMbo.getString("UNSUAL"),2L);
                                zctzdjbzMbo.setValue("FREQUENCY",pmlineMbo.getInt("FREQUENCY"),2L);
                                zctzdjbzMbo.setValue("FREQUNIT",pmlineMbo.getString("FREQUNIT"),2L);
                                zctzdjbzMbo.setValue("POINTMETHOD",pmlineMbo.getString("POINTMETHOD"),2L);
                                zctzdjbzMbo.setValue("REMARKS",pmlineMbo.getString("REMARKS"),2L);
                                zctzdjbzMbo.setValue("UPPERACTION",pmlineMbo.getDouble("UPPERACTION"),2L);
                                zctzdjbzMbo.setValue("LOWERACTION",pmlineMbo.getDouble("LOWERACTION"),2L);
                                zctzdjbzMbo.getThisMboSet().save();
                            }else{
                                zctzdjbzMbo=djbzpmlineSet.add(2L);
                                zctzdjbzMbo.setValue("ASSETNUM", assetnum,2L);
                                zctzdjbzMbo.setValue("SPOTRUNID", route_stopid,2L);
                                zctzdjbzMbo.setValue("ORGID", orgid,2L);
                                zctzdjbzMbo.setValue("SITEID", siteid,2L);
                                zctzdjbzMbo.setValue("NUM", pmlineMbo.getInt("NUM"), 2L);
                                zctzdjbzMbo.setValue("PARENTID",pmlineMbo.getInt("PMSTDARDLINESID"),2L);
                                zctzdjbzMbo.setValue("DESCRIPTION",pmlineMbo.getString("DESCRIPTION"),2L);
                                zctzdjbzMbo.setValue("POSITION",pmlineMbo.getString("POSITION"),2L);
                                zctzdjbzMbo.setValue("POINTTOOLS",pmlineMbo.getString("POINTTOOLS"),2L);
                                zctzdjbzMbo.setValue("WORKTYPE",pmlineMbo.getString("WORKTYPE"),2L);
                                zctzdjbzMbo.setValue("STATUS",pmlineMbo.getString("STATUS"),2L);
                                zctzdjbzMbo.setValue("PERGROUP",pmlineMbo.getString("PERGROUP"),2L);
                                zctzdjbzMbo.setValue("ISINPUT",pmlineMbo.getBoolean("ISINPUT"),2L);
                                zctzdjbzMbo.setValue("POINTDATUM",pmlineMbo.getString("POINTDATUM"),2L);
                                zctzdjbzMbo.setValue("FWAY",pmlineMbo.getString("FWAY"),2L);
                                zctzdjbzMbo.setValue("UNSUAL",pmlineMbo.getString("UNSUAL"),2L);
                                zctzdjbzMbo.setValue("FREQUENCY",pmlineMbo.getInt("FREQUENCY"),2L);
                                zctzdjbzMbo.setValue("FREQUNIT",pmlineMbo.getString("FREQUNIT") ,2L);
                                zctzdjbzMbo.setValue("POINTMETHOD",pmlineMbo.getString("POINTMETHOD"),2L);
                                zctzdjbzMbo.setValue("REMARKS",pmlineMbo.getString("REMARKS"),2L);
                                zctzdjbzMbo.setValue("UPPERACTION",pmlineMbo.getDouble("UPPERACTION"),2L);
                                zctzdjbzMbo.setValue("LOWERACTION",pmlineMbo.getDouble("LOWERACTION"),2L);
                                zctzdjbzMbo.setValue("LANGCODE","EN",2L);

                                try {
                                    //按当地的投运时间取下次执行时间
                                    Date curDate=new Date();
                                    Date curSerDate=null;
                                    Date nextComDate=nextComDate(pmlineMbo.getString("FREQUNIT"),assetTyrq,pmlineMbo.getInt("FREQUENCY"));
                                    if("GF03".equalsIgnoreCase(siteid) || "GF02".equalsIgnoreCase(siteid) || "GF51".equalsIgnoreCase(siteid) || "GF08".equalsIgnoreCase(siteid) || "GH01".equalsIgnoreCase(siteid) || "SN51".equalsIgnoreCase(siteid)){
                                        curDate = ChangeTimeUtils.changeHour(curDate, -8);//转换成当地时间
                                        curSerDate=ChangeTimeUtils.changeHour(curDate, 8);//转换成北京时间
                                    }else if("KF61".equalsIgnoreCase(siteid) || "KF51".equalsIgnoreCase(siteid)
                                        || "TF51".equalsIgnoreCase(siteid) || "TF01".equalsIgnoreCase(siteid) || "TZ01".equalsIgnoreCase(siteid)){
                                        curDate = ChangeTimeUtils.changeHour(curDate, -5);//转换成当地时间
                                        curSerDate= ChangeTimeUtils.changeHour(curDate, 5);//转换成北京时间
                                    }else if("ZM31".equalsIgnoreCase(siteid)){
                                        curDate = ChangeTimeUtils.changeHour(curDate, -6);//转换成当地时间
                                        curSerDate= ChangeTimeUtils.changeHour(curDate, 6);//转换成北京时间
                                    }
                                    int comparisonResult =nextComDate.compareTo(curDate);

                                    if (comparisonResult < 0) {
                                        calendar.setTime(curSerDate);
                                        calendar.set(Calendar.HOUR_OF_DAY, hours);
                                        calendar.set(Calendar.MINUTE, minutes);
                                        calendar.set(Calendar.SECOND, seconds);
                                        Date NEXTEXDATE=calendar.getTime();
                                        zctzdjbzMbo.setValue("NEXTEXDATE",NEXTEXDATE,2L);
                                    } else if (comparisonResult > 0) {
                                        calendar.setTime(nextComDate);
                                        // 设置指定的年、月、日、时、分、秒
                                        calendar.set(Calendar.HOUR_OF_DAY, hours);
                                        calendar.set(Calendar.MINUTE, minutes);
                                        calendar.set(Calendar.SECOND, seconds);
                                        Date NEXTEXDATE=calendar.getTime();
                                        zctzdjbzMbo.setValue("NEXTEXDATE",NEXTEXDATE,2L);
                                    }

                                } catch (Exception e) {
                                    e.printStackTrace();
                                    e.getCause();
                                    e.getMessage();
                                }
                                zctzdjbzMbo.getThisMboSet().save();
                            }
                        }
                    }
                }
            }

        }

    }


    /**
     * 获取下次执行时间
     * @param frequnit
     * @param firsDate
     * @param frequency
     * @return
     * @throws Exception
     */
    public Date nextComDate(String frequnit,Date firsDate,int frequency) throws Exception {
        Date commitTime=null;
        if ("DAY".equalsIgnoreCase(frequnit)) {//日
            commitTime = ChangeTimeUtils.changeDay(firsDate, frequency);
        }
        if ("HOUR".equalsIgnoreCase(frequnit)) {//小时
            commitTime = ChangeTimeUtils.changeHour(firsDate, frequency);
        }
        if ("MONTH".equalsIgnoreCase(frequnit)) {//月
            commitTime = ChangeTimeUtils.changeMonth(firsDate, frequency);
            SimpleDateFormat sf9=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        }
        if ("QUARTER".equalsIgnoreCase(frequnit)) {//季度
            commitTime = ChangeTimeUtils.changeQuarter(firsDate, frequency);
        }
        if ("WEEK".equalsIgnoreCase(frequnit)) {//周
            commitTime = ChangeTimeUtils.changeWeek(firsDate, frequency);
        }
        if ("YEAR".equalsIgnoreCase(frequnit)) {//年
            commitTime = ChangeTimeUtils.changeYear(firsDate, frequency);
        }
        return commitTime;
    }

    @Override
    public void add() throws MXException, RemoteException {
        super.add();

    }


    @Override
    public void delete() throws MXException, RemoteException {
        super.delete();
    }

}
