Перем мПолеТекстаПрограммы Экспорт;
Перем мПолеТекстаХТМЛ;
Перем мФоновыйЗапросХттп;
Перем мНовыйКод;
Перем мНачальныйМаркерКода;
Перем мКонечныйМаркерКода;
Перем мПрефиксПолногоКода;

Функция СохраняемаяНастройкаФормы(выхНаименование, выхИменаСвойств) Экспорт 
	выхИменаСвойств = "Форма.ТекстЗапроса, Форма.ПередаватьКонтекст";
	Возврат Неопределено;
КонецФункции

Процедура ЗагрузитьНастройкуВФорме(НастройкаФормы, ДопПараметры) Экспорт 
	ирКлиент.ЗагрузитьНастройкуФормыЛкс(ЭтаФорма, НастройкаФормы); 
КонецПроцедуры
 
Процедура ПриОткрытии()
	ирКлиент.Форма_ПриОткрытииЛкс(ЭтаФорма);
	мФоновыйЗапросХттп = ирКлиент.НовыйФоновыйЗапросХттпЛкс(ЭтаФорма);
	мПолеТекстаХТМЛ = ирКлиент.ОболочкаПоляТекстаЛкс(ЭлементыФормы.HTMLГотовый);
	ТекстХТМЛ = ПолучитьМакет("ПросмотрMarkdownHTML").ПолучитьТекст();
	ТекстХТМЛ = СтрЗаменить(ТекстХТМЛ, "%ТекстJS%", ПолучитьМакет("ПросмотрMarkdownКод").ПолучитьТекст()); 
	ЭлементыФормы.HTMLГотовый.УстановитьТекст(ТекстХТМЛ);
	ЭлементыФормы.ПолеКода.УстановитьТекст(КодЗапроса);
КонецПроцедуры

// Предопределеный метод механизма фоновых операций
Процедура ПроверкаЗавершенияФоновыхЗаданий() Экспорт 
	ирКлиент.ПроверитьЗавершениеФоновыхЗаданийФормыЛкс(ЭтаФорма);
КонецПроцедуры

Процедура СлужебноеПолеХТМЛonclick(Элемент, pEvtObj) Экспорт
	мФоновыйЗапросХттп.ОбработатьОтвет(ЭтаФорма);
КонецПроцедуры

