001/************************* PROJECT RON *************************/
002/* Copyright (c) 2026 StuyPulse Robotics. All rights reserved. */
003/* Use of this source code is governed by an MIT-style license */
004/* that can be found in the repository LICENSE file.           */
005/***************************************************************/
006package com.stuypulse.robot.commands.leds;
007
008import com.stuypulse.robot.constants.Settings;
009import com.stuypulse.robot.subsystems.feeder.Feeder;
010import com.stuypulse.robot.subsystems.handoff.Handoff;
011import com.stuypulse.robot.subsystems.intake.Intake;
012import com.stuypulse.robot.subsystems.leds.LEDController;
013import com.stuypulse.robot.subsystems.shooter.Shooter;
014import edu.wpi.first.wpilibj.DriverStation;
015import edu.wpi.first.wpilibj.LEDPattern;
016import edu.wpi.first.wpilibj2.command.Command;
017
018public class LEDDefaultCommand extends Command {
019
020    private final LEDController leds;
021
022    private final Shooter shooter;
023
024    private final Feeder feeder;
025
026    private final Intake intake;
027
028    private final Handoff handoff;
029
030    public LEDDefaultCommand() {
031        leds = LEDController.getInstance();
032        shooter = Shooter.getInstance();
033        feeder = Feeder.getInstance();
034        intake = Intake.getInstance();
035        handoff = Handoff.getInstance();
036        addRequirements(leds);
037    }
038
039    @Override
040    public boolean runsWhenDisabled() {
041        return true;
042    }
043
044    @Override
045    public void execute() {
046        if (!Settings.EnabledSubsystems.LED.get()) {
047            return;
048        }
049        if (DriverStation.isDisabled()) {
050            leds.applyPattern(Settings.LED.DISABLED);
051            return;
052        }
053        // These probably won't actually be what we want the LEDs to be showing
054        // TODO: Figure out what we want the LEDs to show
055        switch (shooter.getState()) {
056            case SHOOT -> leds.applyShoot(Settings.LED.SHOOTING);
057            case FERRY -> leds.applyShoot(Settings.LED.FERRYING);
058            case MANUAL_HUB -> leds.applyShoot(Settings.LED.MANUAL);
059            case IDLE -> leds.applyShoot(LEDPattern.kOff);
060        }
061        switch (feeder.getState()) {
062            case FORWARD -> leds.applyFeed(Settings.LED.FEEDER_FORWARD);
063            case REVERSE -> leds.applyFeed(Settings.LED.FEEDER_REVERSE);
064            case IDLE -> leds.applyFeed(LEDPattern.kOff);
065        }
066        switch (intake.getState()) {
067            case INTAKE -> leds.applyIntake(Settings.LED.INTAKING);
068            case OUTTAKE -> leds.applyIntake(Settings.LED.OUTTAKING);
069            case HOMING_DOWN -> leds.applyIntake(Settings.LED.HOMING_DOWN);
070            default -> leds.applyIntake(LEDPattern.kOff);
071        }
072        switch (handoff.getState()) {
073            case FORWARD -> leds.applyHandoff(Settings.LED.HANDOFF_FORWARD);
074            case REVERSE -> leds.applyHandoff(Settings.LED.HANDOFF_REVERSE);
075            case IDLE -> leds.applyHandoff(LEDPattern.kOff);
076        }
077    }
078}