/*
    Copywrite 2016 Will Winder

    This file is part of Universal Gcode Sender (UGS).

    UGS is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    UGS is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with UGS.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.willwinder.universalgcodesender.listeners;

import com.willwinder.universalgcodesender.model.Position;

/**
 *
 * @author wwinder
 */
public class ControllerStatus {
    private final String state;
    private final Position machineCoord;
    private final Position workCoord;
    private final Position workCoordinateOffset;
    private final Double feedSpeed;
    private final Double spindleSpeed;
    private final OverridePercents overrides;
    private final EnabledPins pins;
    private final AccessoryStates accessoryStates;


    /**
     * Baseline constructor. This data should always be present. Represents the
     * controller status.
     * @param state controller state, i.e. idle/hold/running
     * @param machineCoord controller machine coordinates
     * @param workCoord controller work coordinates
     */
    public ControllerStatus(String state, Position machineCoord, Position workCoord) {
        this(state, machineCoord, workCoord, null, null, null, null, null, null);
    }

    /**
     * Additional parameters
     */
    public ControllerStatus(String state, Position machineCoord,
            Position workCoord, Double feedSpeed, Double spindleSpeed,
            OverridePercents overrides, Position workCoordinateOffset,
            EnabledPins pins, AccessoryStates states) {
        this.state = state;
        this.machineCoord = machineCoord;
        this.workCoord = workCoord;
        this.workCoordinateOffset = workCoordinateOffset;
        this.feedSpeed = feedSpeed;
        this.spindleSpeed = spindleSpeed;
        this.overrides = overrides;
        this.pins = pins;
        this.accessoryStates = states;
    }

    public String getState() {
        return state;
    }

    public Position getMachineCoord() {
        return machineCoord;
    }

    public Position getWorkCoord() {
        return workCoord;
    }

    public Position getWorkCoordinateOffset() {
        return workCoordinateOffset;
    }

    public Double getFeedSpeed() {
        return feedSpeed;
    }

    public Double getSpindleSpeed() {
        return spindleSpeed;
    }

    public OverridePercents getOverrides() {
        return overrides;
    }

    public EnabledPins getEnabledPins() {
        return pins;
    }

    public AccessoryStates getAccessoryStates() {
        return accessoryStates;
    }

    public static class EnabledPins {
        final public boolean X;
        final public boolean Y;
        final public boolean Z;
        final public boolean Probe;
        final public boolean Door;
        final public boolean Hold;
        final public boolean SoftReset;
        final public boolean CycleStart;

        public EnabledPins(String enabled) {
            String enabledUpper = enabled.toUpperCase();
            X = enabledUpper.contains("X");
            Y = enabledUpper.contains("Y");
            Z = enabledUpper.contains("Z");
            Probe = enabledUpper.contains("P");
            Door = enabledUpper.contains("D");
            Hold = enabledUpper.contains("H");
            SoftReset = enabledUpper.contains("R");
            CycleStart = enabledUpper.contains("S");
        }
    }

    public static class AccessoryStates {
        final public boolean SpindleCW;
        final public boolean SpindleCCW;
        final public boolean Flood;
        final public boolean Mist;

        public AccessoryStates(String enabled) {
            String enabledUpper = enabled.toUpperCase();
            SpindleCW = enabledUpper.contains("S");
            SpindleCCW = enabledUpper.contains("C");
            Flood = enabledUpper.contains("F");
            Mist = enabledUpper.contains("M");
        }
    }

    public static class OverridePercents {
        final public int feed;
        final public int rapid;
        final public int spindle;
        public OverridePercents(int f, int r, int s) {
            feed = f;
            rapid = r;
            spindle = s;
        }
    }
}