Imports System.Collections.ObjectModel
Imports System.IO
Imports EgtBEAMWALL.Core
Imports EgtUILib
Imports EgtWPFLib5

Public Class MachinePanelVM
   Inherits VMBase

#Region "FIELDS & PROPERTIES"

   ' Radice del direttorio delle macchine
   Private m_sMachinesRoot As String

   ' Lista delle macchine disponibili
   Private m_MachineList As New ObservableCollection(Of Machine)
   Public Property MachineList As ObservableCollection(Of Machine)
      Get
         Return m_MachineList
      End Get
      Set(value As ObservableCollection(Of Machine))
         m_MachineList = value
      End Set
   End Property
   ' Macchina correntemente selezionata e quindi attiva
   Private m_SelectedMachine As Machine = Nothing
   Public Property SelectedMachine As MyMachine
      Get
         Return m_SelectedMachine
      End Get
      Set(value As MyMachine)
         If value IsNot m_SelectedMachine Then
            'EgtSetCurrentContext(Map.refSceneHostVM.MainScene.GetCtx())
            'EgtResetCurrMachGroup()
            ' se sono in modalità disegno
            m_SelectedMachine = value
            ' inizializzo la macchina selezionata come macchina corrente
            Dim nMachType As MachineType = DirectCast(m_SelectedMachine, MyMachine).nType
            SectionXMaterial.SetType(nMachType)
            InitCurrentMachine(Map.refMainWindowVM.MainWindowM.sMachinesRoot, value.Name, nMachType)
         End If
      End Set
   End Property

   Private m_SetUp_Background As Brush = New BrushConverter().ConvertFrom("#FFDDDDDD")
   Public Property SetUp_Background As Brush
      Get
         Return m_SetUp_Background
      End Get
      Set(value As Brush)
         m_SetUp_Background = value
         NotifyPropertyChanged("SetUp_Background")
      End Set
   End Property

   Private m_MachPanel_IsEnabled As Boolean = True
   Public Property MachPanel_IsEnabled As Boolean
      Get
         Return m_MachPanel_IsEnabled
      End Get
      Set(value As Boolean)
         m_MachPanel_IsEnabled = value
         NotifyPropertyChanged("MachPanel_IsEnabled")
      End Set
   End Property

#Region "Messages"

   Public ReadOnly Property ToolDBMsg As String
      Get
         Return EgtMsg(MSG_MACHINEPAGEUC + 6)
      End Get
   End Property
   Public ReadOnly Property MachiningDbMsg As String
      Get
         Return EgtMsg(MSG_MACHINEPAGEUC + 7)
      End Get
   End Property
   Public ReadOnly Property SetUpMsg As String
      Get
         Return EgtMsg(MSG_ALARMSPAGEUC + 33)
      End Get
   End Property

#End Region    ' Messages

#Region "ToolTip"

   Public ReadOnly Property ToolDBToolTip As String
      Get
         Return "Tool DB"
      End Get
   End Property
   Public ReadOnly Property MachiningDbToolTip As String
      Get
         Return "Machining DB"
      End Get
   End Property
   Public ReadOnly Property SetUpToolTip As String
      Get
         Return "SetUp"
      End Get
   End Property

#End Region   ' ToolTip

   ' Definizione comandi
   Private m_cmdToolDb As ICommand
   Private m_cmdMachDb As ICommand
   Private m_cmdSetUp As ICommand
   Private m_cmdMachOptions As ICommand

#End Region    'FIELDS & PROPERTIES

#Region "CONSTRUCTOR"

   Sub New()
      ' Creo riferimento a questa classe in Map
      Map.SetRefMachinePanelVM(Me)
      ' recupero cartella radice delle macchine
      m_sMachinesRoot = Map.refMainWindowVM.MainWindowM.sMachinesRoot
      ' Carica macchine da cartella delle macchine
      MyMachine.MachineListInit(m_sMachinesRoot, MachineList)
   End Sub

#End Region    ' CONSTRUCTOR

