package com.tsi.navi.activity.model;

import com.tsi.navi.dto.CpuStatusDTO;
import com.tsi.navi.util.TsiUtils;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class SignalItem {

    private int direction;
    private int[] lightStatus = {
            TsiUtils.LIGHT_STATUS_NONE,
            TsiUtils.LIGHT_STATUS_NONE,
            TsiUtils.LIGHT_STATUS_NONE,
            TsiUtils.LIGHT_STATUS_NONE,
            TsiUtils.LIGHT_STATUS_NONE,
            TsiUtils.LIGHT_STATUS_NONE,
            TsiUtils.LIGHT_STATUS_NONE,
            TsiUtils.LIGHT_STATUS_NONE };
    private int[] remainTime  = {
            TsiUtils.DATA_NONE,
            TsiUtils.DATA_NONE,
            TsiUtils.DATA_NONE,
            TsiUtils.DATA_NONE,
            TsiUtils.DATA_NONE,
            TsiUtils.DATA_NONE,
            TsiUtils.DATA_NONE,
            TsiUtils.DATA_NONE };
    private int[] displayTime = {
            TsiUtils.DATA_NONE,
            TsiUtils.DATA_NONE,
            TsiUtils.DATA_NONE,
            TsiUtils.DATA_NONE,
            TsiUtils.DATA_NONE,
            TsiUtils.DATA_NONE,
            TsiUtils.DATA_NONE,
            TsiUtils.DATA_NONE };

    private int[] timeReliability = {
            TsiUtils.DATA_NONE,
            TsiUtils.DATA_NONE,
            TsiUtils.DATA_NONE,
            TsiUtils.DATA_NONE,
            TsiUtils.DATA_NONE,
            TsiUtils.DATA_NONE,
            TsiUtils.DATA_NONE,
            TsiUtils.DATA_NONE };
    private boolean[] walkerPush = { false, false, false, false, false, false, false, false };
    private boolean[] unprotect = { false, false, false, false, false, false, false, false };

    private boolean isValid = false;

    public void initStatus() {
        for (int ii = 0; ii < TsiUtils.MAX_LIGHT_TYPE; ii++) {
            this.lightStatus[ii] = TsiUtils.LIGHT_STATUS_NONE;
            this.remainTime[ii] = TsiUtils.DATA_NONE;
            this.displayTime[ii] = TsiUtils.DATA_NONE;
            this.timeReliability[ii] = TsiUtils.DATA_NONE;
        }
    }

    public void setStatus(CpuStatusDTO status) {
        int idx = status.getA();
        if (idx >= TsiUtils.SIGNAL_MIN && idx <= TsiUtils.SIGNAL_MAX) {
            this.lightStatus[idx] = status.getE();
            this.remainTime[idx] = status.getG();
            this.displayTime[idx] = status.getF();
            this.timeReliability[idx] = status.getB();
            this.walkerPush[idx] = status.isC();
            this.unprotect[idx] = status.isD();
        }
    }

    public int getLightStatus(int idx) {
        if (idx >= TsiUtils.SIGNAL_MIN && idx <= TsiUtils.SIGNAL_MAX)
            return lightStatus[idx];
        return TsiUtils.DATA_NONE;
    }
    public int getRemainTime(int idx) {
        if (idx >= TsiUtils.SIGNAL_MIN && idx <= TsiUtils.SIGNAL_MAX)
            return remainTime[idx];
        return TsiUtils.DATA_NONE;
    }
    public int getDisplayTime(int idx) {
        if (idx >= TsiUtils.SIGNAL_MIN && idx <= TsiUtils.SIGNAL_MAX)
            return displayTime[idx];
        return TsiUtils.DATA_NONE;
    }
    public int getTimeReliability(int idx) {
        if (idx >= TsiUtils.SIGNAL_MIN && idx <= TsiUtils.SIGNAL_MAX)
            return timeReliability[idx];
        return TsiUtils.DATA_NONE;
    }
    public boolean getWalkerPush(int idx) {
        if (idx >= TsiUtils.SIGNAL_MIN && idx <= TsiUtils.SIGNAL_MAX)
            return walkerPush[idx];
        return false;
    }
    public boolean getUnprotect(int idx) {
        if (idx >= TsiUtils.SIGNAL_MIN && idx <= TsiUtils.SIGNAL_MAX)
            return unprotect[idx];
        return false;
    }

    public void setLightStatus(int idx, int value) {
        if (idx >= TsiUtils.SIGNAL_MIN && idx <= TsiUtils.SIGNAL_MAX)
            lightStatus[idx] = value;
    }
    public void setRemainTime(int idx, int value) {
        if (idx >= TsiUtils.SIGNAL_MIN && idx <= TsiUtils.SIGNAL_MAX)
            remainTime[idx] = value;
    }
    public void setDisplayTime(int idx, int value) {
        if (idx >= TsiUtils.SIGNAL_MIN && idx <= TsiUtils.SIGNAL_MAX)
            displayTime[idx] = value;
    }
    public void setTimeReliability(int idx, int value) {
        if (idx >= TsiUtils.SIGNAL_MIN && idx <= TsiUtils.SIGNAL_MAX)
            timeReliability[idx] = value;
    }
    public void setWalkerPush(int idx, boolean value) {
        if (idx >= TsiUtils.SIGNAL_MIN && idx <= TsiUtils.SIGNAL_MAX) {
            walkerPush[idx] = value;
        }
    }
    public void setUnprotect(int idx, boolean value) {
        //if (idx >= TsiUtils.SIGNAL_MIN && idx <= TsiUtils.SIGNAL_MAX) {
            unprotect[idx] = value;
        //}
    }
}
