import os
import sys
import glob
import re
import shutil
import docx
from docx.shared import Inches, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml import OxmlElement, parse_xml
from docx.oxml.ns import nsdecls, qn

try:
    sys.stdout.reconfigure(encoding='utf-8')
except AttributeError:
    pass

# ─────────────────────────── HELPERS ───────────────────────────

def set_cell_background(cell, fill_hex):
    tcPr = cell._tc.get_or_add_tcPr()
    shd = parse_xml(f'<w:shd {nsdecls("w")} w:fill="{fill_hex}"/>')
    tcPr.append(shd)

def set_cell_margins(cell, top=100, bottom=100, left=150, right=150):
    tcPr = cell._tc.get_or_add_tcPr()
    tcMar = OxmlElement('w:tcMar')
    for m, val in [('top', top), ('bottom', bottom), ('left', left), ('right', right)]:
        node = OxmlElement(f'w:{m}')
        node.set(qn('w:w'), str(val))
        node.set(qn('w:type'), 'dxa')
        tcMar.append(node)
    tcPr.append(tcMar)

def set_cell_border(cell, **kwargs):
    tcPr = cell._tc.get_or_add_tcPr()
    tcBorders = tcPr.first_child_found_in("w:tcBorders")
    if tcBorders is None:
        tcBorders = OxmlElement('w:tcBorders')
        tcPr.append(tcBorders)
    for edge in ('top', 'left', 'bottom', 'right', 'insideH', 'insideV'):
        edge_data = kwargs.get(edge)
        if edge_data:
            tag = f'w:{edge}'
            element = tcBorders.find(qn(tag))
            if element is None:
                element = OxmlElement(tag)
                tcBorders.append(element)
            for key, val in edge_data.items():
                element.set(qn(f'w:{key}'), str(val))

# ─────────────────────────── PARSE DOCX ───────────────────────────

def parse_docx_content(docx_path):
    """Parse DOCX → list of {type, text/data}"""
    doc = docx.Document(docx_path)
    content = []
    for element in doc.element.body:
        if element.tag.endswith('p'):
            p = docx.text.paragraph.Paragraph(element, doc)
            text = p.text.strip()
            if text:
                content.append({"type": "paragraph", "text": text, "style": p.style.name})
        elif element.tag.endswith('tbl'):
            table = docx.table.Table(element, doc)
            rows_data = []
            for row in table.rows:
                row_cells = [cell.text.strip().replace('\n', ' ') for cell in row.cells]
                rows_data.append(row_cells)
            content.append({"type": "table", "data": rows_data})
    return content

# ─────────────────────────── DETECT SUPPLIER ───────────────────────────

SUPPLIER_KEYWORDS = {
    "WANGSAN": ["wangsan", "wang san", "gzwangsanchem", "swanchemical"],
    "KETIAN": ["ketian", "4212", "2202"],
    "AIREX": ["airex", "920", "phá bọt", "pha bot"],
    "BOSSIN": ["bossin", "dpha", "dipentaerythritol", "hexaacrylate"],
    "ALLNEX": ["allnex", "setal", "uvekol"],
    "PHOENIX": ["phoenix", "alkyphoenix", "s77"],
    "SUZE": ["suze", "ds-1095"],
}

def detect_supplier_from_file(docx_path):
    """Detect supplier name from file filename + content."""
    basename = os.path.basename(docx_path).upper()
    # Check filename first
    for supplier, keywords in SUPPLIER_KEYWORDS.items():
        for kw in keywords:
            if kw.upper() in basename:
                return supplier
    # Fallback: scan content (first 1000 chars)
    try:
        content = parse_docx_content(docx_path)
        text_block = " ".join(item['text'] for item in content if item['type'] == 'paragraph')[:2000].upper()
        for supplier, keywords in SUPPLIER_KEYWORDS.items():
            for kw in keywords:
                if kw.upper() in text_block:
                    return supplier
    except Exception:
        pass
    return "UNKNOWN"

# ─────────────────────────── GENERATE DOCX ───────────────────────────

