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

#Область ОписаниеПеременных

&НаКлиенте
Перем ПрограммноеЗакрытие;

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

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	СписокСпособов.Очистить();
	СписокСпособов.Добавить(Перечисления.СпособыАвторизацииDSS.Вторичный_AirKeyLite, "ГруппаМобильноеПриложение1");
	СписокСпособов.Добавить(Перечисления.СпособыАвторизацииDSS.Вторичный_МобильноеПриложение, "ГруппаМобильноеПриложение");
	СписокСпособов.Добавить(Перечисления.СпособыАвторизацииDSS.Вторичный_ОфлайнПодтверждение, "ГруппаОфлайн");
	СписокСпособов.Добавить(Перечисления.СпособыАвторизацииDSS.Вторичный_СМС, "ГруппаТелефон");
	СписокСпособов.Добавить(Перечисления.СпособыАвторизацииDSS.Вторичный_ЭлектроннаяПочта, "ГруппаПочта");
	СписокСпособов.Добавить(Перечисления.СпособыАвторизацииDSS.Вторичный_DSSSDK, "ГруппаМобильноеПриложение2");
	
	КоличествоВСписке = 0;
	
	Если Параметры.СписокСпособов <> Неопределено Тогда
		ВсеСпособы = ПолучитьРеестрСпособов();
		Для каждого СтрокаМассива Из ВсеСпособы Цикл
			НашлиЗначение = СписокСпособов.НайтиПоЗначению(СтрокаМассива.Тип);
			
			Если СтрокаМассива.Адрес Тогда
				ИдентификаторыПриложений.Добавить(СтрокаМассива.Идентификатор);
			КонецЕсли;
			
			Если НашлиЗначение <> Неопределено Тогда
				НашлиЗначение.Пометка = Истина;
				КоличествоВСписке = КоличествоВСписке + 1;
			КонецЕсли;	
		КонецЦикла;
	КонецЕсли;
	
	ДанныеПодтверждения	= Параметры.ДанныеПодтверждения; 
	НастройкиПользователя = Параметры.НастройкиПользователя;
	
	ВторичнаяАвторизация = СпособАвторизацииПользователя(ДанныеПодтверждения);

	НашлиЗначение = СписокСпособов.НайтиПоЗначению(ВторичнаяАвторизация);
	Если НашлиЗначение <> Неопределено 
		И НашлиЗначение.Пометка Тогда
		НашлиЗначение.Пометка = Ложь;
		КоличествоВСписке = КоличествоВСписке - 1;
	КонецЕсли;	
	
	УправлениеФормой();
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	СервисКриптографииDSSСлужебныйКлиент.ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие);
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	
	Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы(
			ЭтотОбъект,
			Отказ,
			ПрограммноеЗакрытие,
			ЗавершениеРаботы) Тогда
		ЗакрытьФорму();
	КонецЕсли;
	
