#!/bin/bash

CONFIG="/home/filebrowser/config"
source "$CONFIG"

# ==================== SHOW ====================

show_system() {
  echo "=== Системные пользователи ==="
  getent passwd | awk -F: '$3 >= 1000 && $3 < 65534 {print $1}'
}

show_samba() {
  echo "=== Samba ==="
  pdbedit -L | cut -d: -f1
}

show_filebrowser() {
  echo "=== Filebrowser ==="
  systemctl stop filebrowser.service
  filebrowser users ls -d "$FB_DB" 2>/dev/null | tail -n +3 | awk '{print $2}'
  systemctl start filebrowser.service
}

show_jellyfin() {
  echo "=== Jellyfin ==="
  curl -s "$JF_URL/Users" \
    -H "X-Emby-Token: $JF_API_KEY" | \
    python3 -c "import sys,json; [print(u['Name']) for u in json.load(sys.stdin)]"
}

show_all() {
  show_system
  echo ""
  show_samba
  echo ""
  show_filebrowser
  echo ""
  show_jellyfin
}

# ==================== PASSWORD ====================

get_password() {
  local pass1 pass2
  while true; do
    read -s -p "Новый пароль: " pass1 >&2
    echo "" >&2
    read -s -p "Повтори пароль: " pass2 >&2
    echo "" >&2
    if [ "$pass1" = "$pass2" ]; then
      printf '%s' "$pass1"
      return
    fi
    echo "Пароли не совпадают, попробуй ещё раз" >&2
  done
}

passwd_samba() {
  local username="$1"
  local password="$2"
  echo "$password" | smbpasswd -s -a "$username"
  smbpasswd -e "$username"
}

passwd_filebrowser() {
  local username="$1"
  local password="$2"
  systemctl stop filebrowser.service
  filebrowser users update "$username" --password "$password" -d "$FB_DB"
  systemctl start filebrowser.service
}

passwd_jellyfin() {
  local username="$1"
  local password="$2"
  local user_id
  user_id=$(curl -s "$JF_URL/Users" \
    -H "X-Emby-Token: $JF_API_KEY" | \
    python3 -c "import sys,json; users=json.load(sys.stdin); [print(u['Id']) for u in users if u['Name']=='$username']")
  if [ -z "$user_id" ]; then
    echo "Пользователь $username не найден в Jellyfin"
    return 1
  fi
  curl -s -X POST "$JF_URL/Users/$user_id/Password" \
    -H "X-Emby-Token: $JF_API_KEY" \
    -H "Content-Type: application/json" \
    -d "{\"NewPw\": \"$password\"}"
  echo "Пароль в Jellyfin обновлён"
}

edit_user() {
  local service="$1"
  local username="$2"
  local password
  password=$(get_password)
  case "$service" in
    smb) passwd_samba "$username" "$password" ;;
    fb)  passwd_filebrowser "$username" "$password" ;;
    jf)  passwd_jellyfin "$username" "$password" ;;
    *)
      echo "Неизвестный сервис: $service"
      exit 1
      ;;
  esac
}

# ==================== ADD USER ====================

get_jf_libraries() {
  curl -s "$JF_URL/Library/VirtualFolders" \
    -H "X-Emby-Token: $JF_API_KEY" | \
    python3 -c "import sys,json; [print(f['ItemId']) for f in json.load(sys.stdin)]"
}

add_to_system() {
  local username="$1"
  if id "$username" &>/dev/null; then
    echo ">>> Системный пользователь $username уже существует, пропускаем"
  else
    useradd -M -s /sbin/nologin "$username"
    usermod -aG nasusers "$username"
    echo ">>> Системный пользователь $username создан"
  fi
}

add_to_samba() {
#  local username="$1"
#  local password="$2"
#  if pdbedit -L | grep -q "^$username:"; then
#    echo ">>> Пользователь $username уже есть в Samba, пропускаем"
#  else
#    echo "$password" | smbpasswd -s -a "$username"
#    smbpasswd -e "$username"
#    echo ">>> Пользователь $username добавлен в Samba"
#  fi
  local username="$1"
  local password="$2"
  if pdbedit -L | grep -q "^$username:"; then
    echo ">>> Пользователь $username уже есть в Samba, пропускаем"
  else
    # Сначала создаём системную запись в passdb
    pdbedit -a -u "$username" -t << EOF > /dev/null 2>&1
$password
$password
EOF
    smbpasswd -e "$username"
    echo ">>> Пользователь $username добавлен в Samba"
  fi
}

