///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область СлужебныйПрограммныйИнтерфейс

Функция Подключены() Экспорт
	
	Возврат ОбсужденияСлужебныйВызовСервера.Подключены();
	
КонецФункции

Процедура ПоказатьПодключение(ОписаниеЗавершения = Неопределено) Экспорт
	
	ОткрытьФорму("Обработка.ПодключениеОбсуждений.Форма",,,,,, ОписаниеЗавершения);
	
КонецПроцедуры

Процедура ПоказатьОтключение() Экспорт
	
	Если Не ОбсужденияСлужебныйВызовСервера.Подключены() Тогда 
		ПоказатьПредупреждение(, НСтр("ru = 'Обсуждения уже отключены ранее.'"));
		Возврат;
	КонецЕсли;
	
	Кнопки = Новый СписокЗначений;
	Кнопки.Добавить("Отключить", НСтр("ru = 'Отключить'"));
	Кнопки.Добавить(КодВозвратаДиалога.Нет);
	
	Оповещение = Новый ОписаниеОповещения("ПослеОтветаНаВопросОбОтключении", ЭтотОбъект);
	
	ПоказатьВопрос(Оповещение, НСтр("ru = 'Отключить обсуждения?'"),
		Кнопки,, КодВозвратаДиалога.Нет);
	
КонецПроцедуры

Процедура ПослеЗаписиПользователя(Форма, ОписаниеЗавершения) Экспорт
	
	Если Не Форма.ПредлагатьОбсуждения
	 Или Не ЗначениеЗаполнено(Форма.Объект.ИдентификаторПользователяИБ) Тогда
		ВыполнитьОбработкуОповещения(ОписаниеЗавершения);
		Возврат;
	КонецЕсли;
	
	Форма.ПредлагатьОбсуждения = Ложь;
		
	ОповещениеОЗавершении = Новый ОписаниеОповещения("ПредлагатьОбсужденияЗавершение", ЭтотОбъект, ОписаниеЗавершения);
	ПараметрыВопроса = СтандартныеПодсистемыКлиент.ПараметрыВопросаПользователю();
	ПараметрыВопроса.ПредлагатьБольшеНеЗадаватьЭтотВопрос = Истина;
	ПараметрыВопроса.Заголовок = НСтр("ru = 'Обсуждения (система взаимодействий)'");
	СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(ОповещениеОЗавершении, Форма.ПредлагатьОбсужденияТекст,
		РежимДиалогаВопрос.ДаНет, ПараметрыВопроса);
	
КонецПроцедуры

Процедура ПриПолученииФормыВыбораПользователейСистемыВзаимодействия(НазначениеВыбора, Форма, ИдентификаторОбсуждения, Параметры, ВыбраннаяФорма, СтандартнаяОбработка) Экспорт

	Параметры.Вставить("ВыборУчастниковОбсуждения", Истина);
	Параметры.Вставить("РежимВыбора", Истина);
	Параметры.Вставить("ЗакрыватьПриВыборе", Ложь);
	Параметры.Вставить("МножественныйВыбор", Истина);
	Параметры.Вставить("РасширенныйПодбор", Истина);
	Параметры.Вставить("ВыбранныеПользователи", Новый Массив);
	Параметры.Вставить("ЗаголовокФормыПодбора", НСтр("ru='Участники обсуждения'"));
	
	СтандартнаяОбработка = Ложь;
	
	ВыбраннаяФорма = "Справочник.Пользователи.ФормаВыбора";

КонецПроцедуры

Процедура ПоказатьНастройкуИнтеграцииСВнешнимиСистемами() Экспорт
	ОткрытьФорму("Обработка.ПодключениеОбсуждений.Форма.НастройкиСообщенийИзДругихПриложений",,ЭтотОбъект);