#Region "METHODS"

   Friend Sub LoadCurrentMachine()
      If MachineList.Count = 0 Then Return
      Dim CurrMachine As Machine = Nothing
      Dim CurrMachineName As String = String.Empty
      GetMainPrivateProfileString(S_MACH, K_SUPERVISORMACH, String.Empty, CurrMachineName)
      Dim bFound As Boolean = False
      If Not String.IsNullOrEmpty(CurrMachineName) Then
         For Each Mach In MachineList
            If Mach.Name = CurrMachineName Then
               bFound = True
               CurrMachine = Mach
               Exit For
            End If
         Next
      End If
      If Not bFound And MachineList.Count > 0 Then
         CurrMachine = MachineList(0)
      End If
      If Not IsNothing(CurrMachine) Then
         If EgtSetCurrMachine(CurrMachine.Name) Then
            SelectedMachine = CurrMachine
         End If
      End If
   End Sub

   Friend Sub SaveCurrentMachine()
      If IsNothing(m_SelectedMachine) Then Return
      WriteMainPrivateProfileString(S_MACH, K_CURRMACH, SelectedMachine.Name)
   End Sub

   Friend Sub UpdateCurrentMachine()
      'EgtSetCurrentContext(IniFile.m_ProjectSceneContext)
      Dim sMachName As String = String.Empty
      If EgtGetCurrMachineName(sMachName) Then
         For Each Mach In MachineList
            If Mach.Name = sMachName Then
               SelectedMachine = Mach
               Exit For
            End If
         Next
      End If
   End Sub

#End Region

#Region "COMMANDS"

#Region "ToolDbCommand"

   ''' <summary>
   ''' Returns a command that do Exec.
   ''' </summary>
   Public ReadOnly Property ToolDbCommand As ICommand
      Get
         If m_cmdToolDb Is Nothing Then
            m_cmdToolDb = New Command(AddressOf ToolDb)
         End If
         Return m_cmdToolDb
      End Get
   End Property

   ''' <summary>
   ''' Execute the Exec.  This method is invoked by the ExecCommand.
   ''' </summary>
   Public Sub ToolDb(ByVal param As Object)
      If Not VerifyMachinesDir(m_sMachinesRoot) Then Return
      ' ricarico il database per intercettare eventuali aggiornamenti fatti da altre istanze del programma (se la cartella Machines è condivisa)
      If Not EgtTdbReload() Then
         EgtOutLog("Impossible reloading tool Db")
         MessageBox.Show(EgtMsg(MSG_TOOLDBERRORS + 30), EgtMsg(MSG_MESSAGEBOX + 1), MessageBoxButton.OK, MessageBoxImage.Error)
         Return
      End If

      Dim ToolDbWindowVM As New ToolDbWindowVM(CurrentMachine.sMachDir, CurrentMachine.sMachIniFile, Map.refSceneHostVM.MainScene.GetCtx(), "Beam")
      Dim ToolDbWindowV As New ToolDbWindowV(Application.Current.MainWindow, ToolDbWindowVM)
      If ToolDbWindowVM.MatType <> 0 Then
         ToolDbWindowV.Height = 640
         ToolDbWindowV.Width = 1024
         ToolDbWindowV.ShowDialog()
      Else
         Exit Sub
      End If

      If Not SetUpUtility.IsValidToolHeadExitInSetUp() Then
         SetUp_Background = Brushes.Red
      Else
         SetUp_Background = OmagOFFICEDictionary.Button_Static_Background
      End If
   End Sub

#End Region    ' ToolDbCommand

#Region "MachDbCommand"

   ''' <summary>
   ''' Returns a command that do Exec.
   ''' </summary>
   Public ReadOnly Property MachDbCommand As ICommand
      Get
         If m_cmdMachDb Is Nothing Then
            m_cmdMachDb = New Command(AddressOf MachDb)
         End If
         Return m_cmdMachDb
      End Get
   End Property

   ''' <summary>
   ''' Execute the Exec.  This method is invoked by the ExecCommand.
   ''' </summary>
   Public Sub MachDb(ByVal param As Object)
      If Not VerifyMachinesDir(m_sMachinesRoot) Then Return
      ' ricarico il database per intercettare eventuali aggiornamenti fatti da altre istanze del programma (se la cartella Machines è condivisa)
      If Not EgtMdbReload() Then
         EgtOutLog("Impossible reloading machining Db")
         MessageBox.Show(EgtMsg(MSG_MACHININGDBERRORS + 8), EgtMsg(MSG_MESSAGEBOX + 1), MessageBoxButton.OK, MessageBoxImage.Error)
         Return
      End If
      Dim MachDbWindowVM As New EgtWPFLib5.MachiningDbWindowVM(CurrentMachine.sMachIniFile, Map.refSceneHostVM.MainScene.GetCtx(), "Stone")
      Dim MachDbWindowV As New EgtWPFLib5.MachiningDbWindowV(Application.Current.MainWindow, MachDbWindowVM)

      If EgtWPFLib5.MachiningTreeViewItem.m_MatType <> 0 Then
         MachDbWindowV.Height = 768
         MachDbWindowV.Width = 1024
         MachDbWindowV.ShowDialog()
      Else
         Exit Sub
      End If

   End Sub

