import os
import pandas as pd
from openpyxl import load_workbook
import pyautogui
import time
import subprocess

SOURCE_TABLE = r'13. ВВОД в ПКЗО/Исходные данные для программы/Исходная таблица.xlsx'
MIF_FOLDER = r'13. ВВОД в ПКЗО/Исходные данные для программы/все миф/'
RESULT_TABLE = r'13. ВВОД в ПКЗО/Итоговая таблица пример.xlsx'

ERRORS = {
    'нет миф': 'НЕТ МИФ',
    'площадь': 'площадь',
    'нет кн': 'НЕТ КН',
    'нет выписки': 'НЕТ ВЫПИСКИ',
    'вид он': 'ВИД ОН',
    'тип': 'ТИП',
}

class DataLoader:
    def __init__(self, source_table, mif_folder):
        self.source_table = source_table
        self.mif_folder = mif_folder
        self.df = pd.read_excel(self.source_table)

    def find_mif_file(self, kn):
        kn_variants = [
            kn.replace(':', ' '),
            kn.replace(':', '_'),
            kn.replace(':', ''),
        ]
        for name in os.listdir(self.mif_folder):
            for variant in kn_variants:
                if variant in name and name.lower().endswith('.mif'):
                    return os.path.join(self.mif_folder, name)
        return None

    def get_mif_area(self, mif_path):
        # Заглушка: возвращает None
        return None

    def make_comment(self, row):
        doc = str(row['Реквизиты и наименование документов - обоснование опр.границ']).strip()
        if not doc.endswith('.'):
            doc += '.'
        comment = doc + ' ' + str(row['Пояснения по границам']).strip()
        return comment

    def check_pkzo(self, kn, vid_on, type_on):
        # Заглушка: всегда возвращает True
        return True, True, True, True

class PKZOAutomator:
    def __init__(self, pkzo_path=None):
        self.pkzo_path = pkzo_path or r'C:\Program Files\PKZO\pkzo.exe'

    def start_pkzo(self):
        if os.path.exists(self.pkzo_path):
            subprocess.Popen(self.pkzo_path)
            time.sleep(10)
        else:
            print('ПКЗО не найден, запустите вручную.')

    def automate_object(self, row, mif_path, comment):
        time.sleep(2)
        pyautogui.hotkey('ctrl', 'f')
        time.sleep(0.5)
        pyautogui.typewrite(str(row['КН']))
        pyautogui.press('enter')
        time.sleep(1)
        pyautogui.rightClick()
        time.sleep(0.5)
        pyautogui.typewrite(['down', 'down', 'enter'])
        time.sleep(0.5)
        pyautogui.typewrite(mif_path)
        pyautogui.press('enter')
        time.sleep(1)
        pyautogui.rightClick()
        time.sleep(0.5)
        pyautogui.typewrite(['down', 'enter'])
        time.sleep(0.5)
        if str(row['Тип']).strip().lower() == 'уточнение':
            pyautogui.typewrite('уточняемый')
        else:
            pyautogui.typewrite('исправляемый')
        pyautogui.press('enter')
        time.sleep(1)
        pyautogui.doubleClick()
        time.sleep(0.5)
        pyautogui.typewrite(['tab', 'tab'])
        pyautogui.typewrite(comment)
        pyautogui.press('enter')
        time.sleep(1)

def main():
    loader = DataLoader(SOURCE_TABLE, MIF_FOLDER)
    automator = PKZOAutomator()
    automator.start_pkzo()
    results = []
    for idx, row in loader.df.iterrows():
        kn = str(row['КН']).strip()
        vid_on = str(row['Вид ОН']).strip()
        s_table = row['S определенная, кв.м.']
        type_on = str(row['Тип']).strip().lower()
        errors = []
        result = 'загружено'
        mif_path = loader.find_mif_file(kn)
        if not mif_path:
            result = 'не загружено'
            errors.append(ERRORS['нет миф'])
        else:
            if vid_on == 'ЗУ':
                s_mif = loader.get_mif_area(mif_path)
                if s_mif is not None and round(s_mif) != round(s_table):
                    result = 'не загружено'
                    errors.append(ERRORS['площадь'])
            pkzo_kn, pkzo_vyp, pkzo_vid, pkzo_type = loader.check_pkzo(kn, vid_on, type_on)
            if not pkzo_kn:
                result = 'не загружено'
                errors.append(ERRORS['нет кн'])
            if not pkzo_vyp:
                result = 'не загружено'
                errors.append(ERRORS['нет выписки'])
            if not pkzo_vid:
                result = 'не загружено'
                errors.append(ERRORS['вид он'])
            if not pkzo_type:
                result = 'не загружено'
                errors.append(ERRORS['тип'])
            if result == 'загружено' and not errors:
                comment = loader.make_comment(row)
                automator.automate_object(row, mif_path, comment)
        comment = loader.make_comment(row)
        results.append({
            **row,
            'Результат загрузки': result,
            'Причина незагрузки': ', '.join(errors),
            'Площадь по МИФ': None,
            'Пояснения': comment,
        })
    result_df = pd.DataFrame(results)
    result_df.to_excel(RESULT_TABLE, index=False)

if __name__ == '__main__':
    main()
