#!/bin/bash

# ==========================================
# Fonctions utilitaires
# ==========================================

echo "AVANT D UTILISER VOIR LE PB DU FAIT QUE CA FAIT A LA SUITE AU LIEU DE DOUBLER LES NUM EXISTANT"
echo "Ex E01 => E01-E02 / E02 => E03-E04 / E04 => E07-E08 actuellement E05-E06"
exit

# Extrait le nom de la série depuis un nom de fichier.
# Exemple :
#   "Adventure Time - S02E01.mkv" -> "Adventure Time"
extract_series_name() {
    local filename="$1"
    local basename="${filename%.*}"

    if [[ "$basename" =~ ^(.+)[[:space:]]-[[:space:]]S[0-9]{1,2}E[0-9]{1,3} ]]; then
        echo "${BASH_REMATCH[1]}"
    fi
}

# Extrait le numéro de saison depuis un nom de fichier.
# Exemple :
#   "Adventure Time - S02E01.mkv" -> "2"
extract_season() {
    local filename="$1"

    if [[ "$filename" =~ [Ss]([0-9]{1,2})[Ee][0-9]{1,3} ]]; then
        # Supprime les zéros initiaux (02 -> 2)
        echo $((10#${BASH_REMATCH[1]}))
    fi
}

# Retourne la valeur si tous les éléments sont identiques.
# Sinon retourne une chaîne vide.
get_uniform_value() {
    local values=("$@")
    local first="${values[0]}"

    [ -z "$first" ] && return 1

    for value in "${values[@]}"; do
        [ "$value" != "$first" ] && return 1
    done

    echo "$first"
}

# Demande une valeur non vide à l'utilisateur.
# Si une valeur par défaut est fournie, Entrée seule l'utilise.
prompt_required() {
    local label="$1"
    local default="$2"
    local value

    while true; do
        if [ -n "$default" ]; then
            read -rp "$label [$default] : " value
            value="${value:-$default}"
        else
            read -rp "$label : " value
        fi

        if [ -n "$value" ]; then
            echo "$value"
            return
        fi

        echo "Cette valeur est obligatoire."
    done
}

# Génère le nouveau nom de fichier.
generate_filename() {
    local index="$1"
    local original_file="$2"

    local extension="${original_file##*.}"
    local ep1=$((index * 2 - 1))
    local ep2=$((index * 2))

    printf "%s - S%02dE%02d-E%02d.%s" \
        "$SERIE" "$SAISON" "$ep1" "$ep2" "$extension"
}

# Demande confirmation.
confirm() {
    local response
    read -rp "Continuer ? [y/N] : " response
    [[ "$response" =~ ^[Yy]$ ]]
}

# ==========================================
# Recherche des fichiers
# ==========================================

shopt -s nullglob
FILES=( *.* )

if [ ${#FILES[@]} -eq 0 ]; then
    echo "Aucun fichier trouvé dans : $(pwd)"
    exit 1
fi

# ==========================================
# Détection automatique
# ==========================================

SERIES_FOUND=()
SEASONS_FOUND=()

for file in "${FILES[@]}"; do
    series="$(extract_series_name "$file")"
    season="$(extract_season "$file")"

    [ -n "$series" ] && SERIES_FOUND+=("$series")
    [ -n "$season" ] && SEASONS_FOUND+=("$season")
done

DEFAULT_SERIE="$(get_uniform_value "${SERIES_FOUND[@]}")"
DEFAULT_SAISON="$(get_uniform_value "${SEASONS_FOUND[@]}")"

# ==========================================
# Informations de détection
# ==========================================

echo "Répertoire courant : $(pwd)"
echo "Nombre de fichiers trouvés : ${#FILES[@]}"
echo

if [ -z "$DEFAULT_SERIE" ]; then
    echo "Le nom de série n'a pas pu être détecté de manière uniforme."
else
    echo "Nom de série détecté : $DEFAULT_SERIE"
fi

if [ -z "$DEFAULT_SAISON" ]; then
    echo "Le numéro de saison n'a pas pu être détecté de manière uniforme."
else
    echo "Saison détectée : $DEFAULT_SAISON"
fi

echo

# ==========================================
# Saisie utilisateur
# ==========================================

SERIE="$(prompt_required "Nom de la série" "$DEFAULT_SERIE")"
SAISON="$(prompt_required "Numéro de saison" "$DEFAULT_SAISON")"

# Validation numérique
if ! [[ "$SAISON" =~ ^[0-9]+$ ]]; then
    echo "Le numéro de saison doit être un entier positif."
    exit 1
fi

# ==========================================
# Aperçu
# ==========================================

FIRST_FILE="${FILES[0]}"
FIRST_NEW_NAME="$(generate_filename 1 "$FIRST_FILE")"

echo
echo "Exemple de renommage :"
echo "  '$FIRST_FILE'"
echo "    ->"
echo "  '$FIRST_NEW_NAME'"
echo

# ==========================================
# Confirmation
# ==========================================

if ! confirm; then
    echo "Opération annulée."
    exit 0
fi

# ==========================================
# Renommage
# ==========================================

echo
echo "Renommage en cours..."

INDEX=1

for file in "${FILES[@]}"; do
    new_name="$(generate_filename "$INDEX" "$file")"

    if [ -e "$new_name" ]; then
        echo "Ignoré (fichier existant) : '$new_name'"
    else
        mv -- "$file" "$new_name"
        echo "'$file' -> '$new_name'"
    fi

    ((INDEX++))
done

echo
echo "Terminé."