Перем мФоновыйЗапросХттп;

Процедура ОсновныеДействияФормыОК(Кнопка = Неопределено)
	#Если Сервер И Не Сервер Тогда
		мПлатформа = Обработки.ирПлатформа.Создать();
	#КонецЕсли
	Если ЗначениеЗаполнено(ГитРепозиторий) Тогда
		Файл = Новый Файл(ГитРепозиторий + ирОбщий.РазделительПутиКФайлуЛкс() + "src");
		Если Не Файл.Существует() Тогда
			ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ГитРепозиторий;
			ирОбщий.СообщитьЛкс("Некорректный путь к гит репозиторию. В указанном каталоге не найден каталог ""src"".", СтатусСообщения.Внимание);
			Возврат;
		КонецЕсли;
	КонецЕсли;
	ирОбщий.СохранитьЗначениеЛкс(ИмяКласса + ".ФайлШаблоновТекста", ФайлШаблоновТекста);
	мПлатформа.ПолучитьТаблицуШаблоновТекста(ИмяКласса,, Истина);
	ирОбщий.СохранитьЗначениеЛкс(ИмяКласса + ".ЛиАктивизироватьОкноСправкиПриЕгоОткрытии", ЛиАктивизироватьОкноСправкиПриЕгоОткрытии);
	ирОбщий.СохранитьЗначениеЛкс(ИмяКласса + ".ПредпочитаюСобственныйКонструкторЗапроса", ПредпочитаюСобственныйКонструкторЗапроса);
	ирОбщий.СохранитьЗначениеЛкс(ИмяКласса + ".АвтоматическаяПодсказкаПоВызовуМетода", АвтоматическаяПодсказкаПоВызовуМетода);
	ирОбщий.СохранитьЗначениеЛкс(ИмяКласса + ".АвтоматическаяПодсказкаАвтодополненияHTML", АвтоматическаяПодсказкаАвтодополненияHTML);
	ирОбщий.СохранитьЗначениеЛкс(ИмяКласса + ".АвтовставкаКвадратнойСкобки", АвтовставкаКвадратнойСкобки);
	ирОбщий.СохранитьЗначениеЛкс(ИмяКласса + ".АвтовставкаДвойнойКавычки", АвтовставкаДвойнойКавычки);
	ирОбщий.СохранитьЗначениеЛкс(ИмяКласса + ".АвтовставкаТочки", АвтовставкаТочки);
	ирОбщий.СохранитьЗначениеЛкс(ИмяКласса + ".ПредпочитатьHTMLРедакторКода", ПредпочитатьHTMLРедакторКода);
	ирОбщий.СохранитьЗначениеЛкс(ИмяКласса + ".СжиматьПустыеСтроки", СжиматьПустыеСтроки);
	ирОбщий.СохранитьЗначениеЛкс(ИмяКласса + ".СжиматьВнутренниеПустотыВСтроке", СжиматьВнутренниеПустотыВСтроке);
	ирОбщий.СохранитьЗначениеЛкс("ГитРепозиторий", ГитРепозиторий);
	мПлатформа.КлючСервисаИИ = Новый ХранилищеЗначения(КлючСервисаИИ);
	мПлатформа.КлючСервисаНапарник = Новый ХранилищеЗначения(КлючСервисаНапарник);
	Если ЗначениеЗаполнено(КлючСервисаНапарник) Тогда
		СоединениеНапарника(КлючСервисаНапарник, Истина);
	КонецЕсли;
	мПлатформа.МодельИИ = МодельИИ;
	мПлатформа.ПараметрыМоделиИИ = ПараметрыМоделиИИ;
	мПлатформа.СерверИИ = СерверИИ;
	ОбработкаОбъект.АвтоматическаяПодсказкаПоВызовуМетода = АвтоматическаяПодсказкаПоВызовуМетода;
	ОбработкаОбъект.АвтоматическаяПодсказкаАвтодополненияHTML = АвтоматическаяПодсказкаАвтодополненияHTML;
	ОбработкаОбъект.ПредпочитатьHTMLРедакторКода = ПредпочитатьHTMLРедакторКода;
	Если ЭтаФорма.КаталогКэша = мПлатформа.СтруктураПодкаталоговФайловогоКэша.КэшМодулей.ПолноеИмя Тогда
		ирОбщий.СохранитьЗначениеЛкс("ПапкаКэшаМодулей", Неопределено,, Истина);
	Иначе
		ирОбщий.СохранитьЗначениеЛкс("ПапкаКэшаМодулей", КаталогКэша,, Истина);
	КонецЕсли; 
	мПлатформа.ПапкаКэшаМодулей = Новый Файл(КаталогКэша);
	мПлатформа.СохранитьОбщиеНастройки();
	ЭтаФорма.Модифицированность = Ложь;
	ПрочитатьОбновитьНастройки(); // для сброса кэша
	Закрыть();
