using Aitex.Core.UI.MVVM;
using Aitex.Core.Utilities;
using CyberX8_Simulator.Devices;
using MECF.Framework.Simulator.Core.Commons;
using MECF.Framework.Simulator.Core.Driver;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace CyberX8_Simulator.Views
{
    /// <summary>
    /// WagoView.xaml 的交互逻辑
    /// </summary>
    public partial class WagoView : UserControl
    {
        public WagoView()
        {
            InitializeComponent();
            this.Loaded += OnViewLoaded;
        }

        private void OnViewLoaded(object sender, RoutedEventArgs e)
        {
            (DataContext as TimerViewModelBase)?.Start();
        }
    }

    class WagoViewModel : SocketDeviceViewModel
    {

        #region 属性
        public string Title
        {
            get { return "Wago Simulator"; }
        }

        private string _DOSelectedItem;
        [IgnorePropertyChange]
        public string DOSelectedItem
        {
            get
            {
                return _DOSelectedItem;
            }
            set
            {
                _DOSelectedItem = value;
            }
        }
        private int _DOInputValue;
        [IgnorePropertyChange]
        public int DOInputValue
        {
            get
            {
                return _DOInputValue;
            }
            set
            {
                _DOInputValue = value;
            }
        }

        private string _DISelectedItem;
        [IgnorePropertyChange]
        public string DISelectedItem
        {
            get
            {
                return _DISelectedItem;
            }
            set
            {
                _DISelectedItem = value;
            }
        }
        private int _DIInputValue;
        [IgnorePropertyChange]
        public int DIInputValue
        {
            get
            {
                return _DIInputValue;
            }
            set
            {
                _DIInputValue = value;
            }
        }

        private string _AOSelectedItem;
        [IgnorePropertyChange]
        public string AOSelectedItem
        {
            get
            {
                return _AOSelectedItem;
            }
            set
            {
                _AOSelectedItem = value;
            }
        }
        private short _AOInputValue;
        [IgnorePropertyChange]
        public short AOInputValue
        {
            get
            {
                return _AOInputValue;
            }
            set
            {
                _AOInputValue = value;
            }
        }

        private string _AISelectedItem;
        [IgnorePropertyChange]
        public string AISelectedItem
        {
            get
            {
                return _AISelectedItem;
            }
            set
            {
                _AISelectedItem = value;
            }
        }
        private short _AIInputValue;
        [IgnorePropertyChange]
        public short AIInputValue
        {
            get
            {
                return _AIInputValue;
            }
            set
            {
                _AIInputValue = value;
            }
        }
        #endregion

        public ObservableCollection<string> DONameItems { get; set; }
        public ObservableCollection<string> DINameItems { get; set; }
        public ObservableCollection<string> AONameItems { get; set; }
        public ObservableCollection<string> AINameItems { get; set; }
        public ObservableCollection<int> DigitalInputSelected { get; set; }

        
        
        private WagoSocketSimulator _sim;

        public ICommand SetDICommand { get; set; }
        public ICommand SetDOCommand { get; set; }
        public ICommand SetAICommand { get; set; }
        public ICommand SetAOCommand { get; set; }

        public WagoViewModel(string str) : base("WagoViewModel")
        {
            InitData();
            
            SetDICommand = new DelegateCommand<object>(SetDIAction);
            SetDOCommand = new DelegateCommand<object>(SetDOAction);
            SetAICommand = new DelegateCommand<object>(SetAIAction);
            SetAOCommand = new DelegateCommand<object>(SetAOAction);
            
            int.TryParse(str, out int port);
            _sim = new WagoSocketSimulator(port);
            Init(_sim);
        }

        private void SetDIAction(object obj)
        {
            _sim.UpdataDIBytes(DISelectedItem, DIInputValue);
        }
        private void SetDOAction(object obj)
        {
            _sim.UpdataDOBytes(DOSelectedItem, DOInputValue);
        }
        private void SetAIAction(object obj)
        {
            _sim.UpdataAIShorts(AISelectedItem, AIInputValue);
        }
        private void SetAOAction(object obj)
        {
            _sim.UpdataAOShorts(AOSelectedItem, AOInputValue);
        }

        private void InitData()
        {
            DigitalInputSelected = new ObservableCollection<int> { 0, 1 };

            DONameItems = new ObservableCollection<string>
            { "DO1","DO2","DO3","c_LoaderA_LS_Vacuum","DO4","DO5","DO6","DO7","DO8"
            ,"DO9","DO10","DO11","DO12","DO12","DO13","DO14","DO15","DO16","DO17","DO18",
                "c_LOADERA_DOOR_UNLOCK","DO20","DO21"};
            
            DINameItems = new ObservableCollection<string>
            { "r_Cassette_1_150","r_Cassette_1_100","r_DRIP_TRAY_FLUID_DETECTION"};

            AONameItems = new ObservableCollection<string> { "AO0", "AO1" };

            AINameItems = new ObservableCollection<string> { "r_LoaderA_LS_Vacuum_anlg", "AI1" };
        }
    }

}