using OperationControl.Helpers; using OperationControl.Models; using System.ComponentModel; using System.Windows; using System.Windows.Input; using static AgroBase.Models.Enums; using Brush = System.Windows.Media.Brush; using Brushes = System.Windows.Media.Brushes; using SolidColorBrush = System.Windows.Media.SolidColorBrush; using Color = System.Windows.Media.Color; namespace OperationControl.ViewModels.Views.Operacao { public class OperacaoLeftViewModel : INotifyPropertyChanged { public ICommand AlternarOperacaoCommand { get; } public ICommand ParadaEmergenciaCommand { get; } public ICommand CancelarOperacaoCommand { get; } private bool _operacaoPausada => (VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Operacao?.Pausa ?? false); private bool _operacaoEmExecucao; public bool OperacaoEmExecucao { get => _operacaoEmExecucao; set { if (_operacaoEmExecucao != value) { _operacaoEmExecucao = value; OnPropertyChanged(nameof(OperacaoEmExecucao)); OnPropertyChanged(nameof(TextoBotaoOperacao)); OnPropertyChanged(nameof(CorBotaoOperacao)); OnPropertyChanged(nameof(BordaBotaoOperacao)); } } } public string TextoBotaoOperacao => _operacaoPausada ? "▶ Retomar Operação" : OperacaoEmExecucao ? "⏸ Pausar Operação" : "▶ Iniciar Operação"; public Brush CorBotaoOperacao => OperacaoEmExecucao && !_operacaoPausada ? new SolidColorBrush(Color.FromRgb(120, 88, 20)) : new SolidColorBrush(Color.FromRgb(30, 90, 58)); public System.Windows.Media.Brush BordaBotaoOperacao => OperacaoEmExecucao && !_operacaoPausada ? new SolidColorBrush(System.Windows.Media.Color.FromRgb(170, 130, 40)) : new SolidColorBrush(System.Windows.Media.Color.FromRgb(74, 138, 91)); private bool _roverSelecionado; public bool RoverSelecionado { get => _roverSelecionado; set { if (_roverSelecionado != value) { _roverSelecionado = value; OnPropertyChanged(nameof(RoverSelecionado)); OnPropertyChanged(nameof(NomeRover)); OnPropertyChanged(nameof(OpacityPainel)); } } } private string _nomeRover = "Nenhum rover selecionado"; public string NomeRover { get => RoverSelecionado ? _nomeRover : "Nenhum rover selecionado"; set { if (_nomeRover != value) { _nomeRover = value; OnPropertyChanged(nameof(NomeRover)); } } } public double OpacityPainel => RoverSelecionado ? 1.0 : 0.45; private string _velocidade = "--"; public string Velocidade { get => VelocidadeValor(_velocidade); set { if (_velocidade != value) { _velocidade = value; OnPropertyChanged(nameof(Velocidade)); } } } private string _anguloDirecional = "--"; public string AnguloDirecional { get => RoverSelecionado ? $"{_anguloDirecional}°" : "--"; set { if (_anguloDirecional != value) { _anguloDirecional = value; OnPropertyChanged(nameof(AnguloDirecional)); } } } private TipoMovimentoDirecional _tipoMovimento = TipoMovimentoDirecional.Diagnostico; public TipoMovimentoDirecional TipoMovimento { get => _tipoMovimento; set { if (_tipoMovimento != value) { _tipoMovimento = value; OnPropertyChanged(nameof(TipoMovimento)); } } } private string _temperatura = "--"; public string Temperatura { get => TemperaturaValor(_temperatura); set { if (_temperatura != value) { _temperatura = value; OnPropertyChanged(nameof(Temperatura)); } } } private string _bateria = "--"; public string Bateria { get => PercentualOuTracos(_bateria); set { if (_bateria != value) { _bateria = value; OnPropertyChanged(nameof(Bateria)); } } } private string _reservatorio = "--"; public string Reservatorio { get => PercentualOuTracos(_reservatorio); set { if (_reservatorio != value) { _reservatorio = value; OnPropertyChanged(nameof(Reservatorio)); } } } private string _saudeRede = "--"; public string SaudeRede { get => ValorOuTracos(_saudeRede); set { if (_saudeRede != value) { _saudeRede = value; OnPropertyChanged(nameof(SaudeRede)); } } } private string _saudeGnss = "--"; public string SaudeGnss { get => ValorOuTracos(_saudeGnss); set { if (_saudeGnss != value) { _saudeGnss = value; OnPropertyChanged(nameof(SaudeGnss)); } } } public Brush CorTemperatura => !RoverSelecionado ? Brushes.Gray : _temperaturaNumerica >= 55 ? Brushes.OrangeRed : _temperaturaNumerica >= 45 ? Brushes.Gold : Brushes.LightGreen; public Brush CorBateria => !RoverSelecionado ? Brushes.Gray : _bateriaNumerica <= 20 ? Brushes.OrangeRed : _bateriaNumerica <= 40 ? Brushes.Gold : Brushes.LightGreen; public Brush CorReservatorio => !RoverSelecionado ? Brushes.Gray : _reservatorioNumerico <= 15 ? Brushes.OrangeRed : _reservatorioNumerico <= 35 ? Brushes.Gold : Brushes.LightGreen; public Brush CorRede => !RoverSelecionado ? Brushes.Gray : CorPorTexto(_saudeRede); public Brush CorGnss => !RoverSelecionado ? Brushes.Gray : CorPorTexto(_saudeGnss); private double _temperaturaNumerica; private double _bateriaNumerica; private double _reservatorioNumerico; public OperacaoLeftViewModel() { AlternarOperacaoCommand = new RelayCommand(_ => AlternarOperacao()); ParadaEmergenciaCommand = new RelayCommand(_ => ExecutarParadaEmergencia()); CancelarOperacaoCommand = new RelayCommand(_ => CancelarOperacao()); DefinirSemRover(); } public void DefinirSemRover() { RoverSelecionado = false; NomeRover = "Nenhum rover selecionado"; _temperaturaNumerica = 0; _bateriaNumerica = 0; _reservatorioNumerico = 0; Velocidade = "--"; AnguloDirecional = "--"; TipoMovimento = TipoMovimentoDirecional.Diagnostico; Temperatura = "--"; Bateria = "--"; Reservatorio = "--"; SaudeRede = "--"; SaudeGnss = "--"; OnPropertyChanged(nameof(CorTemperatura)); OnPropertyChanged(nameof(CorBateria)); OnPropertyChanged(nameof(CorReservatorio)); OnPropertyChanged(nameof(CorRede)); OnPropertyChanged(nameof(CorGnss)); } public void AtualizarRover(string nomeRover, double velocidadeKmh, double anguloDirecionalGraus, TipoMovimentoDirecional tipoMovimento, double temperaturaC, double bateriaPct, double reservatorioPct, string saudeRede, string saudeGnss, bool op_iniciada) { RoverSelecionado = true; NomeRover = nomeRover; _temperaturaNumerica = temperaturaC; _bateriaNumerica = bateriaPct; _reservatorioNumerico = reservatorioPct; Velocidade = velocidadeKmh.ToString("0.0"); AnguloDirecional = anguloDirecionalGraus.ToString("0.0"); TipoMovimento = tipoMovimento; Temperatura = temperaturaC.ToString("0.0"); Bateria = bateriaPct.ToString("0"); Reservatorio = reservatorioPct.ToString("0"); SaudeRede = saudeRede; SaudeGnss = saudeGnss; OperacaoEmExecucao = op_iniciada; OnPropertyChanged(nameof(CorTemperatura)); OnPropertyChanged(nameof(CorBateria)); OnPropertyChanged(nameof(CorReservatorio)); OnPropertyChanged(nameof(CorRede)); OnPropertyChanged(nameof(CorGnss)); OnPropertyChanged(nameof(OperacaoEmExecucao)); OnPropertyChanged(nameof(TextoBotaoOperacao)); OnPropertyChanged(nameof(CorBotaoOperacao)); OnPropertyChanged(nameof(BordaBotaoOperacao)); } private void AlternarOperacao() { if (VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Operacao?.Iniciada ?? false) { bool PauseActivated = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Operacao?.Pausa ?? false; PauseActivated = !PauseActivated; VariaveisControleOperacao.EnviarComandoParada(pausa: PauseActivated); } else { if (((VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Operacao?.Modo ?? AgroBase.Models.Enums.ModoOperacao.NaoDefinido) == AgroBase.Models.Enums.ModoOperacao.MapaGPS) && !(VariaveisControleOperacao.RoverEmFoco?.RuasPercorrer?.Any() ?? false)) { System.Windows.MessageBox.Show("Para iniciar a operação automática, é necessário carregar um mapa e selecionar as ruas onde o equipamento irá operar!", "Parametrização", MessageBoxButton.OK, MessageBoxImage.Warning); return; } if (System.Windows.MessageBox.Show("Deseja iniciar a operação com os parâmetros atuais?", "Iniciar Operação", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) { bool simulador = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Gnss?.Iniciado != true; VariaveisControleOperacao.EnviarComandoIniciarOperacao(true, simulador); } } } private void ExecutarParadaEmergencia() { bool EmergencyActivated = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Operacao?.Emergencia ?? false; EmergencyActivated = !EmergencyActivated; //VariaveisControleOperacao.EnviarComandoParada(emergencia: EmergencyActivated); _ = VariaveisControleOperacao.EnviarComandoParadaUDP(emergencia: EmergencyActivated); } private void CancelarOperacao() { if (System.Windows.MessageBox.Show("Deseja finalizar a operação em andamento?", "Finalizar Operação", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) { VariaveisControleOperacao.EnviarComandoIniciarOperacao(false); } } private string ValorOuTracos(string valor) => RoverSelecionado ? valor : "--"; private string VelocidadeValor(string valor) => RoverSelecionado ? $"{valor} km/h" : "--"; private string TemperaturaValor(string valor) => RoverSelecionado ? $"{valor} °C" : "--"; private string PercentualOuTracos(string valor) => RoverSelecionado ? $"{valor}%" : "--"; private Brush CorPorTexto(string valor) { var txt = (valor ?? "").Trim().ToLower(); if (txt.Contains("excelente") || txt.Contains("ótima") || txt.Contains("otima") || txt.Contains("boa") || txt.Contains("rtk fixed")) return Brushes.LightGreen; if (txt.Contains("média") || txt.Contains("media") || txt.Contains("regular") || txt.Contains("float") || txt.Contains("3d")) return Brushes.Gold; if (txt.Contains("ruim") || txt.Contains("sem") || txt.Contains("offline") || txt.Contains("falha")) return Brushes.OrangeRed; return Brushes.LightGray; } public event PropertyChangedEventHandler? PropertyChanged; private void OnPropertyChanged(string nome) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nome)); } } }