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

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Если Не Параметры.Свойство("ClientID")
		Или Не Параметры.Свойство("ClientSecret") Тогда
		
		ВызватьИсключение НСтр("ru = 'Эта форма не предназначена для непосредственного открытия.'",
			ОбщегоНазначения.КодОсновногоЯзыка());
		
	КонецЕсли;
	
	ПолеHTML = Обработки.ТранспортСообщенийОбменаЯндексДиск.ПолучитьМакет("ПолучениеТокена_ru").ПолучитьТекст();
	
	ЗаполнитьЗначенияСвойств(ЭтотОбъект, Параметры, "ClientID,ClientSecret");
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ПолучитьТокен(Команда)
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ClientID", ClientID);
	
	Оповещение = Новый ОписаниеОповещения("ПолучитьТокенЗавершение", ЭтотОбъект);
	
	ОткрытьФорму("Обработка.ТранспортСообщенийОбменаЯндексДиск.Форма.ФормаАвторизации",
		ПараметрыФормы,,,,, Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ПолучитьТокенЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Код = Результат;
	
	Результат = ПолучитьТокенЗавершениеНаСервере();
		
	Закрыть(Результат);
	
КонецПроцедуры

&НаСервере
Функция ПолучитьТокенЗавершениеНаСервере()

	ИмяСервера = "oauth.yandex.ru";
	АдресРесурса = "/token";
	
	СтрокаЗапроса = "grant_type=authorization_code" +
		"&code=" + Код + 
		"&client_id=" + ClientID + 
		"&client_secret=" + ClientSecret;
	
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
	Заголовки.Вставить("Content-Length", Формат(СтрДлина(СтрокаЗапроса), "ЧГ="));
	
	Запрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
	Запрос.УстановитьТелоИзСтроки(СтрокаЗапроса);
	
	ЗащищенноеСоединение = ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение();
	Прокси = Неопределено;
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда
		МодульПолучениеФайловИзИнтернета = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернета");
		Прокси = МодульПолучениеФайловИзИнтернета.ПолучитьПрокси("https");
	КонецЕсли;
	Соединение = Новый HTTPСоединение(ИмяСервера, 443,,, Прокси, 20, ЗащищенноеСоединение);
	Ответ = Соединение.ОтправитьДляОбработки(Запрос);
	ТелоОтвета = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
	РезультатЗапроса = ТранспортСообщенийОбмена.JSONВЗначение(ТелоОтвета);
		
	Если Ответ.КодСостояния <> 200 Тогда
		
		СообщениеОбОшибке = РезультатЗапроса["message"];
		ОбщегоНазначения.СообщитьПользователю(СообщениеОбОшибке);
		
		Возврат Неопределено;
		
	КонецЕсли;
	
	Результат = Новый Структура();
	Результат.Вставить("AccessToken", РезультатЗапроса["access_token"]);
	Результат.Вставить("RefreshToken", РезультатЗапроса["refresh_token"]);
	Результат.Вставить("ExpiresIn", ТекущаяДатаСеанса() + РезультатЗапроса["expires_in"]);
	Результат.Вставить("ClientID", ClientID);
	Результат.Вставить("ClientSecret", ClientSecret);
	
	Возврат Результат;
	
КонецФункции

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