#!/bin/bash

set -euo pipefail

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

REPO_URL="https://git.tvstart.ru/ychernenko/WFL.git"
TARGET_DIR="/root/WFL"
SERVICE_NAME="wfl-data.service"
TARGET_ENV="/mnt/wfl/.env"

log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

show_help() {
    echo "Использование: $0 [-r <релиз>] [-h]"
    echo "  -r  Релиз (ветка или тег), по умолчанию: main"
    echo "  -h  Показать справку"
    echo
    echo "Пример:"
    echo "  $0 -r main"
    exit 0
}

check_root() {
    if [[ $EUID -ne 0 ]]; then
        log_error "Скрипт должен запускаться с правами root"
        exit 1
    fi
}

install_packages() {
    log_info "Обновление списка пакетов..."
    apt-get update

    log_info "Установка пакетов..."
    apt-get install -y python3 python3-pip python3-venv git net-tools
}

download_code() {
    local release="$1"

    log_info "Подготовка директории $TARGET_DIR..."
    mkdir -p "$TARGET_DIR"

    if [ -d "$TARGET_DIR/.git" ]; then
        log_info "Обновление существующего репозитория..."
        cd "$TARGET_DIR"
        git fetch --all
        git checkout "$release"
        git pull origin "$release"
    else
        log_info "Клонирование репозитория..."
        git clone "$REPO_URL" "$TARGET_DIR"
        cd "$TARGET_DIR"
        git checkout "$release"
    fi

    log_info "Код загружен"
    log_info "Текущая ветка: $(git branch --show-current)"
    log_info "Последний коммит: $(git log --oneline -1)"
}

setup_venv() {
    cd "$TARGET_DIR"

    if [ -d ".venv" ]; then
        log_info "Удаление старого виртуального окружения..."
        rm -rf .venv
    fi

    log_info "Создание виртуального окружения..."
    python3 -m venv .venv

    source .venv/bin/activate

    log_info "Обновление pip..."
    pip install --upgrade pip

    if [ -f "requirements.txt" ]; then
        log_info "Установка зависимостей из requirements.txt..."
        pip install -r requirements.txt
    else
        log_error "Файл requirements.txt не найден"
        exit 1
    fi

    log_info "Проверка uvicorn..."
    .venv/bin/python -c "import fastapi, uvicorn; print('FastAPI и uvicorn установлены')"
}

check_required_files() {
    cd "$TARGET_DIR"

    if [ ! -f "app.py" ]; then
        log_error "Файл app.py не найден в $TARGET_DIR"
        exit 1
    fi

    log_info "Файл app.py найден"
}

setup_firewall() {
    log_info "Открытие порта 8001..."

    if command -v ufw >/dev/null 2>&1 && systemctl is-active --quiet ufw; then
        ufw allow 8001/tcp || log_warn "Не удалось открыть порт 8001 в ufw"
    fi

    if command -v firewall-cmd >/dev/null 2>&1 && systemctl is-active --quiet firewalld; then
        firewall-cmd --permanent --add-port=8001/tcp || true
        firewall-cmd --reload || true
    fi
}

create_systemd_service() {
    local service_file="/etc/systemd/system/$SERVICE_NAME"

    log_info "Создание systemd unit: $service_file"

    if systemctl is-active --quiet "$SERVICE_NAME"; then
        log_info "Остановка старого сервиса..."
        systemctl stop "$SERVICE_NAME"
    fi

    if systemctl is-enabled --quiet "$SERVICE_NAME"; then
        systemctl disable "$SERVICE_NAME" || true
    fi

    cat > "$service_file" <<EOF
[Unit]
Description=WFL FastAPI Service
After=network.target
Wants=network.target

[Service]
Type=simple
User=root
WorkingDirectory=$TARGET_DIR
Environment="PATH=$TARGET_DIR/.venv/bin"
EnvironmentFile=$TARGET_ENV
ExecStart=$TARGET_DIR/.venv/bin/uvicorn app:app --host 0.0.0.0 --port 8001

Restart=always
RestartSec=5
StartLimitIntervalSec=300
StartLimitBurst=5

StandardOutput=journal
StandardError=journal
SyslogIdentifier=WFL

[Install]
WantedBy=multi-user.target
EOF

    chmod 644 "$service_file"

    log_info "Перезагрузка systemd..."
    systemctl daemon-reload

    log_info "Включение сервиса..."
    systemctl enable "$SERVICE_NAME"
}

start_service() {
    log_info "Запуск сервиса..."
    systemctl restart "$SERVICE_NAME"
    sleep 3
}

check_service_status() {
    if systemctl is-active --quiet "$SERVICE_NAME"; then
        log_info "Сервис успешно запущен"
        systemctl status "$SERVICE_NAME" --no-pager -l
    else
        log_error "Сервис не запущен"
        journalctl -u "$SERVICE_NAME" -n 50 --no-pager
        exit 1
    fi
}

main() {
    local release="main"

    while getopts "r:h" opt; do
        case $opt in
            r) release="$OPTARG" ;;
            h) show_help ;;
            *) log_error "Неверный аргумент"; exit 1 ;;
        esac
    done

    check_root

    log_info "Начало деплоя"
    log_info "Релиз: $release"

    install_packages
    download_code "$release"
    check_required_files
    setup_venv
    setup_firewall
    create_systemd_service
    start_service
    check_service_status

    log_info "========================================"
    log_info "Готово"
    log_info "Сервис: $SERVICE_NAME"
    log_info "Директория: $TARGET_DIR"
    log_info "Логи:"
    log_info "  journalctl -u $SERVICE_NAME -f"
    log_info "Статус:"
    log_info "  systemctl status $SERVICE_NAME"
    log_info "Перезапуск:"
    log_info "  systemctl restart $SERVICE_NAME"
    log_info "========================================"
}

main "$@"