#!/usr/bin/env bash
set -u

APP_NAME="FakeDiscord"
DEFAULT_ROOM="FakeDiscord"
DEFAULT_PASSWORD="HelldiversDissidents"

CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
CONFIG_DIR="$CONFIG_HOME/fakediscord"
NICK_FILE="$CONFIG_DIR/nick"
DEFAULT_TINCAN="$HOME/.local/lib/fakediscord/tincan"

mkdir -p "$CONFIG_DIR"

find_tincan() {
    if [[ -n "${FAKEDISCORD_TINCAN:-}" && -x "$FAKEDISCORD_TINCAN" ]]; then
        printf '%s\n' "$FAKEDISCORD_TINCAN"
        return 0
    fi
    if [[ -x "$DEFAULT_TINCAN" ]]; then
        printf '%s\n' "$DEFAULT_TINCAN"
        return 0
    fi
    if command -v tincan >/dev/null 2>&1; then
        command -v tincan
        return 0
    fi
    return 1
}

TINCAN_BIN="$(find_tincan || true)"
if [[ -z "$TINCAN_BIN" ]]; then
    echo "FakeDiscord: custom tincan binary not found."
    echo "Run arch-linux/install_arch.sh first."
    exit 1
fi
load_nick() {
    if [[ -s "$NICK_FILE" ]]; then
        NICK="$(head -n 1 "$NICK_FILE")"
    else
        NICK=""
    fi

    while [[ -z "${NICK//[[:space:]]/}" ]]; do
        read -r -p "Ник: " NICK
    done

    printf '%s\n' "$NICK" > "$NICK_FILE"
}

change_nick() {
    local new_nick=""
    while [[ -z "${new_nick//[[:space:]]/}" ]]; do
        read -r -p "Новый ник: " new_nick
    done
    NICK="$new_nick"
    printf '%s\n' "$NICK" > "$NICK_FILE"
    echo "Ник сохранён: $NICK"
}

read_password() {
    local prompt="$1"
    local password=""
    read -r -s -p "$prompt" password
    echo
    printf '%s' "$password"
}

run_tincan() {
    echo
    echo "Подсказка по файлам внутри комнаты:"
    echo "  /send <путь>   — предложить файл"
    echo "  /files         — показать доступные файлы"
    echo "  /get <id>      — скачать файл"
    echo
    "$TINCAN_BIN" "$@"
    local rc=$?
    echo
    read -r -p "Enter — вернуться в меню..." _
    return "$rc"
}

load_nick
while true; do
    clear
    echo "=============================================="
    echo " FakeDiscord for Arch Linux"
    echo " Ник: $NICK"
    echo " Core: $("$TINCAN_BIN" --version 2>/dev/null || echo unknown)"
    echo "=============================================="
    echo "1) Подключиться к FakeDiscord"
    echo "2) Создать комнату по имени"
    echo "3) Подключиться к комнате по имени"
    echo "4) Создать комнату по invite-коду"
    echo "5) Подключиться по invite-коду"
    echo "6) Аудиоустройства"
    echo "7) Сменить ник"
    echo "0) Выход"
    echo

    read -r -p "> " choice

    case "$choice" in
        1)
            run_tincan join "$DEFAULT_ROOM" --name "$NICK" -p "$DEFAULT_PASSWORD"
            ;;
        2)
            read -r -p "Название комнаты: " room
            password="$(read_password "Пароль: ")"
            if [[ -n "${room//[[:space:]]/}" && -n "$password" ]]; then
                run_tincan host "$room" --name "$NICK" -p "$password"
            fi
            ;;
        3)
            read -r -p "Название комнаты: " room
            password="$(read_password "Пароль: ")"
            if [[ -n "${room//[[:space:]]/}" && -n "$password" ]]; then
                run_tincan join "$room" --name "$NICK" -p "$password"
            fi
            ;;
        4)
            run_tincan host --name "$NICK"
            ;;
        5)
            read -r -p "Invite code: " code
            if [[ -n "${code//[[:space:]]/}" ]]; then
                run_tincan join "$code" --name "$NICK"
            fi
            ;;
        6)
            clear
            "$TINCAN_BIN" devices --all
            echo
            read -r -p "Enter — назад..." _
            ;;
        7)
            change_nick
            sleep 1
            ;;
        0|q|Q)
            exit 0
            ;;
        *)
            echo "Неизвестный пункт."
            sleep 1
            ;;
    esac
done