КонецПроцедуры

Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт
	
	ОбработчикФормированияКоманд = Новый ОписаниеОповещения("ПриФормированииКомандСистемыВзаимодействий", ЭтотОбъект);
	СистемаВзаимодействия.ПодключитьОбработчикФормированияКоманд(ОбработчикФормированияКоманд);
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Процедура НачатьПодборУчастниковОбсуждения(Элемент) Экспорт
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("РежимВыбора", Истина);
	ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Ложь);
	ПараметрыФормы.Вставить("МножественныйВыбор", Истина);
	ПараметрыФормы.Вставить("РасширенныйПодбор", Истина);
	ПараметрыФормы.Вставить("ВыбранныеПользователи", Новый Массив);
	ПараметрыФормы.Вставить("ЗаголовокФормыПодбора", НСтр("ru='Участники обсуждения'"));
	
	ОткрытьФорму("Справочник.Пользователи.ФормаВыбора", ПараметрыФормы,Элемент,,,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

Процедура ПоказатьИнформациюОбИнтеграции(Форма, ОписаниеИнтеграции, ОповещениеОбИзмененииИнтеграции) Экспорт

	Оповещение = Новый ОписаниеОповещения("СозданиеИнтеграцииЗавершение", ЭтотОбъект,
		Новый Структура("Оповещение", ОповещениеОбИзмененииИнтеграции));
		
	ТипыИнтеграции = ОбсужденияСлужебныйКлиентСервер.ТипыВнешнихСистем();
	ИмяФормы = "Обработка.ПодключениеОбсуждений.Форма";
	Если ОписаниеИнтеграции.Тип = ТипыИнтеграции.Telegram Тогда
		ИмяФормы = ИмяФормы + ".СозданиеБотаTelegram";
	ИначеЕсли ОписаниеИнтеграции.Тип = ТипыИнтеграции.ВКонтакте Тогда	
		ИмяФормы = ИмяФормы + ".СозданиеБотаВКонтакте";
	ИначеЕсли ОписаниеИнтеграции.Тип = ТипыИнтеграции.WhatsApp Тогда	
		ИмяФормы = ИмяФормы + ".СозданиеБотаWhatsApp";
	ИначеЕсли ОписаниеИнтеграции.Тип = ТипыИнтеграции.ВебЧат Тогда	
		ИмяФормы = ИмяФормы + ".СозданиеБотаВебЧат";
	ИначеЕсли ОписаниеИнтеграции.Тип = ТипыИнтеграции.Webhook Тогда	
		ИмяФормы = ИмяФормы + ".СозданиеБотаWebhook";
	КонецЕсли;
		
	ОткрытьФорму(ИмяФормы, ОписаниеИнтеграции, Форма,,,, Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

Процедура СозданиеИнтеграцииЗавершение(Результат, ДополнительныеПараметры) Экспорт

	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.Оповещение, Истина);

КонецПроцедуры

Процедура ПослеОтветаНаВопросОбОтключении(КодВозврата, Контекст) Экспорт
	
	Если КодВозврата = "Отключить" Тогда 
		ПриОтключении();
	КонецЕсли;
	
КонецПроцедуры

Процедура ПриОтключении()
	
	Оповещение = Новый ОписаниеОповещения("ПослеУспешногоОтключения", ЭтотОбъект,,
		"ПриОбработкеОшибкиОтключения", ЭтотОбъект);
	
	Попытка
		СистемаВзаимодействия.НачатьОтменуРегистрацииИнформационнойБазы(Оповещение);
	Исключение
		ПриОбработкеОшибкиОтключения(ИнформацияОбОшибке(), Ложь, Неопределено);
	КонецПопытки;
	
КонецПроцедуры

Процедура ПослеУспешногоОтключения(Контекст) Экспорт
	
	Оповестить("ОбсужденияПодключены", Ложь);
	
КонецПроцедуры

Процедура ПриОбработкеОшибкиОтключения(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт 
	
	СтандартнаяОбработка = Ложь;
	
	ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(
		НСтр("ru = 'Обсуждения.Ошибка отмены регистрации информационной базы'",
			ОбщегоНазначенияКлиент.КодОсновногоЯзыка()),
		"Ошибка",
		ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке),, Истина);
	
	СтандартныеПодсистемыКлиент.ВывестиИнформациюОбОшибке(ИнформацияОбОшибке);
	
КонецПроцедуры

Процедура ПредлагатьОбсужденияЗавершение(Результат, ОписаниеЗавершения) Экспорт
	
	Если Результат = Неопределено Тогда
		ВыполнитьОбработкуОповещения(ОписаниеЗавершения);
		Возврат;
	КонецЕсли;
	
	Если Результат.БольшеНеЗадаватьЭтотВопрос Тогда
		ОбщегоНазначенияКлиент.ХранилищеОбщихНастроекСохранить("НастройкиПрограммы", "ПредлагатьОбсуждения", Ложь);
	КонецЕсли;
	
	Если Результат.Значение = КодВозвратаДиалога.Да Тогда
		ПоказатьПодключение();
		Возврат;
	КонецЕсли;
	ВыполнитьОбработкуОповещения(ОписаниеЗавершения);
	
КонецПроцедуры

Процедура ПриФормированииКомандСистемыВзаимодействий(ПараметрыКоманд, Команды, КомандаПоУмолчанию, ДополнительныеПараметры) Экспорт
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда
		МодульНапоминанияПользователяСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("НапоминанияПользователяСлужебныйКлиент");
		МодульНапоминанияПользователяСлужебныйКлиент.ДобавитьКомандыОбсуждения(ПараметрыКоманд, Команды, КомандаПоУмолчанию);
	КонецЕсли;
	
	ПроверитьВыполняемоеДействие(ПараметрыКоманд, Команды, КомандаПоУмолчанию);
	
КонецПроцедуры

Процедура ПроверитьВыполняемоеДействие(ПараметрыКоманд, Команды, КомандаПоУмолчанию)
	
	Если Не ПоказыватьПредупреждениеБезопасности(ПараметрыКоманд) Тогда
		Возврат;
	КонецЕсли;
	
	УдаляемыеКоманды = Новый Массив;
	
	Для Индекс = -Команды.ВГраница() По 0 Цикл
		Если Команды[-Индекс].Команда = СтандартнаяКомандаСистемыВзаимодействия.ОткрытьВложение Тогда
			Команды.Удалить(Индекс);
		КонецЕсли;
	КонецЦикла;
	
	Если Не ОбсужденияСлужебныйВызовСервера.ДоступноОткрытиеВнешнихОтчетовИОбработок() Тогда
		КомандаПоУмолчанию = Новый ОписаниеКомандыСистемыВзаимодействия(
			СтандартнаяКомандаСистемыВзаимодействия.СохранитьВложение);
		Возврат;
	КонецЕсли;
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПоказатьПредупреждениеБезопасности", ЭтотОбъект, ПараметрыКоманд);
	КомандаПоУмолчанию = Новый ОписаниеКомандыСистемыВзаимодействия(ОписаниеОповещения);
	
КонецПроцедуры

Функция ПоказыватьПредупреждениеБезопасности(ПараметрыКоманд)
	
	ЭтоВнешнийОтчетИлиОбработка = Ложь;
	
	Если ПараметрыКоманд.Вложение <> Неопределено Тогда
		Файл = Новый Файл (ПараметрыКоманд.Вложение.Наименование);
		ЭтоВнешнийОтчетИлиОбработка = НРег(Файл.Расширение) = ".erf" Или НРег(Файл.Расширение) = ".epf";
	КонецЕсли;
	
	Возврат ЭтоВнешнийОтчетИлиОбработка
		И РазрешенныеВложения()[ИдентификаторВложения(ПараметрыКоманд)] <> Истина
		
КонецФункции

Процедура ПоказатьПредупреждениеБезопасности(ПараметрыКоманд) Экспорт
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПродолжитьОткрытиеВложения", ЭтотОбъект, ПараметрыКоманд);
	ПользователиСлужебныйКлиент.ПоказатьПредупреждениеБезопасности(ОписаниеОповещения,
		ПользователиСлужебныйКлиентСервер.ВидыПредупрежденийБезопасности().ПередДобавлениемДополнительногоОтчетаИлиОбработки);
	
КонецПроцедуры

Процедура ПродолжитьОткрытиеВложения(Результат, ПараметрыКоманд) Экспорт

	Если Результат <> "Продолжить" Тогда
		Возврат;
	КонецЕсли;
	
	РазрешенныеВложения()[ИдентификаторВложения(ПараметрыКоманд)] = Истина;
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПриОткрытииПотокаДляЧтенияВложения",
		ЭтотОбъект, ПараметрыКоманд.Вложение);
	
	ПараметрыКоманд.Вложение.НачатьОткрытиеПотокаДляЧтения(ОписаниеОповещения);
	
