import csv
import os
import docx
from docx.shared import Pt, Cm
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
import pandas as pd
import re
from docx.shared import Inches, Cm, Pt
from math import ceil
from pathlib import Path

def set_landscape(doc):
    """Устанавливает альбомную ориентацию и узкие поля"""
    section = doc.sections[0]
    new_width, new_height = section.page_height, section.page_width  # Меняем местами ширину и высоту
    section.page_width = new_width
    section.page_height = new_height
    section.top_margin = Cm(1)
    section.bottom_margin = Cm(1)
    section.left_margin = Cm(1)
    section.right_margin = Cm(1)

def set_two_columns(doc):
    """Разделяет текст на две колонки"""
    section = doc.sections[0]
    cols = section._sectPr.find(qn('w:cols'))
    if cols is None:
        cols = OxmlElement('w:cols')
        section._sectPr.append(cols)
    cols.set(qn('w:num'), '2')  # Устанавливаем две колонки

def insert_image(doc, image_path):
    """Вставляет изображение в начало документа"""
    para = doc.add_paragraph()
    run = para.add_run()
    run.add_picture(image_path, width=Cm(6))

def find_rows(csv_file, search_word):
    """Ищет строки в CSV, где 4-й столбец содержит search_word"""
    matched_rows = []
    with open(csv_file, newline='', encoding='utf-8') as file:
        reader = csv.reader(file, delimiter=';')  # Укажите нужный разделитель
        for row in reader:
            if search_word.lower() == row[5].lower():
                matched_rows.append(row)
    return matched_rows

def find_rows2(csv_file2, search_word):
    """Ищет строки в CSV, где 4-й столбец содержит search_word"""
    matched_rows2 = []
    with open(csv_file2, newline='', encoding='cp1251') as file:
        reader = csv.reader(file, delimiter=';')  # Укажите нужный разделитель
        for row in reader:
            if search_word.lower() == row[0].lower():
                matched_rows2.append(row)
    return matched_rows2

def set_column_widths(table, data):
    """Устанавливает ширину колонок на основе максимальной длины текста"""
    col_widths = [max(len(str(row[i])) for row in data) for i in range(len(data[0]))]  

    for i, width in enumerate(col_widths):
        for cell in table.columns[i].cells:
            cell.width = Cm(width * 0.2)  # Настройка ширины, можно подкорректировать


# Функция для проверки, начинается ли строка с числа
def starts_with_number(s):
    return bool(re.match(r'^\d', s))

def set_cell_text(cell, text, font_size, align, bold=False):
    paragraph = cell.paragraphs[0]
    run = paragraph.add_run(text)
    run.font.name = "Times New Roman"
    run.font.size = Pt(font_size)
    run.font.bold = bold
    paragraph.alignment = align
    paragraph.paragraph_format.space_after = Pt(0)

def add_bottom_border(cell):
    tc = cell._tc
    tcPr = tc.get_or_add_tcPr()
    tcBorders = OxmlElement('w:tcBorders')
    bottom = OxmlElement('w:bottom')
    bottom.set(qn('w:val'), 'single')
    bottom.set(qn('w:sz'), '6')
    bottom.set(qn('w:space'), '0')
    bottom.set(qn('w:color'), 'auto')
    tcBorders.append(bottom)
    tcPr.append(tcBorders)