def generate_docx_summary(dest_path, supplier_name, reports_data):
    print(f"Creating styled Word report at: {dest_path}")
    doc = docx.Document()
    for section in doc.sections:
        section.top_margin = Inches(1.0)
        section.bottom_margin = Inches(1.0)
        section.left_margin = Inches(1.0)
        section.right_margin = Inches(1.0)

    style_normal = doc.styles['Normal']
    style_normal.font.name = 'Arial'
    style_normal.font.size = Pt(11)
    style_normal.font.color.rgb = RGBColor(0x33, 0x33, 0x33)

    # Title
    p_title = doc.add_paragraph()
    p_title.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run_title = p_title.add_run(f"BÁO CÁO TỔNG HỢP\nKẾT QUẢ THỬ NGHIỆM NGUYÊN LIỆU MỚI ({supplier_name})")
    run_title.font.name = 'Arial'
    run_title.font.size = Pt(18)
    run_title.font.bold = True
    run_title.font.color.rgb = RGBColor(0x1B, 0x36, 0x5D)

    p_meta = doc.add_paragraph()
    p_meta.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run_meta = p_meta.add_run("Báo cáo tự động tổng hợp từ dữ liệu phòng Lab R&D")
    run_meta.font.size = Pt(10)
    run_meta.font.italic = True
    run_meta.font.color.rgb = RGBColor(0x55, 0x55, 0x55)
    p_meta.paragraph_format.space_after = Pt(24)

    # Reports
    h2 = doc.add_heading(level=1)
    r_h2 = h2.add_run("CHI TIẾT CÁC THỬ NGHIỆM PHÒNG LAB R&D")
    r_h2.font.bold = True
    r_h2.font.size = Pt(14)
    r_h2.font.color.rgb = RGBColor(0x1B, 0x36, 0x5D)

    for report in reports_data:
        h2_sub = doc.add_heading(level=2)
        r_sub = h2_sub.add_run(f"{report['index']}. {report['title']}")
        r_sub.font.bold = True
        r_sub.font.size = Pt(12)
        r_sub.font.color.rgb = RGBColor(0x2C, 0x5E, 0x8A)

        for item in report['elements']:
            if item['type'] == 'paragraph':
                text = item['text']
                if text.startswith('#'):
                    text = text.replace('#', '').strip()
                    p = doc.add_paragraph()
                    p.add_run(text).font.bold = True
                else:
                    doc.add_paragraph(text)
            elif item['type'] == 'table':
                tbl_data = item['data']
                if not tbl_data or not tbl_data[0]:
                    continue
                table = doc.add_table(rows=len(tbl_data), cols=len(tbl_data[0]))
                table.alignment = WD_TABLE_ALIGNMENT.CENTER
                for r_idx, row_cells in enumerate(tbl_data):
                    bg = "2C5E8A" if r_idx == 0 else ("F7F9FA" if r_idx % 2 == 0 else "FFFFFF")
                    for c_idx, text in enumerate(row_cells):
                        if c_idx < len(table.rows[r_idx].cells):
                            cell = table.rows[r_idx].cells[c_idx]
                            cell.text = text
                            set_cell_background(cell, bg)
                            set_cell_margins(cell, top=80, bottom=80, left=100, right=100)
                            set_cell_border(cell, bottom={"sz": 4, "val": "single", "color": "E0E0E0"})
                            p = cell.paragraphs[0]
                            p.runs[0].font.size = Pt(9)
                            if r_idx == 0:
                                p.runs[0].font.bold = True
                                p.runs[0].font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
                doc.add_paragraph("")

    doc.save(dest_path)

# ─────────────────────────── GENERATE MARKDOWN ───────────────────────────

