using AgroBase.Models.Operacoes; using OperationControl.Helpers; using OperationControl.Models; using OperationControl.Models.Operacao; using System.Collections.ObjectModel; 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; namespace OperationControl.ViewModels.Views.Operacao { public class OperacaoRightViewModel : INotifyPropertyChanged { private bool _isCollapsed; private RoverCardModel _roverSelecionado; public ResumoOperacionalModel Resumo { get; } = new ResumoOperacionalModel(); public OperacaoParametrosModel Parametros { get; } = new OperacaoParametrosModel(); public OperacaoRightViewModel() { Rovers = new ObservableCollection(); ToggleCollapseCommand = new RelayCommand(_ => ToggleCollapse()); SelecionarRoverCommand = new RelayCommand(p => SelecionarRover((p as RoverCardModel).NumeroSerie)); SelecionarSecaoCommand = new RelayCommand(p => { if (p is SecaoRightBar secao) SelecionarSecao(secao); else if (p != null && Enum.TryParse(p.ToString(), out var secaoParseada)) SelecionarSecao(secaoParseada); }); AcaoBotaoTopoCommand = new RelayCommand(_ => ExecutarAcaoBotaoTopo()); LerParametrosCommand = new RelayCommand(_ => LerParametrosSolicitado?.Invoke()); SalvarParametrosCommand = new RelayCommand(_ => SalvarParametrosSolicitado?.Invoke(Parametros)); } public event PropertyChangedEventHandler PropertyChanged; public event Action SecaoSelecionadaChanged; public event Action RoverSelecionadoChanged; public event Action? LerParametrosSolicitado; public event Action? SalvarParametrosSolicitado; public ObservableCollection Rovers { get; } public ICommand ToggleCollapseCommand { get; } public ICommand SelecionarRoverCommand { get; } public ICommand SelecionarSecaoCommand { get; } public ICommand AcaoBotaoTopoCommand { get; } public ICommand LerParametrosCommand { get; } public ICommand SalvarParametrosCommand { get; } public bool IsCollapsed { get => _isCollapsed; set { if (_isCollapsed != value) { _isCollapsed = value; OnPropertyChanged(nameof(IsCollapsed)); } } } public RoverCardModel RoverSelecionado { get => _roverSelecionado; set { if (_roverSelecionado != value) { _roverSelecionado = value; OnPropertyChanged(nameof(RoverSelecionado)); OnPropertyChanged(nameof(SemRoverSelecionado)); OnPropertyChanged(nameof(ComRoverSelecionado)); CommandManager.InvalidateRequerySuggested(); } } } public bool SemRoverSelecionado => RoverSelecionado == null; public bool ComRoverSelecionado => RoverSelecionado != null; public string QuantidadeRoversTexto => $"{Rovers.Count} rover(s) encontrado(s)"; private SecaoRightBar _secaoAtual = SecaoRightBar.Menu; public SecaoRightBar SecaoAtual { get => _secaoAtual; set { if (_secaoAtual != value) { _secaoAtual = value; OnPropertyChanged(nameof(SecaoAtual)); OnPropertyChanged(nameof(EmMenu)); OnPropertyChanged(nameof(EmResumo)); OnPropertyChanged(nameof(EmParametrizacao)); OnPropertyChanged(nameof(EmControle)); OnPropertyChanged(nameof(BotaoTopoEhVoltar)); OnPropertyChanged(nameof(TextoBotaoTopo)); } } } public bool EmMenu => SecaoAtual == SecaoRightBar.Menu || SecaoAtual == SecaoRightBar.Diagnostico; public bool EmResumo => SecaoAtual == SecaoRightBar.Resumo; public bool EmParametrizacao => SecaoAtual == SecaoRightBar.Parametrizacao; public bool EmControle => SecaoAtual == SecaoRightBar.Controle; public bool BotaoTopoEhVoltar => EmResumo || EmControle || EmParametrizacao; public string TextoBotaoTopo => BotaoTopoEhVoltar ? "◀ Voltar" : "Trocar Rover"; private void ExecutarAcaoBotaoTopo() { if (BotaoTopoEhVoltar) { SelecionarSecao(SecaoRightBar.Menu); } else { SelecionarRover(null); } } public void ToggleCollapse() { IsCollapsed = !IsCollapsed; } public void SelecionarRover(string roverId) { var rover = Rovers.FirstOrDefault(x => x.NumeroSerie == roverId); RoverSelecionado = rover; if (RoverSelecionado != null) { VariaveisControleOperacao.RequisitarParametrosOperacao(); SelecionarSecao(SecaoRightBar.Menu); } else { SelecionarSecao(SecaoRightBar.SemRoverSelecionado); } RoverSelecionadoChanged?.Invoke(rover); } public void SelecionarSecao(SecaoRightBar secao) { switch (secao) { case SecaoRightBar.Parametrizacao: AtualizarParametros(VariaveisControleOperacao.RoverEmFoco); break; } SecaoAtual = secao; SecaoSelecionadaChanged?.Invoke(secao); } public void DestacarRoverNoMapa(string? roverId) { foreach (var rover in Rovers) rover.IsDestacadoNoMapa = !string.IsNullOrEmpty(roverId) && rover.NumeroSerie == roverId; } public void AtualizarListaRovers(params RoverCardModel[] rovers) { var origem = (rovers ?? Array.Empty()).ToList(); // Remove os que não existem mais for (int i = Rovers.Count - 1; i >= 0; i--) { var atual = Rovers[i]; bool aindaExiste = origem.Any(x => x.NumeroSerie == atual.NumeroSerie); if (!aindaExiste) Rovers.RemoveAt(i); } // Adiciona ou atualiza os existentes foreach (var roverNovo in origem) { var roverExistente = Rovers.FirstOrDefault(x => x.NumeroSerie == roverNovo.NumeroSerie); if (roverExistente == null) { Rovers.Add(roverNovo); } else { roverExistente.EquipamentoId = roverNovo.EquipamentoId; roverExistente.Status = roverNovo.Status; // se quiser refletir mudança de texto também: // roverExistente.NumeroSerie = roverNovo.NumeroSerie; // normalmente não precisa se NS é a chave // dispara props derivadas se necessário // no caso de EquipamentoId, como é auto-property hoje, melhor virar property notificável se isso puder mudar } } OnPropertyChanged(nameof(QuantidadeRoversTexto)); OnPropertyChanged(nameof(SemRoverSelecionado)); OnPropertyChanged(nameof(ComRoverSelecionado)); } public void AtualizarResumo(Action updateAction) { if (!System.Windows.Application.Current.Dispatcher.CheckAccess()) { System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => updateAction?.Invoke(Resumo))); return; } updateAction?.Invoke(Resumo); } public void AtualizarParametros(OperacaoParametrosModel origem) { if (origem == null) return; Parametros.Modo = origem.Modo; Parametros.Descricao = origem.Descricao; Parametros.QtdBicos = origem.QtdBicos; Parametros.QtdCamerasSolo = origem.QtdCamerasSolo; Parametros.CapacidadeReservatorio = origem.CapacidadeReservatorio; var controle_o = origem.Controle; if (controle_o == null) return; if (Parametros.Controle == null) Parametros.Controle = new OperacaoParametrosControleModel(); var controle_p = Parametros.Controle; controle_p.MovimentoAutomatico = controle_o.MovimentoAutomatico; controle_p.DirecionalAutomatico = controle_o.DirecionalAutomatico; controle_p.PulverizadorAutomatico = controle_o.PulverizadorAutomatico; controle_p.SonarAtivado = controle_o.SonarAtivado; controle_p.OakParadaPorObstaculo = controle_o.OakParadaPorObstaculo; controle_p.ImuParadaPorInclinacao = controle_o.ImuParadaPorInclinacao; controle_p.FrenagemAutomaticaAoParar = controle_o.FrenagemAutomaticaAoParar; controle_p.RegistrarDadosPosProcessamento = controle_o.RegistrarDadosPosProcessamento; controle_p.MovVelocidadeSErvasPercent = controle_o.MovVelocidadeSErvasPercent; controle_p.MovVelocidadeCErvasPercent = controle_o.MovVelocidadeCErvasPercent; controle_p.DirAnguloMaximo = controle_o.DirAnguloMaximo; controle_p.DirVelocidadeMovimento = controle_o.DirVelocidadeMovimento; controle_p.DirTipoMovimento = controle_o.DirTipoMovimento; controle_p.AtuPressaoLinha = controle_o.AtuPressaoLinha; controle_p.AtuDuracaoAtuacao = controle_o.AtuDuracaoAtuacao; controle_p.AtuPercentualInicioPulverizacao = controle_o.AtuPercentualInicioPulverizacao; controle_p.AtuAlturaAreaPulverizacao = controle_o.AtuAlturaAreaPulverizacao; controle_p.AtuPercentualErvasBicoOn = controle_o.AtuPercentualErvasBicoOn; controle_p.AtuPercentualErvasBicoOff = controle_o.AtuPercentualErvasBicoOff; controle_p.MpcMatrizCusto = controle_o.MpcMatrizCusto; controle_p.MpcHorizonte = controle_o.MpcHorizonte; OnPropertyChanged(nameof(Parametros)); } private void OnPropertyChanged(string nome) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nome)); } } public class RoverCardModel : INotifyPropertyChanged { public event PropertyChangedEventHandler? PropertyChanged; public string EquipamentoId { get; set; } public string NumeroSerie { get; set; } private StatusModulo _status; public StatusModulo Status { get => _status; set { if (_status != value) { _status = value; OnPropertyChanged(nameof(Status)); OnPropertyChanged(nameof(StatusBrush)); OnPropertyChanged(nameof(StatusTexto)); } } } private bool _isDestacadoNoMapa; public bool IsDestacadoNoMapa { get => _isDestacadoNoMapa; set { if (_isDestacadoNoMapa != value) { _isDestacadoNoMapa = value; OnPropertyChanged(nameof(IsDestacadoNoMapa)); OnPropertyChanged(nameof(BordaCardBrush)); OnPropertyChanged(nameof(BordaCardThickness)); OnPropertyChanged(nameof(CardBackground)); } } } public Brush StatusBrush => Status == StatusModulo.Operante ? Brushes.Green : Status == StatusModulo.Desconectado ? Brushes.Gray : Status == StatusModulo.Falha ? Brushes.Red : Status == StatusModulo.Alerta ? Brushes.Yellow : Status == StatusModulo.Conectado ? Brushes.Blue : Brushes.Black; public System.Windows.Media.Brush CardBackground => IsDestacadoNoMapa ? new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(58, 42, 18)) : new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(38, 38, 38)); public Brush BordaCardBrush => IsDestacadoNoMapa ? Brushes.Orange : StatusBrush; public Thickness BordaCardThickness => IsDestacadoNoMapa ? new Thickness(3) : new Thickness(2); public string EquipamentoTexto => $"Equipamento: {EquipamentoId}"; public string NumeroSerieTexto => $"NS: {NumeroSerie}"; public string StatusTexto => $"Status: {Status}"; private void OnPropertyChanged(string nome) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nome)); } } public enum SecaoRightBar { SemRoverSelecionado = 0, Menu = 1, Resumo = 2, Diagnostico = 3, Parametrizacao = 4, Controle = 5 } }