/*
QuickToolsPanel.jsx
Dockable ScriptUI Panel for Quick Layer Creation, Keyframing, and Effect Application
*/

(function (thisObj) {
function buildUI(thisObj) {
var pal = (thisObj instanceof Panel) ? thisObj : new Window("palette", "Quick Tools", undefined, { resizeable: true });
if (pal === null) return pal;

// Root Layout
pal.orientation = "column";
pal.alignChildren = ["fill", "top"];
pal.spacing = 8;
pal.margins = 10;

// --- HEADER ---
var headerGrp = pal.add("group");
headerGrp.orientation = "vertical";
headerGrp.alignChildren = ["center", "center"];
headerGrp.alignment = ["fill", "top"];
var title = headerGrp.add("statictext", undefined, "QUICK TOOLS");
title.graphics.font = ScriptUI.newFont("Tahoma", "BOLD", 12);

// --- LAYER CREATION PANEL ---
var layerGroup = pal.add("panel", undefined, "Create Layers");
layerGroup.orientation = "column";
layerGroup.alignChildren = ["fill", "top"];
layerGroup.alignment = ["fill", "top"];
layerGroup.spacing = 6;

var btnWhiteSolid = layerGroup.add("button", undefined, "Add White Solid");
var btnBlackSolid = layerGroup.add("button", undefined, "Add Black Solid");
var btnAdj = layerGroup.add("button", undefined, "Add Adjustment Layer");
var btnNull = layerGroup.add("button", undefined, "Add Null");

// --- KEYFRAMES & UTILITIES PANEL ---
var animGroup = pal.add("panel", undefined, "Animation Tools");
animGroup.orientation = "column";
animGroup.alignChildren = ["fill", "top"];
animGroup.alignment = ["fill", "top"];
animGroup.spacing = 6;

var btnFade = animGroup.add("button", undefined, "Add Opacity Fade In/Out");

// --- EFFECTS PANEL ---
var fxGroup = pal.add("panel", undefined, "Apply Effects");
fxGroup.orientation = "column";
fxGroup.alignChildren = ["fill", "top"];
fxGroup.alignment = ["fill", "top"];
fxGroup.spacing = 6;

var btnBlur = fxGroup.add("button", undefined, "Gaussian Blur");
var btnGlow = fxGroup.add("button", undefined, "Glow");
var btnCurves = fxGroup.add("button", undefined, "Curves");
var btnHueSat = fxGroup.add("button", undefined, "Hue / Saturation");

// --- HELPER FUNCTIONS ---

function getActiveComp() {
var comp = app.project.activeItem;
if (!comp || !(comp instanceof CompItem)) {
alert("Please select or open an active composition.");
return null;
}
return comp;
}

function applyEffectToSelected(matchName, displayName) {
var comp = getActiveComp();
if (!comp) return;

var selectedLayers = comp.selectedLayers;
if (selectedLayers.length === 0) {
alert("Please select at least one layer to apply " + displayName + ".");
return;
}

app.beginUndoGroup("Apply " + displayName);
for (var i = 0; i < selectedLayers.length; i++) {
var layer = selectedLayers[i];
var effects = layer.property("ADBE Effect Parade");
try {
effects.addProperty(matchName);
} catch (e1) {
try {
effects.addProperty(displayName);
} catch (e2) {
alert("Could not apply " + displayName + " to layer: " + layer.name);
}
}
}
app.endUndoGroup();
}

// --- BUTTON ACTIONS ---

// 1. Add White Solid
btnWhiteSolid.onClick = function () {
var comp = getActiveComp();
if (!comp) return;

app.beginUndoGroup("Add White Solid");
comp.layers.addSolid([1, 1, 1], "White Solid", comp.width, comp.height, comp.pixelAspect, comp.duration);
app.endUndoGroup();
};

// 2. Add Black Solid
btnBlackSolid.onClick = function () {
var comp = getActiveComp();
if (!comp) return;

app.beginUndoGroup("Add Black Solid");
comp.layers.addSolid([0, 0, 0], "Black Solid", comp.width, comp.height, comp.pixelAspect, comp.duration);
app.endUndoGroup();
};

// 3. Add Adjustment Layer
btnAdj.onClick = function () {
var comp = getActiveComp();
if (!comp) return;

app.beginUndoGroup("Add Adjustment Layer");
var adj = comp.layers.addSolid([1, 1, 1], "Adjustment Layer", comp.width, comp.height, comp.pixelAspect, comp.duration);
adj.adjustmentLayer = true;
app.endUndoGroup();
};

// 4. Add Null
btnNull.onClick = function () {
var comp = getActiveComp();
if (!comp) return;

app.beginUndoGroup("Add Null Layer");
comp.layers.addNull();
app.endUndoGroup();
};

// 5. Add Fade In / Fade Out Keyframes
btnFade.onClick = function () {
var comp = getActiveComp();
if (!comp) return;

var selectedLayers = comp.selectedLayers;
if (selectedLayers.length === 0) {
alert("Please select at least one layer to add fade keyframes.");
return;
}

app.beginUndoGroup("Add Opacity Fade Keyframes");
for (var i = 0; i < selectedLayers.length; i++) {
var layer = selectedLayers[i];
var opacityProp = layer.property("ADBE Transform Group").property("ADBE Opacity");

var inTime = layer.inPoint;
var outTime = layer.outPoint;
var layerDuration = outTime - inTime;

var fadeInEndTime = inTime + 1.0;
var fadeOutStartTime = outTime - 2.0;

// Handles layers shorter than 3 seconds proportionally
if (layerDuration < 3.0) {
fadeInEndTime = inTime + (layerDuration * 0.33);
fadeOutStartTime = inTime + (layerDuration * 0.67);
}

opacityProp.setValueAtTime(inTime, 0);
opacityProp.setValueAtTime(fadeInEndTime, 100);
opacityProp.setValueAtTime(fadeOutStartTime, 100);
opacityProp.setValueAtTime(outTime, 0);
}
app.endUndoGroup();
};

// 6. Add Gaussian Blur
btnBlur.onClick = function () {
applyEffectToSelected("ADBE Gaussian Blur 2", "Gaussian Blur");
};

// 7. Add Glow
btnGlow.onClick = function () {
applyEffectToSelected("ADBE Glo2", "Glow");
};

// 8. Add Curves
btnCurves.onClick = function () {
applyEffectToSelected("ADBE CurvesCustom", "Curves");
};

// 9. Add Hue / Saturation
btnHueSat.onClick = function () {
applyEffectToSelected("ADBE Hue Saturation", "Hue/Saturation");
};

// --- RESPONSIVE LAYOUT BINDINGS ---
pal.onResized = function () {
pal.layout.resize();
};

pal.layout.layout(true);
return pal;
}

var myPanel = buildUI(thisObj);
if (myPanel instanceof Window) {
myPanel.center();
myPanel.show();
}
})(this);