#!/usr/bin/env python3
"""
Génère le fichier Excel du questionnaire à envoyer pour l'import.

Usage :
    python tools/generate_questionnaire_import.py
    python tools/generate_questionnaire_import.py -o "C:\\Users\\...\\Questionnaire-import-copro.xlsx"
"""
from __future__ import annotations

import argparse
import sys
from pathlib import Path

TOOLS_DIR = Path(__file__).resolve().parent
ROOT = TOOLS_DIR.parent
sys.path.insert(0, str(TOOLS_DIR))

from questionnaire_import_data import SECTIONS  # noqa: E402


def _require_openpyxl():
    try:
        import openpyxl
        from openpyxl.styles import Alignment, Font, PatternFill
        from openpyxl.utils import get_column_letter
        from openpyxl.worksheet.datavalidation import DataValidation
    except ImportError:
        print("openpyxl requis : pip install openpyxl", file=sys.stderr)
        sys.exit(1)
    return openpyxl, Alignment, Font, PatternFill, get_column_letter, DataValidation


def generate(output: Path) -> None:
    openpyxl, Alignment, Font, PatternFill, get_column_letter, DataValidation = _require_openpyxl()

    wb = openpyxl.Workbook()

    # --- Mode d'emploi ---
    ws_info = wb.active
    ws_info.title = "Mode d emploi"
    instructions = [
        "QUESTIONNAIRE IMPORT — copro_gestion",
        "",
        "Bonjour,",
        "",
        "Ce fichier permet de préparer l'import de votre Excel actuel dans l'application.",
        "",
        "1. Allez sur l'onglet « Réponses ».",
        "2. Remplissez la colonne « Réponse » (menus déroulants quand proposés).",
        "3. Utilisez « Commentaire » pour préciser (ex. numéros de lots, exceptions).",
        "4. Renvoyez ce fichier rempli (mail ou dossier partagé).",
        "",
        "Fichier Excel source concerné :",
        "  Liste Copropriétaires et Occupants 05-06-2026.xlsx",
        "",
        "Merci !",
    ]
    for i, line in enumerate(instructions, 1):
        ws_info.cell(row=i, column=1, value=line)
    ws_info.column_dimensions["A"].width = 72
    ws_info["A1"].font = Font(bold=True, size=14)

    # --- Réponses ---
    ws = wb.create_sheet("Réponses")
    headers = ["id", "section", "question", "type", "reponse", "commentaire"]
    header_fill = PatternFill("solid", fgColor="1E3A5F")
    header_font = Font(bold=True, color="FFFFFF")

    for col, h in enumerate(headers, 1):
        cell = ws.cell(row=1, column=col, value=h)
        cell.fill = header_fill
        cell.font = header_font
        cell.alignment = Alignment(horizontal="center", vertical="center", wrap_text=True)

    row = 2
    validations: list[tuple[str, list[str]]] = []

    for section in SECTIONS:
        titre = section["titre"]
        for item in section["questions"]:
            qid = item[0]
            label = item[1]
            qtype = item[2]
            choices = item[3] if len(item) > 3 else None

            ws.cell(row=row, column=1, value=qid)
            ws.cell(row=row, column=2, value=titre)
            ws.cell(row=row, column=3, value=label)
            ws.cell(row=row, column=4, value=qtype)

            if qtype == "oui_non":
                validations.append((f"E{row}", ["Oui", "Non", "Je ne sais pas"]))
            elif qtype == "choix" and choices:
                validations.append((f"E{row}", list(choices) + ["Je ne sais pas"]))

            for c in range(1, 7):
                ws.cell(row=row, column=c).alignment = Alignment(
                    vertical="top", wrap_text=True
                )
            row += 1

    # Listes de validation (feuille cachée)
    ws_lists = wb.create_sheet("_listes")
    ws_lists.sheet_state = "hidden"
    list_col = 1
    for cell_ref, options in validations:
        col_letter = get_column_letter(list_col)
        for i, opt in enumerate(options, 1):
            ws_lists.cell(row=i, column=list_col, value=opt)
        formula = f"='_listes'!${col_letter}$1:${col_letter}${len(options)}"
        dv = DataValidation(type="list", formula1=formula, allow_blank=True)
        dv.error = "Choisissez une valeur dans la liste"
        dv.errorTitle = "Réponse"
        ws.add_data_validation(dv)
        dv.add(ws[cell_ref])
        list_col += 1

    ws.freeze_panes = "A2"
    widths = {"A": 28, "B": 22, "C": 52, "D": 10, "E": 36, "F": 40}
    for col, w in widths.items():
        ws.column_dimensions[col].width = w
    ws.row_dimensions[1].height = 28

    output.parent.mkdir(parents=True, exist_ok=True)
    wb.save(output)
    print(f"Questionnaire généré : {output}")
    print(f"  {row - 2} questions sur l'onglet « Réponses »")


def main() -> None:
    parser = argparse.ArgumentParser(description="Génère le questionnaire Excel d'import")
    parser.add_argument(
        "-o",
        "--output",
        type=Path,
        default=ROOT / "docs" / "Questionnaire-import-copro.xlsx",
        help="Fichier Excel de sortie",
    )
    args = parser.parse_args()
    generate(args.output.resolve())


if __name__ == "__main__":
    main()