КонецПроцедуры

Процедура ПриОткрытии()
	мПлатформа = ирКэш.Получить();
	#Если Сервер И Не Сервер Тогда
		мПлатформа = Обработки.ирПлатформа.Создать();
	#КонецЕсли
	ирКлиент.Форма_ПриОткрытииЛкс(ЭтаФорма);
	мФоновыйЗапросХттп = ирКлиент.НовыйФоновыйЗапросХттпЛкс(ЭтаФорма);
	мПлатформа.ПрочитатьОбщиеНастройки();
	ПрочитатьОбновитьНастройки();
	ОбновитьИнфоПапкиКэша();
	ОбновитьПредставлениеСтатистикиВыбора();
	ЭлементыФормы.КлючСервисаНапарник.Доступность = ирКэш.ДоступноБраузерWebKitЛкс();
	ЭлементыФормы.ПроверитьНапарника.Доступность = ирКэш.ДоступноБраузерWebKitЛкс();
КонецПроцедуры

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

Процедура ОбновитьПредставлениеСтатистикиВыбора() Экспорт
	ЭтаФорма.СтатистикаВыбора = ирОбщий.РасширенноеПредставлениеЛкс(мПлатформа.ТаблицаСтатистикиВыбора);
КонецПроцедуры

Процедура ФайлШаблоновНачалоВыбора(Элемент, СтандартнаяОбработка)
	
	лПолноеИмяФайла = ирКлиент.ВыбратьФайлЛкс(, "st", "Файл шаблонов текста 1С", Элемент.Значение);
	Если лПолноеИмяФайла = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ирКлиент.ИнтерактивноЗаписатьВПолеВводаЛкс(Элемент, лПолноеИмяФайла);
	
КонецПроцедуры