add_to_filebrowser() {
  local username="$1"
  local password="$2"
  systemctl stop filebrowser.service
  if filebrowser users ls -d "$FB_DB" 2>/dev/null | grep -q "$username"; then
    echo ">>> Пользователь $username уже есть в Filebrowser, пропускаем"
  else
    filebrowser users add "$username" "$password" \
      --scope "$username" \
      --perm.create \
      --perm.modify \
      --perm.delete \
      --perm.rename \
      --perm.download \
      --perm.share \
      -d "$FB_DB"
    echo ">>> Пользователь $username добавлен в Filebrowser"
  fi
  systemctl start filebrowser.service
}

add_to_jellyfin() {
  local username="$1"
  local password="$2"

  local exists
  exists=$(curl -s "$JF_URL/Users" \
    -H "X-Emby-Token: $JF_API_KEY" | \
    python3 -c "import sys,json; users=json.load(sys.stdin); print(any(u['Name']=='$username' for u in users))")

  if [ "$exists" = "True" ]; then
    echo ">>> Пользователь $username уже есть в Jellyfin, пропускаем"
    return
  fi

  local result
  result=$(curl -s -X POST "$JF_URL/Users/New" \
    -H "X-Emby-Token: $JF_API_KEY" \
    -H "Content-Type: application/json" \
    -d "{\"Name\": \"$username\", \"Password\": \"$password\"}")

  local user_id
  user_id=$(echo "$result" | python3 -c "import sys,json; print(json.load(sys.stdin)['Id'])")

  if [ -z "$user_id" ]; then
    echo ">>> Ошибка создания пользователя $username в Jellyfin"
    return 1
  fi

  echo ">>> Пользователь $username добавлен в Jellyfin (id: $user_id)"
}

create_homedir() {
  local username="$1"
  local user_dir="$BASE_DIR/$username"

  if [ -d "$user_dir" ]; then
    echo ">>> Каталог $user_dir уже существует, пропускаем"
  else
    mkdir -p "$user_dir"
    chown root:nasusers "$user_dir"
    chmod 2770 "$user_dir"
    setfacl -d -m g:nasusers:rwx "$user_dir"
    setfacl -d -m o::0 "$user_dir"
    echo ">>> Каталог $user_dir создан с ACL"
  fi
}

add_user() {
  local username="$1"
  local password
  password=$(get_password)

  echo ""
  echo ">>> Добавляем пользователя $username..."
  echo ""

  add_to_system "$username"
  create_homedir "$username"
  add_to_samba "$username" "$password"
  add_to_filebrowser "$username" "$password"
  add_to_jellyfin "$username" "$password"

  echo ""
  echo ">>> Готово! Пользователь $username создан во всех системах"
}

# ==================== USAGE ====================

usage() {
  echo "Использование: $0 <команда> [аргументы]"
  echo ""
  echo "Команды:"
  echo "  list [сервис]              показать пользователей (system|smb|fb|jf|all)"
  echo "  passwd <сервис> <user>     сменить пароль пользователя"
  echo "  add <username>             добавить пользователя во все системы"
  echo ""
  echo "Примеры:"
  echo "  $0 list"
  echo "  $0 list jf"
  echo "  $0 passwd smb xalex"
  echo "  $0 passwd fb mammy"
  echo "  $0 add newuser"
}

# ==================== MAIN ====================

case "${1}" in
  list)
    case "${2:-all}" in
      system) show_system ;;
      smb)    show_samba ;;
      fb)     show_filebrowser ;;
      jf)     show_jellyfin ;;
      all)    show_all ;;
      *)      echo "Неизвестный сервис: $2"; usage; exit 1 ;;
    esac
    ;;
  passwd)
    if [ -z "$2" ] || [ -z "$3" ]; then
      echo "Использование: $0 passwd <сервис> <username>"
      exit 1
    fi
    edit_user "$2" "$3"
    ;;
  add)
    if [ -z "$2" ]; then
      echo "Использование: $0 add <username>"
      exit 1
    fi
    add_user "$2"
    ;;
  -h|--help)
    usage
    ;;
  *)
    echo "Неизвестная команда: $1"
    usage
    exit 1
    ;;
esac