КонецПроцедуры

Процедура ПриОткрытииПотокаДляЧтенияВложения(Поток, Вложение) Экспорт

	Если Поток = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	БуферДвоичныхДанных = Новый БуферДвоичныхДанных(Вложение.Размер);
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("БуферДвоичныхДанных", БуферДвоичныхДанных);
	ДополнительныеПараметры.Вставить("Вложение", Вложение);

	ОписаниеОповещения = Новый ОписаниеОповещения("ПриЗавершенииЧтенияПотока", ЭтотОбъект, ДополнительныеПараметры);
	
	Поток.НачатьЧтение(ОписаниеОповещения, БуферДвоичныхДанных, 0, Вложение.Размер);

КонецПроцедуры

Процедура ПриЗавершенииЧтенияПотока(Количество, ДополнительныеПараметры) Экспорт
	
	БуферДвоичныхДанных = ДополнительныеПараметры.БуферДвоичныхДанных;
	Вложение = ДополнительныеПараметры.Вложение;
	ДвоичныеДанные = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(БуферДвоичныхДанных);
	АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
	
	Файл = Новый Файл(Вложение.Наименование);
	
	Если НРег(Файл.Расширение) = ".epf" Тогда
		ИмяОбработки = ОбсужденияСлужебныйВызовСервера.ПодключитьВнешнююОбработку(АдресВоВременномХранилище);
		ОткрытьФорму("ВнешняяОбработка."+ ИмяОбработки +".Форма");
	ИначеЕсли Файл.Расширение = ".erf" Тогда
		ИмяОтчета = ОбсужденияСлужебныйВызовСервера.ПодключитьВнешнийОтчет(АдресВоВременномХранилище);
		ОткрытьФорму("ВнешнийОтчет."+ ИмяОтчета +".Форма");
	КонецЕсли;	
	
КонецПроцедуры

Функция ИдентификаторВложения(ПараметрыКоманд)
	
	Если ПараметрыКоманд.Вложение = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;

	Возврат СтрШаблон("%1_%2_%3",
		ПараметрыКоманд.Сообщение.Идентификатор,
		ПараметрыКоманд.Вложение.Наименование,
		ПараметрыКоманд.Вложение.Размер);
		
КонецФункции
	
Функция РазрешенныеВложения()

	ИмяПараметра = "СтандартныеПодсистемы.Обсуждения.РазрешенныеВложения";
	Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда
		ПараметрыПриложения.Вставить(ИмяПараметра, Новый Соответствие);
	КонецЕсли;
	
	Возврат ПараметрыПриложения[ИмяПараметра];

КонецФункции

#КонецОбласти