Attribute VB_Name = "z_UIMessages"
' Модуль вывода сообщений и взаимодействия с пользователем
Option Explicit

Public Enum MsgCode
  MSG_OK = 0
  
  EM_XLOUT_CREATE_FAIL
  EM_NAME_TAKEN
  EM_RENAME_UNLOADED
  EM_LINKBASE_FAILED
  EM_MISSING_ID
  EM_DUMMY_HAS_FILE
  EM_RENAME_FAILED
  EM_ID_INVALID_FORMAT
  EM_MERGE_VALIDATION_FAILED
  
  IM_XLOUT_OK
  IM_STATS_OK
  IM_NEXTDOC_OK
  IM_UNSTUCK_OK
  IM_RECREATE_OK
  IM_DELETE_LAW_OK
  IM_DELETE_LINKS_OK
  IM_HYPERLINKS_OK
  IM_RENAME_COMPLETE
  IM_DUMMY_OK
  IM_MERGE_OK
  
  QM_DELETE_LAW
  QM_DELETE_SELF_CONFIRM
  QM_DELETE_LINKS
  QM_MERGE_WARNING
End Enum

Private g_UI As API_UserInteraction

Public Function UserInteraction() As API_UserInteraction
  If g_UI Is Nothing Then _
    Set g_UI = New API_UserInteraction
  Set UserInteraction = g_UI
End Function

Public Function SetUserInteraction(newUI As API_UserInteraction)
  Set g_UI = newUI
End Function

Public Function UIShowMessage(theCode As MsgCode, ParamArray params() As Variant)
  Dim unwrapped As Variant: unwrapped = params
  unwrapped = FixForwardedParams(unwrapped)
  
  Select Case theCode
  Case EM_XLOUT_CREATE_FAIL:    Call MsgBox("Не удалось создать документ для выгрузки", vbExclamation)
  Case EM_NAME_TAKEN:           Call MsgBox(Fmt("Данное имя файла уже занято документом {1}", unwrapped), vbExclamation)
  Case EM_RENAME_UNLOADED:      Call MsgBox("Данный документ не имеет файла в Реестре", vbExclamation)
  Case EM_LINKBASE_FAILED:      Call MsgBox(Fmt("Найдены ошибки в Реестре:{1}", params), vbExclamation)
  Case EM_MISSING_ID:           Call MsgBox("Некорректный идентификатор документа", vbExclamation)
  Case EM_DUMMY_HAS_FILE:       Call MsgBox("Выбранный документ имеет прикрепленный файл. Данная операция применима только к документам без прикрепленных файлов", vbExclamation)
  Case EM_RENAME_FAILED:        Call MsgBox(Fmt("Не удалось переименовать документ {1} в {2}", unwrapped), vbExclamation)
  Case EM_ID_INVALID_FORMAT:    Call MsgBox("Некорректный идентификатор документа", vbExclamation)
  Case EM_MERGE_VALIDATION_FAILED: Call MsgBox("Введите различные корректные ID документов для отождествления", vbExclamation)
  
  Case IM_XLOUT_OK:             Call MsgBox("Экспорт завершен", vbInformation)
  Case IM_STATS_OK:             Call MsgBox("Статистика обновлена", vbInformation)
  Case IM_NEXTDOC_OK:           Call MsgBox("Необработанных документов не обнаружено", vbInformation)
  Case IM_UNSTUCK_OK:           Call MsgBox("Работа интерфейса восстановлена", vbInformation)
  Case IM_RECREATE_OK:          Call MsgBox("Индексы блоков связей обновлены", vbInformation)
  Case IM_DELETE_LAW_OK:        Call MsgBox(Fmt("Данные, связи и файл документа {1} удалены из Реестра", unwrapped), vbInformation)
  Case IM_DELETE_LINKS_OK:      Call MsgBox(Fmt("Исходящие связи документа {1} удалены из Реестра. Всего связей удалено: {2}", unwrapped), vbInformation)
  Case IM_HYPERLINKS_OK:        Call MsgBox("Все гиперссылки обновлены", vbInformation)
  Case IM_RENAME_COMPLETE:      Call MsgBox(Fmt("Документ {1} переименован: {2}", unwrapped), vbInformation)
  Case IM_DELETE_LINKS_OK:      Call MsgBox(Fmt("Удалены {1} связей", unwrapped), vbInformation)
  Case IM_MERGE_OK:             Call MsgBox(Fmt("Отождествлены документы {1} -> {2}", unwrapped), vbInformation)
  Case IM_DUMMY_OK:             Call MsgBox("Документ-болванка создан успешно" & vbNewLine & _
                                            "Внимание! В созданный документ можно добавлять только текст, не содержащий ссылки на ГАРАНТ", vbInformation)

  Case Else:                    Call MsgBox("Неверный код сообщения", vbCritical)
  End Select
End Function

Public Function UIAskQuestion(theCode As MsgCode, ParamArray params() As Variant) As Boolean
  Dim unwrapped As Variant: unwrapped = params
  unwrapped = FixForwardedParams(unwrapped)
  
  Dim answer&: answer = vbNo
  Select Case theCode
  Case QM_DELETE_LAW:           answer = MsgBox(Fmt("Внимание! Все данные документа {1} будут удалены!" & vbNewLine & "Продолжить?", unwrapped), vbYesNo + vbQuestion)
  Case QM_DELETE_SELF_CONFIRM:  answer = MsgBox("Удалить информацию из всех таблиц?", vbYesNo + vbQuestion)
  Case QM_DELETE_LINKS:         answer = MsgBox(Fmt("Внимание! Обработанные ссылки документа {1} будут удалены из Реестра!" & vbNewLine & "Продолжить?", unwrapped), vbYesNo + vbQuestion)
  Case QM_MERGE_WARNING:        answer = MsgBox("Внимание!! Удаляемый документ будет полностью исключен из Реестра и все ссылки на него будут заменены на другой документ. " & _
                                                "Эта операция может занять продолжительное время и требует доступа ко всем документам Реестра. " & _
                                                "Пожалуйста закройте все Word документы перед продолжением" & vbNewLine & _
                                                "Продолжить?", vbYesNo + vbExclamation)
  
  Case Else:                    Call MsgBox("Неверный код сообщения", vbCritical)
  End Select
  UIAskQuestion = answer = vbYes
End Function