#End Region    ' MachDbCommand

#Region "SetUpCommand"

   ''' <summary>
   ''' Returns a command that do Exec.
   ''' </summary>
   Public ReadOnly Property SetUpCommand As ICommand
      Get
         If m_cmdSetUp Is Nothing Then
            m_cmdSetUp = New Command(AddressOf SetUp)
         End If
         Return m_cmdSetUp
      End Get
   End Property

   ''' <summary>
   ''' Execute the Exec.  This method is invoked by the ExecCommand.
   ''' </summary>
   Public Sub SetUp(ByVal param As Object)
      ' verifico che il file di configurazione attrezzaggio (lua) della macchina esista
      If Not File.Exists(CurrentMachine.sMachDir & "\Scripts\" & SETUP_LUA) Then
         EgtOutLog("SetUp error: SetUp configuration file doesn't exist ")
         MessageBox.Show(EgtMsg(MSG_SETUPERRORS + 7), EgtMsg(MSG_SETUPERRORS + 1), MessageBoxButton.OK, MessageBoxImage.Error)
         Return
      End If
      ' carico Lua che contiene le funzioni per ottenere le posizioni valide dell'utensile selezionato,
      ' e testa e uscita dell'utensile attrezzato
      EgtLuaExecFile(CurrentMachine.sMachDir & "\Scripts\" & SETUP_LUA)
      ' verifico che le teste riportate in configurazione esistano
      Dim Index As Integer = 1
      Dim nErr As Integer = 0
      While nErr = 0
         Dim sHead As String = String.Empty
         nErr = 999
         EgtLuaSetGlobIntVar("STU.INDEX", Index)
         EgtLuaCallFunction("STU.GetTcPosHeadGroupFromPos")
         ' Leggo variabili
         EgtLuaGetGlobStringVar("STU.HEAD", sHead)
         EgtLuaGetGlobIntVar("STU.ERR", nErr)
         If nErr = 0 Then
            If EgtGetHeadExitCount(sHead) = 0 Then
               MessageBox.Show(EgtMsg(MSG_SETUPERRORS + 8), EgtMsg(MSG_SETUPERRORS + 1), MessageBoxButton.OK, MessageBoxImage.Error)
               Return
            End If
         End If
         Index += 1
      End While
      ' Reset lua
      EgtLuaResetGlobVar("STU")

      Dim SetUpWindow As New SetUpWindowV(Application.Current.MainWindow, New SetUpWindowVM(CurrentMachine.sMachDir, CurrentMachine.sMachineName))
      SetUpWindow.Height = 614
      SetUpWindow.Width = 1024
      SetUpWindow.ShowDialog()

   End Sub

#End Region    ' SetUpCommand

#Region "MachOptionsCommand"

   ''' <summary>
   ''' Returns a command that do Exec.
   ''' </summary>
   Public ReadOnly Property MachOptionsCommand As ICommand
      Get
         If m_cmdMachOptions Is Nothing Then
            m_cmdMachOptions = New Command(AddressOf MachOptions)
         End If
         Return m_cmdMachOptions
      End Get
   End Property

   ''' <summary>
   ''' Execute the Exec.  This method is invoked by the ExecCommand.
   ''' </summary>
   Public Sub MachOptions(ByVal param As Object)

   End Sub

#End Region    ' MachOptionsCommand

#End Region    ' COMMANDS

End Class
