// Script JSX pour Photoshop : Création de fonds perdus avec repères verrouillés
// Copyright © 2024 Sébastien VTL
// License : 2024
// Version : 3.0
// Date : 2024-02-20
// Description : Créer des fonds perdus avec repères verrouillés

#target photoshop

// Fonction principale
function createBleed() {
    try {
        // Vérifier si les unités du document sont en millimètres ou centimètres
        if (app.preferences.rulerUnits !== Units.MM && app.preferences.rulerUnits !== Units.CM) {
            throw new Error("La configuration du document doit être en millimètres ou centimètres. Veuillez changer les unités avant d'exécuter ce script.");
        }

        // Créer une fenêtre de dialogue pour la sélection des dimensions et des options
        var settings = showSettingsDialog();
        if (!settings) return; // Si annulé, sortir

        // Obtenir la résolution du document actuel
        if (app.documents.length === 0) {
            throw new Error("Aucun document ouvert. Veuillez ouvrir un document pour exécuter ce script.");
        }

        var doc = app.activeDocument;
        var dpi = doc.resolution; // Résolution du document en DPI (pixels par pouce)
        var mmToPixels = function(mm) { return (mm / 25.4) * dpi; }; // Conversion mm -> pixels
        var cmToPixels = function(cm) { return (cm * 10) / 25.4 * dpi; }; // Conversion cm -> pixels

        // Calculer les dimensions en pixels en fonction des unités
        var bleedPixels, safeZonePixels;
        if (app.preferences.rulerUnits === Units.MM) {
            bleedPixels = mmToPixels(settings.bleedSize);
            safeZonePixels = mmToPixels(settings.safeZoneSize);
        } else if (app.preferences.rulerUnits === Units.CM) {
            bleedPixels = cmToPixels(settings.bleedSize / 10);
            safeZonePixels = cmToPixels(settings.safeZoneSize / 10);
        }

        // Ajuster le plan de travail
        resizeCanvasWithBleed(doc, bleedPixels);

        // Ajouter et verrouiller les repères
        addGuidesAndLock(doc, bleedPixels, safeZonePixels, doc.width, doc.height, settings.addCenterGuides);

        alert("Plan de travail ajusté et repères verrouillés avec les dimensions suivantes :\n" +
              "- Fond perdu : " + (settings.bleedSize * 10) + " mm\n" +
              "- Zone de protection : " + (settings.safeZoneSize * 10) + " mm\n" +
              (settings.addCenterGuides ? "- Repères centraux ajoutés\n" : "") +
              "\nVersion 3.0" +
              "\nScript Créé par Sébastien VTL.");
    } catch (e) {
        alert("Erreur : " + e.message);
    }
}

// Fonction pour afficher le menu de sélection avec option pour les repères centraux
function showSettingsDialog() {
    var dialog = new Window("dialog", "Paramètres de réglages");
    dialog.orientation = "column";

    // Section pour le fond perdu
    var bleedGroup = dialog.add("group");
    bleedGroup.add("statictext", undefined, "Fond perdu (en mm) :");
    var bleedDropdown = bleedGroup.add("dropdownlist", undefined, ["3", "4", "5"]);
    bleedDropdown.selection = 0;

    // Section pour la zone de protection
    var safeZoneGroup = dialog.add("group");
    safeZoneGroup.add("statictext", undefined, "Zone de protection (en mm) :");
    var safeZoneDropdown = safeZoneGroup.add("dropdownlist", undefined, ["3", "4", "5"]);
    safeZoneDropdown.selection = 0;

    // Option pour ajouter des repères centraux
    var centerGuideGroup = dialog.add("group");
    centerGuideGroup.add("checkbox", undefined, "Option repère centre document");
    var centerGuideCheckbox = centerGuideGroup.children[0];
    centerGuideCheckbox.value = false; // Désactivé par défaut

    // Boutons OK et Annuler
    var buttonGroup = dialog.add("group");
    buttonGroup.alignment = "center";
    var okButton = buttonGroup.add("button", undefined, "OK");
    var cancelButton = buttonGroup.add("button", undefined, "Annuler");

    cancelButton.onClick = function () { dialog.close(0); };
    okButton.onClick = function () { dialog.close(1); };

    if (dialog.show() !== 1) return null;

    return {
        bleedSize: parseFloat(bleedDropdown.selection.text) / 10, // Convertir 3, 4, 5 en 0.3, 0.4, 0.5
        safeZoneSize: parseFloat(safeZoneDropdown.selection.text) / 10,
        addCenterGuides: centerGuideCheckbox.value
    };
}

// Fonction pour ajuster le plan de travail
function resizeCanvasWithBleed(doc, bleedPixels) {
    var originalWidth = doc.width;
    var originalHeight = doc.height;
    doc.resizeCanvas(originalWidth + 2 * bleedPixels, originalHeight + 2 * bleedPixels, AnchorPosition.MIDDLECENTER);
}

// Fonction pour ajouter et verrouiller les repères
function addGuidesAndLock(doc, bleedPixels, safeZonePixels, width, height, addCenterGuides) {
    // Ajouter les repères
    var guides = [];
    
    // Repères du fond perdu
    guides.push(addGuide(doc, 0, "V"));
    guides.push(addGuide(doc, width, "V"));
    guides.push(addGuide(doc, 0, "H"));
    guides.push(addGuide(doc, height, "H"));

    // Repères des dimensions de base
    guides.push(addGuide(doc, bleedPixels, "V"));
    guides.push(addGuide(doc, width - bleedPixels, "V"));
    guides.push(addGuide(doc, bleedPixels, "H"));
    guides.push(addGuide(doc, height - bleedPixels, "H"));

    // Repères de la zone de protection
    guides.push(addGuide(doc, bleedPixels + safeZonePixels, "V"));
    guides.push(addGuide(doc, width - bleedPixels - safeZonePixels, "V"));
    guides.push(addGuide(doc, bleedPixels + safeZonePixels, "H"));
    guides.push(addGuide(doc, height - bleedPixels - safeZonePixels, "H"));

    
    // Ajouter les repères centraux si activé

    // Verrouiller les repères en verrouillant le document
    doc.guides.locked = true;
    doc.suspendHistory("Verrouillage des repères", function() {
        app.runMenuItem(stringIDToTypeID("lockGuides"));
    });
    
    if (addCenterGuides) {
        guides.push(addGuide(doc, width / 2, "V"));
        guides.push(addGuide(doc, height / 2, "H"));
    }

    // Verrouiller les repères
    doc.guides.locked = true;
}

// Fonction pour ajouter un repère
function addGuide(doc, position, orientation) {
    return doc.guides.add(orientation === "H" ? Direction.HORIZONTAL : Direction.VERTICAL, position);
}

// Exécuter la fonction principale
createBleed();
