from typing import Optional, Dict, Any
import os

from win32com.client import gencache
from win32com.client import Dispatch
import pythoncom

from app.core.config import settings


def create_geometry(params: Dict[str, Any], file_name: str):
    pythoncom.CoInitializeEx(0)


    geom_path = os.path.join(settings.current_directory, "model_3d/Поток.m3d")

    # Проверяем на корректность ключи в запросе
    valid_keys = {'N1', 'L1', 'a1', 'N2', 'L2', 'N3', 'L3'}
    list_collms = []
    values = []
    for key in params:
        if key not in valid_keys and key not in {"plan_title"}:
            raise ValueError(f"Invalid parameter: {key}")
        if key in valid_keys:
            list_collms.append(key)
            values.append(params[key])

    # Генерация уникального имени файла на основе параметров
    # file_name = generate_file_name(params)

    def get_kompas_api7():
        module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
        api = module.IKompasAPIObject(
            Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(module.IKompasAPIObject.CLSID,
                                                                     pythoncom.IID_IDispatch))
        const = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
        return module, api, const

    module7, api7, const7 = get_kompas_api7()  # Подключаемся к API7
    app7 = api7.Application  # Получаем основной интерфейс
    app7.Visible = True  # Показываем окно пользователю (если скрыто)
    app7.HideMessage = const7.ksHideMessageNo  # Отвечаем НЕТ на любые вопросы программы
    print(app7.ApplicationName(FullName=True))  # Печатаем название программы

    doc7 = app7.Documents.Open(PathName=geom_path,
                               Visible=True,
                               ReadOnly=True)

    kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
    kompas6_constants_3d = gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants

    #  Подключим описание интерфейсов API5
    kompas6_api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
    kompas_object = kompas6_api5_module.KompasObject(
        Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID,
                                                                 pythoncom.IID_IDispatch))

    #  Подключим описание интерфейсов API7
    kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
    application = kompas_api7_module.IApplication(
        Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID,
                                                                 pythoncom.IID_IDispatch))

    Documents = application.Documents
    #  Получим активный документ
    kompas_document = application.ActiveDocument
    kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
    iDocument3D = kompas_object.ActiveDocument3D()

    kPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

    varcoll = kPart.VariableCollection()
    varcoll.refresh()

    for i in range(len(values)):
        Variable = varcoll.GetByName(list_collms[i], True, True)
        Variable.value = values[i]

    kPart.RebuildModel()
    # Перерисовываем документ
    iDocument3D.RebuildDocument()

    generated_files_path = os.path.join(settings.current_directory, "generated_files/")
    if not os.path.exists(generated_files_path):
        os.makedirs(generated_files_path)

    save_path = os.path.join(generated_files_path, file_name)

    kompas_document.SaveAs(save_path)
    kompas_document.Close(True)

    return save_path