def create_docx_from_csv(csv_path, search_word, output_path):
    """Создаёт новый DOCX с таблицей на основе данных из CSV"""
    rows = find_rows(csv_path, search_word)
    if not rows:
        print("Совпадений не найдено.")
        return
    
    unique = {}
    for i in range(40):
        unique[i] = set(row[i] for row in rows)  # Собираем уникальные значения

    #напряжение
    volts_string = ",".join(unique[10]).replace(" ", "")
    filtered_volts = set(volts_string.split(","))
    sorted_volts = sorted(filtered_volts, key=lambda x: int(x.rstrip('V')))

    first_name = ", ".join(unique[4])
    full_first_name = ", ".join(unique[5])
    folder_name = ", ".join(unique[3])
    print(folder_name)
    #цветтовая температура
    ct_string = ",".join(unique[12]).replace(" ", "")
    filtered_ct = set(ct_string.split(","))
    sorted_ct = sorted(filtered_ct, key=lambda x: (not starts_with_number(x), x))
    ct = ", ".join(sorted_ct)
    tw = ",".join(unique[23]).replace("TW", " Tunable White")
    cttw = f"{ct}{tw}"
    #вес/масса
    weight_values = {float(x) for x in unique[13]}
    min_weight = min(weight_values)
    max_weight = max(weight_values)
    weightdot = f"{min_weight} кг" if min_weight == max_weight else f"{min_weight} − {max_weight} кг"
    weight = weightdot.replace(".", ",")

    material = ", ".join(unique[15])

    #система управления
    system_string = ",".join(unique[17]).replace(" ", "")
    filtered_system = set(system_string.split(","))

    priority = {
    'On/Off': 0,
    'PWM': 1,
    '0-10V': 2,
    '1-10V': 1,
    'DALI': 3,
    'DMX-512': 4,
    'RDM': 5
    }

    sorted_system = sorted(filtered_system, key=lambda x: (priority.get(x, 2), x))
    sys = ", ".join(sorted_system).replace("external", "внешний блок питания")

    cri = ", ".join(unique[19])
    ip = ", ".join(unique[21])
    ik = ", ".join(unique[22])
    q1 = ", ".join(unique[25])
    a1 = ", ".join(unique[27])
    q2 = ", ".join(unique[29])
    a2 = ", ".join(unique[31])
    q3 = ", ".join(unique[33])
    a3 = ", ".join(unique[35])
    q4 = ", ".join(unique[37])
    a4 = ", ".join(unique[39])

    # Папка, где лежат изображения
    image_folder = './pics'  # Путь можно поменять

    color_mapping = {
    "Black": "Черный",
    "Grey": "Серый",
    "White": "Белый",
    "Metallic": "Металлик",
    "Silver": "Серебро",
    "Steel": "Сталь",
    "Mirrored steel": "Глянцевая сталь",
    "Brushed steel": "Матовая сталь",
    "Steel": "Металлик",
    "Brown": "Серый",
    "Red": "Красный",
    "Ochre": "Охра"
    }
    input_list = unique[16].pop().split(', ')
    # Применяем соответствия из словаря
    output_string = ', '.join([color_mapping.get(color, color) for color in input_list])
    
    # Определяем переменные
    if "220V" in sorted_volts:
        volts220 = "220\u00A0В"
        voltslow = sorted_volts.remove("220V")
    else:
        volts220 = None

    voltslow = "/".join(sorted_volts).replace("V", "\u00A0В") if sorted_volts else None
    volts_par4 = ", ".join(str(v) for v in [voltslow, volts220] if v)
    doc = docx.Document()
   
    set_landscape(doc)  # Устанавливаем альбомную ориентацию
    #insert_image(doc, image_path)  # Вставляем изображение (если нужно)
    set_two_columns(doc)  # Разделяем на две колонки

    if volts220 and not voltslow:
        class_value = "I классу"
        work = f"в сети переменного тока с номинальным напряжением {volts220}, частотой 50 Гц."
    elif not volts220 and voltslow:
        class_value = "III классу"
        work= f"в сети постоянного тока с номинальным напряжением {voltslow}."
    elif volts220 and voltslow:
        class_value = f"I классу ({volts220}) или III классу ({voltslow})"
        work = f"в сети постоянного тока с номинальным напряжением {voltslow}, либо в сети переменного тока с номинальным напряжением {volts220}, частотой 50 Гц."
    else:
        class_value = "Не определено"  # На случай, если обе переменные пусты
        work = "Не определено"  # На случай, если обе переменные пусты


    cable220dmx = None
    cablelowdmx = None
    cable220 = f"{volts220}: 3×0,75 мм²" if volts220 else None
    if cable220 is None:
        cablelow = f"{voltslow}: 2×1 мм²" if voltslow else None
    else:
        cablelow = f"\n{voltslow}: 2×1 мм²" if voltslow else None

    for row in rows:
        if len(row) > 6:  # Проверяем, есть ли 7-й элемент (индекс 6)
            words = row[6].split()  # Разбиваем 6-й элемент строки на слова
            if "RGB" in words or "RGВW" in words:
                if "220V" in words:
                    cable220dmx = ", DMX-512: 3×0,5 мм²"
                elif "24V/220V" in words:
                    cable220dmx = ", DMX-512: 3×0,5 мм²"
                    cablelowdmx = f" ({voltslow} + DMX-512: 5×0,5 мм²)"
                else:
                    cablelowdmx = f" ({voltslow} + DMX-512: 5×0,5 мм²)"
    
    cable = " ".join(filter(None, [cable220, cable220dmx, cablelow, cablelowdmx]))

    csv_path3 = 'pass2.csv'
    rows3 = find_rows2(csv_path3, folder_name)
    if not rows3:
        print(f"Нет данных в pass.csv для {search_word}")
        return
    descript = rows3[0][1]
    instruct = rows3[0][2]

    logo = doc.add_paragraph("\n")
    par_logo = logo.add_run()
    par_logo.add_picture("logo.jpg", width=Cm(6.5))  # Можно указать размеры
    logo.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
    title0 = doc.add_paragraph()
    title0.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
    name0 = title0.add_run("\nСВЕТИЛЬНИК СВЕТОДИОДНЫЙ\n")
    name0.font.name = "Times New Roman"
    name0.font.size = Pt(8)
    name0.bold = True
    name1 = title0.add_run(f"{rows[0][4]}\n")
    name1.font.name = "Times New Roman"
    name1.font.size = Pt(10)
    name1.underline = True
    name1.bold = True
    name2 = title0.add_run(" Паспорт и руководство по эксплуатации\n")
    name2.font.name = "Times New Roman"
    name2.font.size = Pt(8)
    name2.bold = True
    par1 = doc.add_paragraph()
    text1 = par1.add_run(f"1. Основные сведения об изделии")
    text1.bold = True
    par1_1 = doc.add_paragraph()
    par1_1.add_run(f"1.1. {descript}. Светильники соответствуют техническим регламентам таможенного союза ТР ТС 004/2011 и ТР ТС 020/2011, ГОСТ IEC 60598-1-2017, ГОСТ IEC 60598-2-1-2011, ГОСТ IEC 60598-2-3-2012.")
    par1_2 = doc.add_paragraph()
    text1_2 = par1_2.add_run(f"1.2. Светильники предназначены для работы {work}")
    par1_3 = doc.add_paragraph()
    text1_3 = par1_3.add_run(f"1.3. Светильники соответствуют {class_value} защиты от поражения электрическим током, ГОСТ IEC 60598-1-2017, в части воздействия механических факторов внешней среды – группе условий эксплуатации М1 по ГОСТ 30630.1.2-99.")
    par1_4 = doc.add_paragraph()
    text1_4 = par1_4.add_run(f"1.4. Номинальные значения климатических факторов по ГОСТ 15150-69 – УХЛ1, при этом значения климатических факторов принимаются следующими:")
    par1_41 = doc.add_paragraph()
    text1_41 = par1_41.add_run(f"- диапазон рабочих температур от −40⁰ до +50⁰ (при запуске −20⁰ до +45⁰);")
    par1_42 = doc.add_paragraph()
    text1_42 = par1_42.add_run(f"- предельные значения температур хранения составляют от −50⁰С до +50⁰С;")
    par1_43 = doc.add_paragraph()
    text1_43 = par1_43.add_run(f"- верхнее значение относительной влажности воздуха 100% при 25°С.")
    par1_5 = doc.add_paragraph()
    text1_5 = par1_5.add_run(f"1.5. Степень защиты оболочки светильников: IP{ip} по ГОСТ 14254-2015.")

    Tables = doc.add_paragraph()
    #Tables.paragraph_format.first_line_indent = Cm(1)
    paragr20 = Tables.add_run(f"2. Технические характеристики")
    paragr20.bold = True
    
    # Создаём таблицу1
    table = doc.add_table(rows=1, cols=7)
    table.style = "Table Grid"

    # Заголовки столбцов
    hdr_titles = ["Артикул", "Наименование", "Размер, мм", "Вес, кг", "Потребл. мощность", "Вход. напряжение", "Угол рассеивания"]
    hdr_cells = table.rows[0].cells
    for i, title in enumerate(hdr_titles):
        hdr_cells[i].text = title
        hdr_cells[i].paragraphs[0].runs[0].font.name = "Times New Roman"
        hdr_cells[i].paragraphs[0].runs[0].font.size = Pt(6)
        hdr_cells[i].paragraphs[0].runs[0].bold = True

    # Заполняем таблицу и собираем данные
    data = []  # Список для хранения строк данных
    for row in rows:
        data_row = [row[2], row[4] + ' ' + row[6], row[9], row[13], row[8].replace("W", "Вт"), row[10].replace(" V", "\u00A0В"), row[11].replace("diffused", "(рассеянный)").replace("beams", "(луча)")]  # Берём нужные столбцы
        data.append(data_row) # Добавляем в список
        tbl_row = table.add_row().cells
        
        for i, value in enumerate(data_row):
            para = tbl_row[i].paragraphs[0]
            run = para.add_run()
            
            if i == 1:  # Это столбец с full_name (row[4] + ' ' + row[6])
                run_bold = para.add_run(row[4] + ' ')
                run_bold.font.bold = True
                run_bold.font.name = "Times New Roman"
                run_bold.font.size = Pt(6)
                
                run_rest = para.add_run(row[7])
                run_rest.font.bold = False
                run_rest.font.name = "Times New Roman"
                run_rest.font.size = Pt(6)
            else:
                run.text = str(value)
                run.font.name = "Times New Roman"
                run.font.size = Pt(6)
            
    # Устанавливаем автоширину колонок
    set_column_widths(table, data)
    cri_tab = None

    if cri == 0 or cri == None or cri == "":  # Проверяем, что cri НЕ пустой и НЕ 0
        cri_tab = f"CRI >{cri}"
    else: cri_tab = None

    # Данные (переменная: значение)
    data2 = {
        "Корпус:": material,
        "Цвет корпуса:": output_string,
        "Механическая защита корпуса:": ik,
        "Цветовая температура:": cttw,
        "Индекс цветопередачи:": cri_tab,
        "Коэффициент мощности:": ">0.9",
        "Система управления:": sys,
        q1: a1,
        q2: a2,
        q3: a3,
        q4: a4,
        "Рабочая температура:": "−40⁰ ~ +50⁰ (при запуске −20⁰ ~ +45⁰)",
        "Ресурс работы светильника:": "не менее 50 000 ч",
        "Cечение проводов:": cable,
        "Вес:": weight
    }

    doc.add_paragraph("\u00A0")
    Tables2 = doc.add_paragraph()
    #Tables2.paragraph_format.first_line_indent = Cm(1)
    paragr21 = Tables2.add_run(f"2.1. Общие характеристики")
    # Создаём таблицу (колонки: Название, Значение)
    table2 = doc.add_table(rows=0, cols=2)
    table2.style = "Table Grid"
    table2.autofit = True

    # Добавляем строки только с непустыми значениями
    for key, value in data2.items():
        if value:  # Проверяем, что значение не None и не пустая строка
            row2_cells = table2.add_row().cells
            row2_cells[0].text = key  # Название параметра
            row2_cells[1].text = str(value)  # Значение

            row2_cells[0].width = Cm(5.5)

            # Применяем шрифт Times New Roman 8pt ко всем ячейкам строки
            for cell in row2_cells:
                for paragraph in cell.paragraphs:
                    for run in paragraph.runs:
                        run.font.name = "Times New Roman"
                        run.font.size = Pt(8)

    par_pics = doc.add_paragraph("\n")
    par_pics.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER

    liner_folder = os.path.join('.', 'drafts', folder_name)

    csv_path2 = 'desc_rus.csv'
    rows2 = find_rows2(csv_path2, folder_name)

    # Получаем список изображений с числами в имени
    supported_exts = ['.jpg', '.jpeg', '.png', '.bmp', '.gif', '.tiff']
    liner_images = []
    for fname in os.listdir(liner_folder):
        if Path(fname).suffix.lower() in supported_exts:
            match = re.search(r'(\d+)', fname)
            if match:
                order = int(match.group(1))
                liner_images.append((order, fname))

    # Сортируем изображения по числу
    liner_images.sort(key=lambda x: x[0])

    # Строим таблицу
    if liner_images:
        num_images = len(liner_images)
        num_cols = 2
        num_rows = ceil(num_images / num_cols)

        table3 = doc.add_table(rows=num_rows, cols=num_cols)
        table3.style = "Table Grid"
        table3.autofit = True

        img_index = 0
        for row in range(num_rows):
            # Проверка: последняя строка и нечётное число изображений
            is_last_row = (row == num_rows - 1)
            is_odd = (num_images % 2 != 0)
            one_image = (num_images == 1)

            if (is_last_row and is_odd) or one_image:
                # Объединяем ячейки в строке
                cell = table3.cell(row, 0).merge(table3.cell(row, 1))
                
                if img_index < num_images:
                    order, img_filename = liner_images[img_index]
                    img_path = os.path.join(liner_folder, img_filename)

                    # Вставка картинки
                    pic_paragraph = cell.paragraphs[0]
                    pic_paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
                    pic_run = pic_paragraph.add_run()
                    pic_run.add_picture(img_path, width=Cm(6))
                    pic_paragraph.paragraph_format.space_after = Pt(0)

                    # Подпись
                    raw_caption = rows2[0][img_index + 1]
                    caption = first_name if raw_caption == "0" else raw_caption
                    caption_paragraph = cell.add_paragraph(caption)
                    caption_paragraph.paragraph_format.space_after = Pt(0)
                    caption_paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
                    caption_run = caption_paragraph.runs[0]
                    caption_run.font.size = Pt(7)
                    caption_run.font.name = "Times New Roman"

                    img_index += 1
            else:
                # Стандартная вставка для строки из 2 изображений
                for col in range(num_cols):
                    cell = table3.cell(row, col)
                    if img_index < num_images:
                        order, img_filename = liner_images[img_index]
                        img_path = os.path.join(liner_folder, img_filename)

                        # Вставка картинки
                        pic_paragraph = cell.paragraphs[0]
                        pic_paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
                        pic_run = pic_paragraph.add_run()
                        pic_run.add_picture(img_path, width=Cm(6))
                        pic_paragraph.paragraph_format.space_after = Pt(0)

                        # Подпись
                        raw_caption = rows2[0][img_index + 1]
                        caption = first if raw_caption == "0" else raw_caption
                        caption_paragraph = cell.add_paragraph(caption)
                        caption_paragraph.paragraph_format.space_after = Pt(0)
                        caption_paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
                        caption_run = caption_paragraph.runs[0]
                        caption_run.font.size = Pt(7)
                        caption_run.font.name = "Times New Roman"

                        img_index += 1
                    else:
                        cell.text = ''

    doc.add_paragraph("\u00A0")
    par3 = doc.add_paragraph()
    text3 = par3.add_run(f"3. Комплектность поставки")
    text3.bold = True
    par3a = doc.add_paragraph()
    text3a = par3a.add_run(f"Светильник – 1 шт.")
    par3b = doc.add_paragraph()
    text3b = par3b.add_run(f"Паспорт и Руководство по эксплуатации – 1 шт.")
    par3c = doc.add_paragraph()
    text3c = par3c.add_run(f"Упаковка – 1 шт.")
    par4 = doc.add_paragraph()
    text4 = par4.add_run(f"4. Указания по эксплуатации и мерам безопасности")
    text4.bold = True
    par4_1 = doc.add_paragraph()
    text4_1a = par4_1.add_run(f"Эксплуатация светильников должна производиться в соответствии с «Правилами технической эксплуатации электроустановок потребителей» и настоящим Паспортом и Руководством по эксплуатации. Перед установкой светильника необходимо убедиться в соответствии напряжения питающей сети ")
    text4_1b = par4_1.add_run(f"{volts_par4}.")
    par4a= doc.add_paragraph()
    text4a = par4a.add_run(f"ВНИМАНИЕ! ЗАПРЕЩАЕТСЯ МОНТИРОВАТЬ, ДЕМОНТИРОВАТЬ СВЕТИЛЬНИК ПРИ ВКЛЮЧЁННОМ НАПРЯЖЕНИИ!")
    text4a.bold = True
    par4_2 = doc.add_paragraph()
    text4_2 = par4_2.add_run(f"4.2. Запрещается эксплуатация светильников с поврежденной изоляцией проводов и мест электрических соединений.")
    par4_3 = doc.add_paragraph()
    text4_3 = par4_3.add_run(f"4.3. Запрещается самостоятельно разбирать и ремонтировать светильник.")
    par4_4 = doc.add_paragraph()
    text4_4 = par4_4.add_run(f"4.4. Запрещается применение химически активных веществ, абразивных средств и материалов.")
    par5= doc.add_paragraph()
    text5= par5.add_run(f"5. В случае обнаружения неисправности")
    text5.bold = True
    par5a = doc.add_paragraph()
    text5a = par5a.add_run(f"В случае обнаружения неисправности необходимо отключить светильник от сети, демонтировать и обратиться в авторизированный сервис центр, для устранения неисправности. Попытка несанкционированного вмешательства в конструкцию светильника ведет к снятию гарантийных обязательств производителя.")
    par6= doc.add_paragraph()
    text6= par6.add_run(f"6. Подготовка изделия к работе и установка светильников")
    text6.bold = True
    par6a = doc.add_paragraph()
    text6a = par6a.add_run(f"ВНИМАНИЕ! ПЕРЕД УСТАНОВКОЙ СВЕТИЛЬНИКА УБЕДИТЕСЬ В ТОМ, ЧТО СЕТЕВОЕ НАПРЯЖЕНИЕ ОТКЛЮЧЕНО!")
    text6a.bold = True
    par6b= doc.add_paragraph()
    text6b = par6b.add_run(f"Перед монтажом освободить светильник от упаковки и ознакомиться с настоящим руководством.")
    par6c= doc.add_paragraph()
    text6c = par6c.add_run(f"ВНИМАНИЕ! Сетевые провода, подводимые к светильникам, не должны своим весом создавать силовую нагрузку на кабельный ввод.")
    par6_1= doc.add_paragraph()
    text6_1 = par6_1.add_run(f"6.1.  Монтаж светильников.")
    par6_1a= doc.add_paragraph()
    text6_1a = par6_1a.add_run(f"{instruct}.")
    par7 = doc.add_paragraph()
    text7 = par7.add_run(f"7. Техническое обслуживание светильников")
    text7.bold = True
    par7_1= doc.add_paragraph()
    text7_1 = par7_1.add_run(f"7.1. В процессе эксплуатации необходимо не реже двух раз в год проводить профилактический осмотр и чистку светильника. Проверить исправность электроустановочных изделий и надежность крепления болтовых и винтовых соединений. Чистку защитного стекла и корпуса светильника производить мягкой ветошью, смоченной в мыльном растворе.")
    par7_2= doc.add_paragraph()
    text7_2 = par7_2.add_run(f"7.2. Эксплуатация светильника с треснувшим или иначе поврежденным защитным стеклом или корпусом не допускается, поврежденные элементы необходимо заменить.")
    par8 = doc.add_paragraph()
    text8 = par8.add_run(f"8. Свидетельство об упаковывании")
    text8.bold = True

    table_t1 = doc.add_table(rows=2, cols=5)
    table_t1.autofit = False

    col_widths1 = [Cm(4), Cm(0.4), Cm(4), Cm(0.4), Cm(3.5)]

    for row_t1 in table_t1.rows:
        row_t1.height = Pt(1)  # минимально возможное значение (можно 0.1, но Word округлит)
        for idx, cell in enumerate(row_t1.cells):
            if idx < len(col_widths1):
                cell.width = col_widths1[idx]

    set_cell_text(table_t1.rows[0].cells[0], f"{first_name}", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT, bold=True)
    add_bottom_border(table_t1.rows[0].cells[0])
    set_cell_text(table_t1.rows[0].cells[1], f"\u00A0", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT)
    set_cell_text(table_t1.rows[0].cells[2], f"\u00A0", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT)
    add_bottom_border(table_t1.rows[0].cells[2])
    set_cell_text(table_t1.rows[0].cells[3], f"\u00A0", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT)
    set_cell_text(table_t1.rows[0].cells[4], f"\u00A0", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT)
    add_bottom_border(table_t1.rows[0].cells[4])

    set_cell_text(table_t1.rows[1].cells[0], f"наименование изделия", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)
    set_cell_text(table_t1.rows[1].cells[1], f"\u00A0", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)
    set_cell_text(table_t1.rows[1].cells[2], f"обозначение", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)
    set_cell_text(table_t1.rows[1].cells[3], f"\u00A0", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)
    set_cell_text(table_t1.rows[1].cells[4], f"заводской номер", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)

    par8 = doc.add_paragraph()
    text8 = par8.add_run(f"\u00A0")
    text8.font.size = Pt(1)

    table_t2 = doc.add_table(rows=2, cols=2)
    table_t2.autofit = False

    col_widths2 = [Cm(1.6), Cm(10.7)]
    
    for row_t2 in table_t2.rows:
        row_t2.height = Pt(1)  # минимально возможное значение (можно 0.1, но Word округлит)
        for idx, cell in enumerate(row_t2.cells):
            if idx < len(col_widths2):
                cell.width = col_widths2[idx]

    set_cell_text(table_t2.rows[0].cells[0], f"упакован", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT)
    set_cell_text(table_t2.rows[0].cells[1], f"\u00A0", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT)
    add_bottom_border(table_t2.rows[0].cells[1])

    set_cell_text(table_t2.rows[1].cells[0], f"\u00A0", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)
    set_cell_text(table_t2.rows[1].cells[1], f"наименование или код изготовителя", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)


    par8d = doc.add_paragraph()
    text8e = par8d.add_run(f"согласно требованиям, предусмотренным в действующей технической документации.")
    text8e.font.size = Pt(8)
    text8e.font.name = "Times New Roman"
  
    table_t3= doc.add_table(rows=2, cols=7)
    table_t3.autofit = False

    col_widths3 = [Cm(2.5), Cm(0.2), Cm(3), Cm(0.2), Cm(3), Cm(0.2), Cm(2.6)]

    for row_t3 in table_t3.rows:
        row_t3.height = Pt(1)  # минимально возможное значение (можно 0.1, но Word округлит)
        for idx, cell in enumerate(row_t3.cells):
            if idx < len(col_widths3):
                cell.width = col_widths3[idx]

    set_cell_text(table_t3.rows[0].cells[0], f"Упаковщик", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT)
    add_bottom_border(table_t3.rows[0].cells[0])
    set_cell_text(table_t3.rows[0].cells[1], f"\u00A0", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT)
    set_cell_text(table_t3.rows[0].cells[2], f"\u00A0", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT)
    add_bottom_border(table_t3.rows[0].cells[2])
    set_cell_text(table_t3.rows[0].cells[3], f"\u00A0", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT)
    set_cell_text(table_t3.rows[0].cells[4], f"\u00A0", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT)
    add_bottom_border(table_t3.rows[0].cells[4])
    set_cell_text(table_t3.rows[0].cells[5], f"\u00A0", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT)
    set_cell_text(table_t3.rows[0].cells[6], f"\u00A0", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT)
    add_bottom_border(table_t3.rows[0].cells[6])

    set_cell_text(table_t3.rows[1].cells[0], f"должность", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)
    set_cell_text(table_t3.rows[1].cells[1], f"\u00A0", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)
    set_cell_text(table_t3.rows[1].cells[2], f"личная подпись", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)
    set_cell_text(table_t3.rows[1].cells[3], f"\u00A0", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)
    set_cell_text(table_t3.rows[1].cells[4], f"расшифровка подписи", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)
    set_cell_text(table_t3.rows[1].cells[5], f"\u00A0", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)
    set_cell_text(table_t3.rows[1].cells[6], f"год, месяц, число", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)

    
    par9 = doc.add_paragraph()
    text9 = par9.add_run(f"\n9. Свидетельство о приемке")
    text9.bold = True
    text9.font.size = Pt(8)

    table_t4 = doc.add_table(rows=2, cols=5)
    table_t4.autofit = False

    col_widths4 = [Cm(4), Cm(0.4), Cm(4), Cm(0.4), Cm(3.5)]

    for row_t4 in table_t4.rows:
        row_t4.height = Pt(1)  # минимально возможное значение (можно 0.1, но Word округлит)
        for idx, cell in enumerate(row_t4.cells):
            if idx < len(col_widths4):
                cell.width = col_widths4[idx]

    set_cell_text(table_t4.rows[0].cells[0], f"{first_name}", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT, bold=True)
    add_bottom_border(table_t4.rows[0].cells[0])
    set_cell_text(table_t4.rows[0].cells[1], f"\u00A0", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT)
    set_cell_text(table_t4.rows[0].cells[2], f"\u00A0", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT)
    add_bottom_border(table_t4.rows[0].cells[2])
    set_cell_text(table_t4.rows[0].cells[3], f"\u00A0", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT)
    set_cell_text(table_t4.rows[0].cells[4], f"\u00A0", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT)
    add_bottom_border(table_t4.rows[0].cells[4])

    set_cell_text(table_t4.rows[1].cells[0], f"наименование изделия", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)
    set_cell_text(table_t4.rows[1].cells[1], f"\u00A0", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)
    set_cell_text(table_t4.rows[1].cells[2], f"обозначение", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)
    set_cell_text(table_t4.rows[1].cells[3], f"\u00A0", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)
    set_cell_text(table_t4.rows[1].cells[4], f"заводской номер", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)

    par9b = doc.add_paragraph()
    text9c = par9b.add_run(f"изготовлен и принят в соответствии с обязательными требованиями государственных стандартов, действующих технической документацией и признан годным для эксплуатации")
    text9c.font.size = Pt(8)
    text9c.font.name = "Times New Roman"

    par9d = doc.add_paragraph()
    par9d.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
    text9d = par9d.add_run(f"Начальник ОТК")
    text9d.font.size = Pt(8)
    text9d.font.name = "Times New Roman"
    text9d.bold = True

    table_t5 = doc.add_table(rows=2, cols=4)
    table_t5.autofit = False

    col_widths5 = [Cm(2), Cm(3.5), Cm(1), Cm(3.5)]

    for row_t5 in table_t5.rows:
        row_t5.height = Pt(1)  # минимально возможное значение (можно 0.1, но Word округлит)
        for idx, cell in enumerate(row_t5.cells):
            if idx < len(col_widths5):
                cell.width = col_widths5[idx]

    set_cell_text(table_t5.rows[0].cells[0], f"МП", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.CENTER)
    set_cell_text(table_t5.rows[0].cells[1], f"\u00A0", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT)
    add_bottom_border(table_t5.rows[0].cells[1])
    set_cell_text(table_t5.rows[0].cells[2], f"\u00A0", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT)
    set_cell_text(table_t5.rows[0].cells[3], f"\u00A0", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT)
    add_bottom_border(table_t5.rows[0].cells[3])

    set_cell_text(table_t5.rows[1].cells[0], f"\u00A0", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)
    set_cell_text(table_t5.rows[1].cells[1], f"личная подпись", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)
    set_cell_text(table_t5.rows[1].cells[2], f"\u00A0", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)
    set_cell_text(table_t5.rows[1].cells[3], f"расшифровка подписи", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)

    par9e = doc.add_paragraph()
    text9e = par9e.add_run(f"\u00A0")
    text9e.font.size = Pt(1)

    table_t6 = doc.add_table(rows=2, cols=3)
    table_t6.autofit = False

    col_widths6 = [Cm(3), Cm(0.4), Cm(3.5)]

    for row_t6 in table_t6.rows:
        row_t6.height = Pt(1)  # минимально возможное значение (можно 0.1, но Word округлит)
        for idx, cell in enumerate(row_t6.cells):
            if idx < len(col_widths6):
                cell.width = col_widths6[idx]

    set_cell_text(table_t6.rows[0].cells[0], f"Дата изготовления", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT, bold=True)
    set_cell_text(table_t6.rows[0].cells[1], f"\u00A0", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT)
    set_cell_text(table_t6.rows[0].cells[2], f"\u00A0", font_size=8, align=WD_PARAGRAPH_ALIGNMENT.LEFT)
    add_bottom_border(table_t6.rows[0].cells[2])

    set_cell_text(table_t6.rows[1].cells[0], f"\u00A0", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)
    set_cell_text(table_t6.rows[1].cells[1], f"\u00A0", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)
    set_cell_text(table_t6.rows[1].cells[2], f"год, месяц, число", font_size=6, align=WD_PARAGRAPH_ALIGNMENT.CENTER)

    par9x = doc.add_paragraph()
    text9x = par9x.add_run(f"Сведения о цене и реализации")
    text9x.bold = True
    par9x1 = doc.add_paragraph()
    par9x1.add_run(f"Цена договорная")
    par9x2 = doc.add_paragraph()
    par9x2.add_run(f"Особые требования по реализации не установлены")
    par10 = doc.add_paragraph()
    text10 = par10.add_run(f"10. Гарантийные обязательства")
    text10.bold = True
    par10_1 = doc.add_paragraph()
    text10_1 = par10_1.add_run(f"10.1. Гарантийный срок эксплуатации светильника составляет 60 месяцев со дня продажи Покупателю. В случае неисправности светильника в течение гарантийного срока Производитель обязуется провести безвозмездный ремонт или замену светильника при соблюдении Покупателем условий хранения, транспортирования и эксплуатации светильника, описанных в настоящем Паспорте и Руководстве по Эксплуатации. В случае обнаружения неисправности светильника до истечения гарантийного срока следует обратиться к Производителю по адресу: ")
    par10_1a = doc.add_paragraph()
    text10_1a = par10_1a.add_run(f"г. Москва, ул. Проезд Аэропорта, 8.")
    text10_1a.bold = True
    par10_1b = doc.add_paragraph()
    text10_1b = par10_1b.add_run(f"Телефон сервисной службы: +7 495 901-01-91, www.grosslux.ru, e-mail: info@grosslux.ru.")
    text10_1b.bold = True
    par10_1c = doc.add_paragraph()
    text10_1c = par10_1c.add_run(f"Для ремонта или замены светильника в период гарантийного срока требуется предоставить рекламацию с указанием условий, при которых была выявлена неисправность, и предъявить само изделие с Паспортом Производителю или авторизованному им сервисному центру.")
    par10_2 = doc.add_paragraph()
    text10_2 = par10_2.add_run(f"10.2. Гарантия не распространяется на следующие случаи:")
    par10_2a = doc.add_paragraph()
    text10_2a = par10_2a.add_run(f"- наличие механических повреждений;")
    par10_2b = doc.add_paragraph()
    text10_2b = par10_2b.add_run(f"- отсутствие настоящего Паспорта и Руководства по эксплуатации;")
    par10_2c = doc.add_paragraph()
    text10_2c = par10_2c.add_run(f"- воздействие на светильник химически активных веществ;")
    par10_2d = doc.add_paragraph()
    text10_2d = par10_2d.add_run(f"- воздействие на светильник абразивных средств и материалов;")
    par10_2e = doc.add_paragraph()
    text10_2e = par10_2e.add_run(f"- проведение ремонта светильника Покупателем или третьими лицами, кроме авторизованных Производителем.")
    par10_2f = doc.add_paragraph()
    text10_2f = par10_2f.add_run(f"- нарушение условий хранения, транспортирования и эксплуатации светильника.")
    par10_3 = doc.add_paragraph()
    text10_3 = par10_3.add_run(f"10.3. При отсутствии штампа торгующей организации срок гарантии исчисляется со дня выпуска изделия Производителем, указанным в настоящем Паспорте и Руководстве по эксплуатации.")
    par11 = doc.add_paragraph()
    text11 = par11.add_run(f"11. Сведения об упаковке, транспортировании и хранении.")
    text11.bold = True
    par11_1 = doc.add_paragraph()
    text11_1 = par11_1.add_run(f"11.1. Упаковка, хранение, транспортирование светильников должны соответствовать требованиям ГОСТ 23216.")
    par11_2 = doc.add_paragraph()
    text11_2 = par11_2.add_run(f"11.2. Светильники транспортируются в упаковке любым крытым видом транспорта. Во время погрузки, транспортирования и выгрузки светильников с транспортного средства должны быть приняты меры защиты светильников от механических повреждений и непосредственного воздействия нефтепродуктов, агрессивных сред и атмосферных осадков.")
    par11_3 = doc.add_paragraph()
    text11_3 = par11_3.add_run(f"11.3. Хранение светильников в упаковке допускается на стеллажах в закрытых сухих помещениях в условиях, исключающих воздействие нефтепродуктов и агрессивных сред, на расстоянии не менее одного метра от отопительных и нагревательных приборов. Температура хранения от −50 до +60ºС при относительной влажности воздуха не более 85%.")
    par12 = doc.add_paragraph()
    text12 = par12.add_run(f"12 Утилизация")
    text12.bold = True
    par12a = doc.add_paragraph()
    text12a = par12a.add_run(f"Светильник не содержит токсичных материалов, а также комплектующих, приносящих вред окружающей среде. Утилизацию светильника проводить обычным способом.")

    for para in doc.paragraphs:
    # Устанавливаем отступ первой строки (1 см)
        para.paragraph_format.first_line_indent = Cm(1)
        para.paragraph_format.space_after = Pt(3)
        # Устанавливаем межстрочный интервал (1.5)
        para.paragraph_format.line_spacing = 1.15
        for run in para.runs:
            run.font.size = Pt(8)
            run.font.name = "Times New Roman"

    par8d.paragraph_format.first_line_indent = Cm(0)
    par9b.paragraph_format.first_line_indent = Cm(0)

    doc.core_properties.author = "GROSSLUX"
    doc_name = f"{full_first_name} паспорт.docx"
    doc.save(doc_name)
    print(f"Документ сохранён как {doc_name}")
    os.startfile(doc_name)

# Использование
csv_file = "data.csv"  # Укажите путь к CSV
search_word = input("Введите слово для поиска: ")
output_file = "паспорт.docx"

create_docx_from_csv(csv_file, search_word, output_file)