"""
Generator PSD — Magnes podziekowanie na plastrze brzozy (Kwiaty, Wzor 8).

Szablon jest plaski (bez Smart Object). Warstwy tekstowe:
    doc."data"                       — data uroczystosci
    doc."<grupa>"."Dane"."imie_zenskie"  — imie panny mlodej (lewa)
    doc."<grupa>"."Dane"."imie_meskie"   — imie pana mlodego (prawa)

Wymaga: uruchomiony Adobe Photoshop, pakiet photoshop-python-api.

Uzycie:
    python magnes_slub_plaster_brzozy_kwiaty_wzor8.py --klient "Nowak" \\
        --imie_zenskie "Kasia" --imie_meskie "Jakub" --data "31.07.2025"
"""

import argparse
import os
import photoshop.api as ps


PROJEKT_DIR = os.path.join(
    "d:\\pomysloweprezenty.pl\\projekty\\ślub - magnesy",
    "Magnes podziękowanie dla gości weselnych na plastrze brzozy - Kwiaty Wzór 8",
)
SZABLON_PATH = os.path.join(
    PROJEKT_DIR,
    "Magnes podziękowanie dla gości weselnych na plastrze brzozy - Kwiaty Wzór 8.psd",
)
GOTOWE_DIR = os.path.join(PROJEKT_DIR, "_gotowe")

GRUPA_TOP = "<grupa>"
GRUPA_DANE = "Dane"


def change_text_preserve_position(layer, new_text):
    """Zmienia tekst warstwy zachowujac srodek bounding boxa."""
    b = [float(x) for x in layer.bounds]
    cx_before, cy_before = (b[0] + b[2]) / 2, (b[1] + b[3]) / 2

    layer.textItem.contents = new_text

    b2 = [float(x) for x in layer.bounds]
    cx_after, cy_after = (b2[0] + b2[2]) / 2, (b2[1] + b2[3]) / 2

    dx, dy = cx_before - cx_after, cy_before - cy_after
    if dx or dy:
        layer.translate(dx, dy)


def close_all_without_saving(app):
    while app.documents.length > 0:
        app.activeDocument.close(ps.SaveOptions.DoNotSaveChanges)


def generate(klient, imie_zenskie, imie_meskie, data):
    os.makedirs(GOTOWE_DIR, exist_ok=True)
    output_path = os.path.join(GOTOWE_DIR, f"{klient}.psd")

    app = ps.Application()
    doc = app.open(SZABLON_PATH)
    print(f"Otwarto szablon: {doc.name}")

    try:
        dane = doc.layerSets[GRUPA_TOP].layerSets[GRUPA_DANE]

        replacements = [
            (doc.artLayers["data"], data, "data"),
            (dane.artLayers["imie_zenskie"], imie_zenskie, "imie_zenskie"),
            (dane.artLayers["imie_meskie"], imie_meskie, "imie_meskie"),
        ]

        print("Podmiana tekstow:")
        for layer, new_text, label in replacements:
            old = layer.textItem.contents
            change_text_preserve_position(layer, new_text)
            print(f'  {label}: "{old}" -> "{new_text}"')

        psd_opts = ps.PhotoshopSaveOptions()
        app.activeDocument.saveAs(output_path, psd_opts, True)
        print(f"Zapisano: {output_path}")

        app.activeDocument.close(ps.SaveOptions.DoNotSaveChanges)
    except Exception:
        close_all_without_saving(app)
        raise

    print("Gotowe!")
    return output_path


def main():
    parser = argparse.ArgumentParser(
        description="Generator PSD - Magnes slubny na plastrze brzozy (Kwiaty Wzor 8)"
    )
    parser.add_argument("--klient", required=True, help="Nazwa pliku wyjsciowego (bez rozszerzenia)")
    parser.add_argument("--imie_zenskie", required=True, help="Imie panny mlodej (lewa strona)")
    parser.add_argument("--imie_meskie", required=True, help="Imie pana mlodego (prawa strona)")
    parser.add_argument("--data", required=True, help="Data uroczystosci (DD.MM.YYYY)")

    args = parser.parse_args()
    generate(
        klient=args.klient,
        imie_zenskie=args.imie_zenskie,
        imie_meskie=args.imie_meskie,
        data=args.data,
    )


if __name__ == "__main__":
    main()