def generate_markdown_summary(dest_path, supplier_name, reports_data):
    """Create a comprehensive .md summary of all tests for this supplier."""
    print(f"Creating Markdown report at: {dest_path}")
    with open(dest_path, 'w', encoding='utf-8') as f:
        f.write(f"# BÁO CÁO TỔNG HỢP NGUYÊN LIỆU MỚI: {supplier_name}\n\n")
        f.write("> **Tổng hợp tự động từ dữ liệu phòng Lab R&D**\n")
        f.write(f"> **Nhà cung cấp:** {supplier_name}\n")
        f.write(f"> **Số báo cáo:** {len(reports_data)}\n")
        f.write(f"> **Ngày tổng hợp:** {os.path.basename(dest_path).split('_')[0] if '_' in os.path.basename(dest_path) else ''}\n\n")
        f.write("---\n\n")

        for report in reports_data:
            f.write(f"## {report['index']}. {report['title']}\n\n")
            for item in report['elements']:
                if item['type'] == 'paragraph':
                    text = item['text']
                    if text.startswith('#'):
                        level = len(text.split()[0])  # count #
                        clean = text.replace('#', '').strip()
                        f.write(f"{'#' * min(level, 4)} {clean}\n\n")
                    else:
                        f.write(f"{text}\n\n")
                elif item['type'] == 'table':
                    tbl = item['data']
                    if not tbl:
                        continue
                    for r_idx, row in enumerate(tbl):
                        f.write("| " + " | ".join(row) + " |\n")
                        if r_idx == 0:
                            f.write("| " + " | ".join(["---"] * len(row)) + " |\n")
                    f.write("\n")
            f.write("---\n\n")

# ─────────────────────────── MAIN ───────────────────────────

def run_synthesis(dir_path):
    print(f"Scanning directory: {dir_path}")

    # Gather .docx files (skip tổng hợp, skill.md, script)
    all_docx = sorted(glob.glob(os.path.join(dir_path, "*.docx")))
    docx_files = [
        f for f in all_docx
        if "TỔNG HỢP" not in os.path.basename(f).upper()
    ]

    if not docx_files:
        print("No trial report files found (.docx). Nothing to do.")
        return

    # Group files by supplier
    supplier_groups = {}  # supplier_name → [file_paths]
    for f in docx_files:
        supplier = detect_supplier_from_file(f)
        supplier_groups.setdefault(supplier, []).append(f)
        print(f"  {os.path.basename(f)} → {supplier}")

    for supplier_name, files in supplier_groups.items():
        print(f"\n=== Processing: {supplier_name} ({len(files)} files) ===")

        # Build reports_data from all files for this supplier
        reports_data = []
        for idx, r_path in enumerate(files, start=1):
            filename = os.path.basename(r_path)
            elements = parse_docx_content(r_path)

            # Clean boilerplate
            clean_elements = []
            for el in elements:
                if el['type'] == 'paragraph':
                    if "PHÒNG RD" in el['text'] or el['text'].startswith("BÁO CÁO KẾT QUẢ"):
                        continue
                clean_elements.append(el)

            reports_data.append({
                "index": idx,
                "title": filename.replace(".docx", ""),
                "elements": clean_elements
            })

        # ── Generate output files ──
        md_output = os.path.join(dir_path, f"BÁO CÁO TỔNG HỢP NGUYÊN LIỆU MỚI {supplier_name}.md")
        docx_output = os.path.join(dir_path, f"BÁO CÁO TỔNG HỢP NGUYÊN LIỆU MỚI {supplier_name}.docx")

        generate_markdown_summary(md_output, supplier_name, reports_data)
        generate_docx_summary(docx_output, supplier_name, reports_data)

        # ── Create supplier folder ──
        supplier_dir = os.path.join(dir_path, supplier_name)
        os.makedirs(supplier_dir, exist_ok=True)

        # ── Copy files to supplier folder ──
        files_to_copy = list(files) + [md_output, docx_output, os.path.abspath(__file__)]
        for f in files_to_copy:
            if os.path.exists(f):
                dest_file = os.path.join(supplier_dir, os.path.basename(f))
                try:
                    shutil.copy2(f, dest_file)
                    print(f"  Copied {os.path.basename(f)} → {supplier_dir}/")
                except Exception as e:
                    print(f"  Error copying {os.path.basename(f)}: {e}")

        # ── Clean up root: delete copied files and generated reports ──
        for f in files_to_copy:
            if f != os.path.abspath(__file__) and os.path.exists(f) and os.path.dirname(f) == dir_path:
                try:
                    os.remove(f)
                    print(f"  Deleted from root: {os.path.basename(f)}")
                except Exception as e:
                    print(f"  Error deleting {os.path.basename(f)}: {e}")

    print("\n✅ Synthesis Completed Successfully!")


if __name__ == '__main__':
    workspace_dir = r"c:\antigra-DS\CLAW_LAM_VIEC\Nghien cuu\Nguyen-Lieu-Moi (NLM)"
    run_synthesis(workspace_dir)
