using AgroBase.Models; 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 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()); } public event PropertyChangedEventHandler PropertyChanged; public event Action SecaoSelecionadaChanged; public event Action RoverSelecionadoChanged; public ObservableCollection Rovers { get; } public ICommand ToggleCollapseCommand { get; } public ICommand SelecionarRoverCommand { get; } public ICommand SelecionarSecaoCommand { get; } public ICommand AcaoBotaoTopoCommand { 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; SelecionarSecao(RoverSelecionado != null ? SecaoRightBar.Menu : SecaoRightBar.SemRoverSelecionado); RoverSelecionadoChanged?.Invoke(rover); } public void SelecionarSecao(SecaoRightBar secao) { 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)); } 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 } }