Attribute VB_Name = "z_UIMessages"
Option Private Module
Option Explicit

Public Enum MsgCode
  MSG_OK = 0
  
  EM_SYNC_DOC = ERR_SYNC_DOC
  EM_SYNC_DB = ERR_SYNC_DB
  EM_SYNC_LINK_ID = ERR_SYNC_LINK_ID
  EM_LINKS_MISSING = ERR_LINKS_MISSING
  EM_INVALID_LINK_NUMBER = ERR_INVALID_LINK_NUMBER
  EM_LINK_NO_FILE = ERR_LINK_NO_FILE
  EM_BOOKMARK_INVALID = ERR_BOOKMARK_INVALID
  EM_LINK_SELF = ERR_LINK_SELF
  EM_ADD_LINK_DB_FAILED = ERR_ADD_LINK_DB_FAILED
  EM_ADD_LINK_DOC_FAILED = ERR_ADD_LINK_DOC_FAILED
  
  EM_DOC_NOT_ADDED = vbObjectError + 1
  EM_DOC_FILE_EXISTS
  EM_TITLELINK_INVALID
  EM_SELECTION_INVALID
  EM_FILENAME_TAKEN
  EM_LINKS_NOT_ZERO
  EM_PARAGRAPH_MULTIPLE
  EM_LINK_COUNT
  EM_LINK_SINGLE
  EM_LINK_INVALID
  EM_DOC_NO_LINKS
  EM_HELP_FILE_INVALID
  EM_REMOVE_FIRST_LINK
  EM_NO_BOOKMARKS
  EM_FILE_ALREADY_ADDED
  EM_BOOKMARK_NOT_AVAILABLE
  EM_NO_VALID_LINKS
  EM_FILENAME_EMPTY
  EM_FILENAME_TOO_LONG
  EM_HAS_NO_LINKS
  EM_ID_INVALID_FORMAT
  EM_SELECTION_NOT_IN_MAIN
  
  IM_SCAN_MODE
  IM_IGNORE_MODE
  IM_LINKS_TODO
  IM_LINKS_DONE
  IM_DOC_OUTER
  IM_LINKS_ADDED
  IM_DOC_IGNORED
  IM_DOC_LINKS_DONE
  IM_HYPERLINKS_DONE
  IM_QUERY_LINK
  IM_DOC_EXPRESS_ADD
  IM_REMOVE_LINK_OK
  
  QM_ADD_TITLELINK
  QM_OPEN_GARANT
  QM_DELETE_BEFORE_ADD
  QM_DELETE_BEFORE_ADD_DUMMY
  QM_RELOAD_ON_UPDATE
  QM_RELOAD_CONFIRM
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 ProcessErrorMessages(expectedErrors As Scripting.Dictionary)
  If Err.Number = 0 Then _
    Exit Function
    
  Call Unload(CSE_ProgressBar)
  If Not expectedErrors.Exists(Err.Number) Then _
    Call Err.Raise(Err.Number)
  
  Select Case Err.Number
    Case ERR_LINK_NO_FILE: Call UserInteraction.ShowMessage(Err.Number, Err.Source)
    Case ERR_BOOKMARK_INVALID: Call UserInteraction.ShowMessage(Err.Number, Err.Source)
    Case ERR_INVALID_LINK_NUMBER: Call UserInteraction.ShowMessage(Err.Number)
    Case ERR_SYNC_DB: Call UserInteraction.ShowMessage(Err.Number)
    Case ERR_SYNC_DOC: Call UserInteraction.ShowMessage(Err.Number)
    Case ERR_LINK_SELF: Call UserInteraction.ShowMessage(Err.Number)
    Case ERR_LINKS_MISSING: Call UserInteraction.ShowMessage(Err.Number)
    Case ERR_ADD_LINK_DB_FAILED: Call UserInteraction.ShowMessage(Err.Number)
    Case ERR_ADD_LINK_DOC_FAILED: Call UserInteraction.ShowMessage(Err.Number)
    Case ERR_SYNC_LINK_ID: Call UserInteraction.ShowMessage(Err.Number, Err.Description)
    
    Case Else: Call UserInteraction.ShowMessage(Err.Number)
  End Select
  
  Call Err.Clear
  On Error GoTo 0
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_DOC_NOT_ADDED:        Call MsgBox("Документ не добавлен в Реестр", vbExclamation)
  Case EM_DOC_FILE_EXISTS:      Call MsgBox(Fmt("Внимание! Для ID {1} используется другой файл: {2}", unwrapped), vbExclamation, "Совпадение имен")
  Case EM_SYNC_DOC:             Call MsgBox("Внимание! Количество ссылок в базе превышает количество ссылок в документе!" & vbNewLine & "Обратитесь к разработчику", vbCritical)
  Case EM_SYNC_DB:              Call MsgBox("Внимание! Попытка выхода за пределы ссылок документа в базе!" & vbNewLine & "Обратитесь к разработчику", vbCritical)
  Case EM_TITLELINK_INVALID:    Call MsgBox("Титульная ссылка на ГАРАНТ не определена или не корректна!", vbExclamation, "Отсутствует титульная ссылка")
  Case EM_LINK_SELF:            Call MsgBox("Нельзя добавлять ссылку на текущий документ", vbExclamation)
  Case EM_LINKS_MISSING:        Call MsgBox("Внимание! Блок ссылок документа не зарегистрирован в базе Реестра. Устраните ошибки в базе или обратитесь к разработчику", vbExclamation)
  Case EM_SYNC_LINK_ID:         Call MsgBox(Fmt("Внимание! Нарушена синхронизация ссылок документа! {1}" & vbNewLine & "Обратитесь к разработчику", unwrapped), vbCritical)
  
  Case EM_SELECTION_INVALID:    Call MsgBox("Выделение не корректно. Выделите несколько слов", vbExclamation)
  Case EM_SELECTION_NOT_IN_MAIN: Call MsgBox("Выделите текст в основном документе. Примечания, колонтитулы и текстовые поля не поддерживаются", vbExclamation)
  Case EM_LINK_NO_FILE:         Call MsgBox(Fmt("Файл, на который дается ссылка не добавлен в Реестр" & vbNewLine & "ID: {1}", unwrapped), vbExclamation)
  Case EM_BOOKMARK_INVALID:     Call MsgBox(Fmt("Не удается найти закладку: {1}", unwrapped), vbExclamation)
  Case EM_FILENAME_TAKEN:       Call MsgBox("Документ с таким именем файла уже есть в базе!", vbExclamation)
  Case EM_LINKS_NOT_ZERO:       Call MsgBox("В выделенном диапазоне не должно быть ссылок", vbExclamation)
  Case EM_PARAGRAPH_MULTIPLE:   Call MsgBox("Выделите фрагмент текста не более одного абзаца", vbExclamation)
  Case EM_LINK_COUNT:           Call MsgBox("Выделите одну или несколько ссылок на документы", vbExclamation)
  Case EM_LINK_SINGLE:          Call MsgBox("Выделите одну ссылку", vbExclamation)
  Case EM_LINK_INVALID:         Call MsgBox("Формат выделенной ссылки не соответствует требованиям Реестра", vbExclamation)
  Case EM_DOC_NO_LINKS:         Call MsgBox("Документ игнорируется или является справочником, обработка ссылок не доступна", vbExclamation)
  Case EM_HELP_FILE_INVALID:    Call MsgBox(Fmt("Не удалось открыть файл справки: {1}", unwrapped), vbExclamation)
  Case EM_REMOVE_FIRST_LINK:    Call MsgBox("Невозможно удалить титульную ссылку!", vbExclamation)
  Case EM_NO_BOOKMARKS:         Call MsgBox("В выделенном тексте отсутствуют закладки", vbExclamation)
  Case EM_FILE_ALREADY_ADDED:   Call MsgBox("Файл уже находится в Реестре. Используйте кнопку ""Редактировать"" для изменения параметров документа", vbExclamation)
  Case EM_INVALID_LINK_NUMBER:  Call MsgBox("Данная ссылка отсутствует в базе. Возможно документ добавлен без обработки ссылок", vbExclamation)
  Case EM_ADD_LINK_DB_FAILED:   Call MsgBox("Ошибка при попытке добавления ссылки в базу", vbExclamation)
  Case EM_ADD_LINK_DOC_FAILED:  Call MsgBox("Ошибка при попытке добавления ссылки в документ", vbExclamation)
  Case EM_NO_VALID_LINKS:       Call MsgBox("В выделенном диапазоне отсутствуют валидные ссылки!", vbExclamation)
  Case EM_FILENAME_EMPTY:       Call MsgBox("Название документ не может быть пусто!", vbExclamation)
  Case EM_FILENAME_TOO_LONG:    Call MsgBox("Имя файла вместе с путем не должно превышать 255 символов!", vbExclamation)
  Case EM_HAS_NO_LINKS:         Call MsgBox("Ссылки данного документа не добавлены в Реестр. Измените статус документа или добавьте его заново", vbExclamation)
  Case EM_ID_INVALID_FORMAT:    Call MsgBox("Некорректный идентификатор документа", vbExclamation)
  Case EM_BOOKMARK_NOT_AVAILABLE:
    Call MsgBox("Закладка уже есть в текущем документе в другом диапазоне!" & vbNewLine & _
                "Выберите другое имя закладки", vbExclamation)

  ' ================= Информация ======================
  Case IM_SCAN_MODE:            Call MsgBox("Документ находится в режиме справочника, ссылки не размечаются", vbInformation)
  Case IM_IGNORE_MODE:          Call MsgBox("Документ игнорируется, ссылки не размечаются", vbInformation)
  Case IM_LINKS_TODO:           Call MsgBox(Fmt("Количество ссылок, по которым не принято решение: {1}" & vbNewLine & "Времени затрачено: {2}", unwrapped), vbInformation)
  Case IM_LINKS_DONE:           Call MsgBox(Fmt("Все внешние ссылки обработаны" & vbNewLine & "Времени затрачено: {1}", unwrapped), vbInformation)
  Case IM_DOC_OUTER:            Call MsgBox("Документ добавлен в Реестр в режиме справочника. Информация о ссылках не загружается", vbInformation)
  Case IM_LINKS_ADDED:          Call MsgBox(Fmt("Документ добавлен в Реестр." & vbNewLine & "Количество ссылок внутри документа: {1}", unwrapped), vbInformation)
  Case IM_DOC_IGNORED:          Call MsgBox(Fmt("Количество новых игнорируемых документов: {1}", unwrapped), vbInformation)
  Case IM_DOC_LINKS_DONE:       Call MsgBox("Необработанных ссылок не обнаружено" & vbNewLine & "Обновите документ (макрос HT03_UpdateMarkup)!", vbInformation)
  Case IM_HYPERLINKS_DONE:      Call MsgBox("Гиперссылки обновлены", vbInformation)
  Case IM_QUERY_LINK:           Call MsgBox(Fmt("В буфер обмена скопирована ссылка для запроса по норме: {1}", unwrapped), vbInformation)
  Case IM_DOC_EXPRESS_ADD:      Call MsgBox(Fmt("Количество новых справочных документов: {1}", unwrapped), vbInformation)
  Case IM_REMOVE_LINK_OK:       Call MsgBox(Fmt("Количество удаленных ссылок: {1}", unwrapped), 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 As Long: answer = vbNo
  Select Case theCode
  Case QM_ADD_TITLELINK
    answer = MsgBox(Fmt("Внимание! Вы добавляете документ не из ГАРАНТа" & vbNewLine & _
          "Для него сгенерирован ID: {1}" & vbNewLine & _
          "В первый абзац будет добавлена соответствующая ссылка. Продолжить?", unwrapped), vbYesNo + vbQuestion)
  Case QM_OPEN_GARANT
    answer = MsgBox(Fmt("Ваш выбор типа ссылки сохранен, " & _
            "однако документ по ссылке не загружен в Реестр " & _
            "и ссылка считается не обработанной" & vbNewLine & _
            "ID документа: {1}" & vbNewLine & _
            "Хотите ли Вы открыть его в ГАРАНТ?", unwrapped), vbYesNo + vbQuestion)
  Case QM_DELETE_BEFORE_ADD
    answer = MsgBox(Fmt("Документ с таким ID уже есть в базе!" & vbNewLine & "ID: {1}" & vbNewLine & _
                    "Удалить предыдущую версию документа перед добавлением новой версии?" & vbNewLine & _
                    "ВНИМАНИЕ!! Все решения по ссылкам в данном документе будут потеряны!!", unwrapped), vbYesNo + vbExclamation)
  Case QM_DELETE_BEFORE_ADD_DUMMY
    answer = MsgBox(Fmt("Документ с таким ID уже есть в базе!" & vbNewLine & "ID: {1}" & vbNewLine & _
                    "Удалить предыдущую версию документа перед добавлением новой версии?" & vbNewLine & vbNewLine & _
                    "Текущая версия документа в Реестре является пустышкой, поэтому ее удаление не приведет к потере информации", unwrapped), vbYesNo + vbExclamation)
  Case QM_RELOAD_ON_UPDATE
    answer = MsgBox(Fmt("Документ {1} не содержит блока ссылок в базе" & vbNewLine & _
                    "Хотите ли вы сканировать ссылки данного документа и добавить их в Реестр?", unwrapped), vbYesNo + vbExclamation)
  Case QM_RELOAD_CONFIRM:   answer = MsgBox(Fmt("Все решения по ссылкам будут обнулены. Продолжить?", unwrapped), vbYesNo + vbExclamation)
  
  Case Else
    Call MsgBox("Неверный код сообщения", vbCritical)
  End Select
  UIAskQuestion = answer = vbYes
End Function
