#!/usr/bin/env bash
# onx-file-chmod — Dosya/klasör izinlerini değiştir
# Input:  {"paths":["/home/onx_xxx/public_html/index.php"],"mode":"644","recursive":false}
# Output: {"changed":2,"mode":"0644"}

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/_lib/common.sh"

require_root
onx_json_input

# ─── Parse input ─────────────────────────────────────────────────────────────
MODE="$(onx_json_field mode)"
RECURSIVE="$(onx_json_get_bool "$INPUT" recursive false)"

[[ -z "$MODE" ]] && onx_die 1 "mode zorunlu"
[[ "$MODE" =~ ^0?[0-7]{3}$ ]] || onx_die 1 "Geçersiz mod: '${MODE}' (octal 3-4 basamak bekleniyor, örn: 755 veya 0755)"

# Normalise to 4-digit octal string
if [[ ${#MODE} -eq 3 ]]; then
    MODE="0${MODE}"
fi

PATHS_JSON="$(printf '%s' "$INPUT" | jq -c '.paths // []')"
mapfile -t PATHS < <(printf '%s' "$PATHS_JSON" | jq -r '.[]')

[[ ${#PATHS[@]} -eq 0 ]] && onx_die 1 "paths dizisi boş"

# ─── Validate and apply ───────────────────────────────────────────────────────
CHANGED=0

# D5-04: cross-account symlink koruması. username verilirse hesabın getent home'u
# sınırdır (symlink başka /home/users/<x>'e çözülse bile reddedilir); yoksa eski
# /home/* davranışına düşülür ama symlink yine reddedilir.
USERNAME="$(onx_json_field username)"
USER_HOME=""
if [[ -n "${USERNAME}" ]]; then
    USER_HOME="$(onx_resolve_home "${USERNAME}")" || onx_die 1 "kullanıcı home bulunamadı: ${USERNAME}"
    USER_HOME="${USER_HOME%/}"
fi

for p in "${PATHS[@]}"; do
    # Son bileşen symlink ise reddet (hedefe chmod ile başka hesabın iznini bozma/DoS).
    [[ -L "$p" ]] && onx_die 1 "symlink reddedildi: $p"
    real="$(realpath -e "$p" 2>/dev/null)" || onx_die 1 "Path çözümlenemedi: $p"
    if [[ -n "${USER_HOME}" ]]; then
        case "$real" in
            "${USER_HOME}"|"${USER_HOME}"/*) : ;;
            *) onx_die 1 "Path hesap home'u (${USER_HOME}) dışında: $real" ;;
        esac
    else
        [[ "$real" == /home/* ]] || onx_die 1 "Path /home/ dışında: $real"
    fi

    if [[ "$RECURSIVE" == "true" && -d "$real" ]]; then
        # ! -type l: alt-symlink HEDEFLERİNE chmod uygulanmasın (cross-account).
        find "$real" ! -type l -exec chmod "$MODE" {} \; \
            || onx_die 3 "chmod başarısız (recursive): $real"
        CHANGED=$((CHANGED + $(find "$real" ! -type l | wc -l)))
    else
        chmod "$MODE" "$real" || onx_die 3 "chmod başarısız: $real"
        CHANGED=$((CHANGED + 1))
    fi
done

onx_log "file-chmod: mode=${MODE} recursive=${RECURSIVE} changed=${CHANGED}"
onx_json_out changed "$CHANGED" mode "$MODE"