Процедура ФайлШаблоновТекстаОткрытие(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ТаблицаШаблоновТекста = ирКэш.Получить().ПолучитьТаблицуШаблоновТекста(ИмяКласса);
	ТаблицаШаблоновТекста.Сортировать("Шаблон");
	ирОбщий.ИсследоватьЛкс(ТаблицаШаблоновТекста, Ложь, Истина);
	
КонецПроцедуры

Процедура КоманднаяПанель1ОбновитьКэшМодулей(Кнопка)
	
	ирКлиент.ОбновитьКэшМодулейЛкс(КаталогКэша);
	ОбновитьИнфоПапкиКэша();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

Процедура ВычислитьРазмерПапкиКэша()
	ЭтаФорма.РазмерКэша = ирОбщий.ВычислитьРазмерКаталогаЛкс(КаталогКэша,, Истина);
КонецПроцедуры

Процедура КаталогКэшаПриИзменении(Элемент)
	#Если Сервер И Не Сервер Тогда
		мПлатформа = Обработки.ирПлатформа.Создать();
	#КонецЕсли
	Файл = Новый Файл(КаталогКэша);
	Если Файл.Существует() Тогда
		ЭтаФорма.КаталогКэша = Файл.ПолноеИмя;
		ОбновитьИнфоПапкиКэша();
	Иначе
		КаталогКэшаОчистка();
	КонецЕсли; 
	мПлатформа.ОчиститьКэшАнализатораЯзыка();
	ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(Элемент, ЭтаФорма,,, ИмяКомпьютера());
КонецПроцедуры

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

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

Процедура КаталогКэшаНачалоВыбора(Элемент, СтандартнаяОбработка)
	ирКлиент.ПолеФайловогоКаталога_НачалоВыбораЛкс(Элемент, СтандартнаяОбработка);
КонецПроцедуры

Процедура КаталогКэшаОткрытие(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ЗапуститьПриложение(Элемент.Значение);
	
КонецПроцедуры

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

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

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

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

Процедура ГитРепозиторийОткрытие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ЗапуститьПриложение(Элемент.Значение);
КонецПроцедуры

Процедура КоманднаяПанель1ПроверитьМодули(Кнопка)
	
	Форма = ПолучитьФорму("ОшибкиМодуля");
	Форма.ВсеМодули = Истина;
	Форма.Открыть()
	
КонецПроцедуры

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

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

Процедура КлючСервисаИИНачалоВыбора(Элемент, СтандартнаяОбработка)
	Если ПустаяСтрока(СерверИИ) Или СерверИИ = "https://openrouter.ai/api" Тогда
		ЗапуститьПриложение("https://openrouter.ai/settings/keys");
	ИначеЕсли СерверИИ = "https://api.smartbuddy.ru" Тогда
		ЗапуститьПриложение("https://smartbuddy.ru/lk/api");
	ИначеЕсли СерверИИ = "https://api.vsegpt.ru" Тогда
		ЗапуститьПриложение("https://vsegpt.ru/Reg");
	ИначеЕсли СерверИИ = "https://api.together.xyz" Тогда
		ЗапуститьПриложение("https://api.together.ai/settings/api-keys");
	КонецЕсли;
КонецПроцедуры

Процедура МодельИИНачалоВыбора(Элемент, СтандартнаяОбработка)
	Если ПустаяСтрока(СерверИИ) Или СерверИИ = "https://openrouter.ai/api" Тогда
		ЗапуститьПриложение("https://openrouter.ai/models?max_price=0");
	ИначеЕсли СерверИИ = "https://api.smartbuddy.ru" Тогда
		ЗапуститьПриложение("https://smartbuddy.ru/lk/api");
	ИначеЕсли СерверИИ = "https://api.vsegpt.ru" Тогда
		ЗапуститьПриложение("https://vsegpt.ru/Docs/Models");
	ИначеЕсли СерверИИ = "https://api.together.xyz" Тогда
		ЗапуститьПриложение("https://www.together.ai/models");
	КонецЕсли;
КонецПроцедуры

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

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

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

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

Процедура МодельИИОткрытие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	Если ПустаяСтрока(СерверИИ) Тогда
		МодельИИЛ = МодельИИ;
		Если Не ЗначениеЗаполнено(МодельИИЛ) Тогда
			МодельИИЛ = мПлатформа.МодельИИ();
		КонецЕсли;
		ЗапуститьПриложение("https://openrouter.ai/models?q=" + МодельИИЛ);
	КонецЕсли;
КонецПроцедуры

Процедура ПроверитьИИНажатие(Элемент)
	мФоновыйЗапросХттп.ОтправитьЗапросИИ(Новый Структура("текст, проверка", "привет", Истина), ЭтаФорма,,, Элемент,, Истина, , КлючСервисаИИ, СерверИИ, МодельИИ, ПараметрыМоделиИИ);
КонецПроцедуры

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

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

Процедура СерверИИНачалоВыбора(Элемент, СтандартнаяОбработка)
	СписокЗначений = Новый СписокЗначений;
	СписокЗначений.Добавить("https://code.1c.ai",        "code.1c.ai - бесплатно до 01.10.2026, доступна оплата из РФ, потоковый ответ");
	СписокЗначений.Добавить("https://openrouter.ai/api", "openrouter.ai - 50 запросов В ДЕНЬ бесплатно, недоступна оплата из РФ, потоковый ответ");
	СписокЗначений.Добавить("https://api.smartbuddy.ru", "smartbuddy.ru - 10 запросов бесплатно, доступна оплата из РФ");
	СписокЗначений.Добавить("https://api.vsegpt.ru",     "vsegpt.ru - 10 запросов бесплатно, доступна оплата из РФ");
	СписокЗначений.Добавить("https://api.together.xyz",  "together.ai - 1000 запросов бесплатно, недоступна оплата из РФ");
	СписокЗначений.Добавить("https://api.proxyapi.ru/openai", "proxyapi.ru - только платно, доступна оплата из РФ, потоковый ответ, прокси для openrouter.ai");
	СписокЗначений.СортироватьПоПредставлению();
	РезультатВыбора = ВыбратьИзСписка(СписокЗначений, Элемент);
	Если РезультатВыбора <> Неопределено Тогда
		ирКлиент.ИнтерактивноЗаписатьВПолеВводаЛкс(Элемент, РезультатВыбора.Значение);
	КонецЕсли;
КонецПроцедуры

Процедура КлючСервисаНапарникНачалоВыбора(Элемент, СтандартнаяОбработка)
	ЗапуститьПриложение("https://code.1c.ai/tokens");
КонецПроцедуры

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

Процедура ОтправитьМетаданныеНажатие(Элемент)
	ФормаОтправки = ПолучитьФорму("ОтправкаМетаданныхНапарнику");
	ФормаОтправки.Открыть();
КонецПроцедуры

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

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Обработка.ирКлсПолеТекстаПрограммы.Форма.Настройки");
Если мПлатформа = Неопределено Тогда
	ИнициироватьНеинтерактивно();
КонецЕсли;