Процедура ДействияФормыОтправить(Кнопка = Неопределено)
	ПараметрыЗапроса = Новый Структура("Текст", ТекстЗапроса);
	Если Кнопка <> Неопределено Тогда
		ЭтаФорма.РежимНапарника = "custom";
	КонецЕсли; 
	ЭтаФорма.КодЗапроса = ЭлементыФормы.ПолеКода.ПолучитьТекст();
	Если ЗначениеЗаполнено(КодЗапроса) Тогда
		ПараметрыЗапроса.Текст = ПараметрыЗапроса.Текст + "
		|" + мНачальныйМаркерКода + КодЗапроса + " 
		|" + мКонечныйМаркерКода + "
		// Первой строкой внутри блока не ИИ не хочет делать
		|Блоки кода всегда обрамляй строкой (```).
		|Непосредственно перед началом полного блока кода вставляй строку (" + мПрефиксПолногоКода + ").
		|Не повторяй в ответе оригинальный код целиком. 
		|";
		Если ПередаватьКонтекст Тогда
			ПараметрыЗапроса.Текст = ПараметрыЗапроса.Текст + "
			|<Контекст>
			|" + мПолеТекстаПрограммы.КонтекстИИ(ТекстЗапроса) + "
			|</Контекст>    
			|";
		КонецЕсли;
	КонецЕсли;
	Если ПоказатьЗапрос Тогда
		Если ирКлиент.ОткрытьТекстЛкс(ПараметрыЗапроса.Текст, "Подтвердите запрос ИИ",,,,,, Истина) = Неопределено Тогда
			Возврат;
		КонецЕсли;
	КонецЕсли;
	ирОбщий.ОбновитьТекстПослеМаркераЛкс(ЭтаФорма.Заголовок,, ирОбщий.ПредставлениеСОграничениемДлиныЛкс(ТекстЗапроса, 50), ": ");
	Кнопка = ЭлементыФормы.ДействияФормы.Кнопки.Отправить;
	Если Кнопка.Картинка <> ирКэш.КартинкаПоИмениЛкс("ирОстановить") Тогда
		ЭлементыФормы.HTMLГотовый.Документ.defaultView._1CAPI.setText("");
	КонецЕсли;
	мНовыйКод = "";
	ЭлементыФормы.ДействияФормы.Кнопки.СравнитьТекст.Доступность = Ложь;
	ЭлементыФормы.ДействияФормы.Кнопки.Применить.Доступность = Ложь;
	мФоновыйЗапросХттп.ОтправитьЗапросИИ(ПараметрыЗапроса, ЭтаФорма, "ОтправитьКонец",, Кнопка, Истина,, РежимНапарника);
	ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(ЭлементыФормы.ТекстЗапроса, ЭтаФорма);
КонецПроцедуры

Процедура ОтправитьКонец(Знач СостояниеЗадания, Знач РезультатЗадания) Экспорт
	Если РезультатЗадания = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ТекстОтвета = РезультатЗадания.Ответ;
	Если СтрЧислоВхождений(ТекстОтвета, мНачальныйМаркерКода) > СтрЧислоВхождений(ТекстОтвета, мКонечныйМаркерКода)/2 Тогда
		ТекстОтвета = ТекстОтвета + Символы.ПС + мКонечныйМаркерКода;
	ИначеЕсли Найти(ТекстОтвета, мПрефиксПолногоКода + Символы.ПС + мНачальныйМаркерКода) Тогда
		мНовыйКод = ирОбщий.ТекстМеждуМаркерамиЛкс(ТекстОтвета, мПрефиксПолногоКода + Символы.ПС + мНачальныйМаркерКода, мКонечныйМаркерКода, Ложь);
		ЭлементыФормы.ДействияФормы.Кнопки.СравнитьТекст.Доступность = ЗначениеЗаполнено(мНовыйКод);
		ЭлементыФормы.ДействияФормы.Кнопки.Применить.Доступность = ЗначениеЗаполнено(мНовыйКод) И мПолеТекстаПрограммы <> Неопределено;
	КонецЕсли;
	ЭлементыФормы.HTMLГотовый.Документ.defaultView._1CAPI.setText(ТекстОтвета,, Истина); // Долго на большом тексте
КонецПроцедуры   

Процедура ВнешнееСобытие(Источник, Событие, Данные) Экспорт
	ирКлиент.Форма_ВнешнееСобытиеЛкс(ЭтаФорма, Источник, Событие, Данные);
КонецПроцедуры

Процедура ТабличноеПолеПриПолученииДанных(Элемент, ОформленияСтрок) Экспорт
	ирКлиент.ТабличноеПолеПриПолученииДанныхЛкс(ЭтаФорма, Элемент, ОформленияСтрок);
КонецПроцедуры

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Экспорт
	ирКлиент.Форма_ОбработкаОповещенияЛкс(ЭтаФорма, ИмяСобытия, Параметр, Источник);
КонецПроцедуры

Процедура ПриЗакрытии()
	ирКлиент.Форма_ПриЗакрытииЛкс(ЭтаФорма);
КонецПроцедуры     

Процедура КлсКомандаНажатие(Кнопка)
	ирКлиент.УниверсальнаяКомандаФормыЛкс(ЭтаФорма, Кнопка);
КонецПроцедуры

Процедура СлужебноеПолеХТМЛДокументСформирован(Элемент)
	//Если Истина
	//	И ТекстЗапроса <> ""
	//	И КодЗапроса <> "" 
	//Тогда
	//	ДействияФормыОтправить();
	//КонецЕсли;
КонецПроцедуры

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

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

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

Процедура ДействияФормыСравнитьТекст(Кнопка)
	ирКлиент.Сравнить2ЗначенияВФормеЛкс(КодЗапроса, мНовыйКод,, "Старый", "Новый",,,,, "ВстроенныйЯзык");
КонецПроцедуры

Процедура HTMLГотовыйonclick(Элемент, pEvtObj)
	Если pEvtObj.srcElement.innerText = "Сравнить" Тогда
		ТекстБлокаКода = pEvtObj.srcElement.parentElement.parentElement.parentElement.childNodes[1].innerText;
		ирКлиент.Сравнить2ЗначенияВФормеЛкс(КодЗапроса, ТекстБлокаКода,, "Старый", "Новый",,,,, "ВстроенныйЯзык");
	КонецЕсли;
КонецПроцедуры

Процедура ДействияФормыПрименить(Кнопка)
	Если МодальныйРежим Тогда
		Закрыть(мНовыйКод);
	Иначе
		мПолеТекстаПрограммы.ВставитьНовыйВариантТекстаОтИИ(мНовыйКод);
	КонецЕсли;
	ЭлементыФормы.ДействияФормы.Кнопки.Применить.Доступность = Ложь;
КонецПроцедуры

Процедура ДействияФормыСыройОтвет(Кнопка)
	ирКлиент.ОткрытьТекстЛкс(ТекстОтвета, Заголовок, "Обычный",, КлючУникальности, ЭтаФорма);
КонецПроцедуры

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Обработка.ирПлатформа.Форма.ЧатИИ");
#Если Сервер И Не Сервер Тогда
	мПолеТекстаХТМЛ = Обработки.ирОболочкаПолеТекста.Создать();
	мПолеТекстаПрограммы = Обработки.ирКлсПолеТекстаПрограммы.Создать();
#КонецЕсли
//мВариантыИмениЯзыка = Новый Массив;
//мВариантыИмениЯзыка.Добавить("1с");
//мВариантыИмениЯзыка.Добавить("1c");
//мВариантыИмениЯзыка.Добавить("bsl");
мНачальныйМаркерКода = "```1с" + Символы.ПС;
мКонечныйМаркерКода = "```";
мПрефиксПолногоКода = "<!--Полный-->";