КонецПроцедуры

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

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ОфлайнПодтверждение(Команда)
	
	ВыборПользователя(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ОфлайнПодтверждение"));
	
КонецПроцедуры

&НаКлиенте
Процедура МобильноеПриложение1(Команда)
	
	ВыборПользователя(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_AirKeyLite"));
	
КонецПроцедуры

&НаКлиенте
Процедура Почта(Команда)
	
	ВыборПользователя(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ЭлектроннаяПочта"));
	
КонецПроцедуры

&НаКлиенте
Процедура МобильноеПриложение(Команда)
	
	ВыборПользователя(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_МобильноеПриложение"));
	
КонецПроцедуры

&НаКлиенте
Процедура Телефон(Команда)
	
	ВыборПользователя(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_СМС"));
	
КонецПроцедуры

&НаКлиенте
Процедура МобильноеПриложение2(Команда)
	
	Если ИдентификаторыПриложений.Количество() > 0 Тогда
		ВыборПользователя(ИдентификаторыПриложений[0].Значение);
	Иначе	
		ВыборПользователя(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_DSSSDK"));
	КонецЕсли;
	
КонецПроцедуры
	
#КонецОбласти

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

&НаКлиенте
Процедура ВыборПользователя(СпособВыбора)
	
	ВыбранныйСпособ = СпособВыбора;
	Если ВыбранныйСпособ <> ВторичнаяАвторизация 
		И ДанныеПодтверждения <> Неопределено Тогда
		ДанныеПодтверждения.ВторичнаяАвторизация = ВыбранныйСпособ;
		
		ОтветПользователя = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Истина);
		ОтветПользователя.Вставить("Результат", ВыбранныйСпособ);
		ОтветПользователя.Вставить("ДанныеПодтверждения", ДанныеПодтверждения);
	Иначе
		ОтветПользователя = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь);
	КонецЕсли;

	ЗакрытьФорму(ОтветПользователя);
	
КонецПроцедуры	

&НаКлиенте
Процедура ЗакрытьФорму(ПараметрыЗакрытия = Неопределено)
	
	ПрограммноеЗакрытие = Истина;
	
	Если ПараметрыЗакрытия = Неопределено Тогда
		ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь, "ОтказПользователя");
	КонецЕсли;
	
	Закрыть(ПараметрыЗакрытия);
	
КонецПроцедуры	

&НаСервере
Функция ПолучитьПредставлениеТелефона()
	
	КодЯзыка = СервисКриптографииDSSСлужебный.КодЯзыка();
	
	Если НастройкиПользователя <> Неопределено И ЗначениеЗаполнено(НастройкиПользователя.Телефон) Тогда
		Результат = НСтр("ru = 'Временный пароль будет отправлена номер мобильного телефона'", КодЯзыка) + 
						" " + СервисКриптографииDSSКлиентСервер.ПредставлениеТелефона(НастройкиПользователя.Телефон);
	Иначе
		Результат = НСтр("ru = 'Временный пароль будет отправлен на зарегистрированный номер мобильного телефона.'", КодЯзыка);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

&НаСервере
Функция ПолучитьПредставлениеПочты()
	
	КодЯзыка = СервисКриптографииDSSСлужебный.КодЯзыка();
	
	Если НастройкиПользователя <> Неопределено И ЗначениеЗаполнено(НастройкиПользователя.ЭлектроннаяПочта) Тогда
		Результат = НСтр("ru = 'Временный пароль будет отправлен адрес электронной почты'", КодЯзыка) + 
						" " + СервисКриптографииDSSКлиентСервер.ПредставлениеАдресаПочты(НастройкиПользователя.ЭлектроннаяПочта);
	Иначе
		Результат = НСтр("ru = 'Временный пароль будет отправлен на зарегистрированный адрес электронной почты.'", КодЯзыка);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

&НаСервере
Процедура УправлениеФормой()
	
	Для каждого СтрокаСписка Из СписокСпособов Цикл
		Элементы[СтрокаСписка.Представление].Видимость = СтрокаСписка.Пометка;
	КонецЦикла;	
	
	Элементы.ГруппаСтраницы.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет;
	
	Если КоличествоВСписке = 0 Тогда
		Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаНедоступны;
	Иначе
		Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаВыбор;
	КонецЕсли;
	
	Элементы.ДекорацияТелефонПодсказка.Заголовок = ПолучитьПредставлениеТелефона();
	Элементы.ДекорацияПочтаПодсказка.Заголовок = ПолучитьПредставлениеПочты();
			
КонецПроцедуры

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

	Возврат Результат;
	
КонецФункции

// Получить параметр формы СписокСпособов при ее открытии.
//
// Возвращаемое значение:
//  Массив из см. СервисКриптографииDSSКлиентСервер.ОписаниеВторичнойАвторизации
//
&НаСервере
Функция ПолучитьРеестрСпособов()
	
	Возврат Параметры.СписокСпособов;
	
КонецФункции

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


