#!/bin/bash
# Copyright (c) 2024-2025 Тарабанов Александр Викторович
# All rights reserved.
# This software is proprietary and confidential.
# For licensing inquiries: info@hb3-accelerator.com

# Скрипт для автоматической установки шаблона приложения DLE
# Скачивает репозиторий, проверяет Docker, импортирует образы и тома, запускает приложение

# Цветной вывод
print_green() {
  echo -e "\e[32m$1\e[0m"
}

print_blue() {
  echo -e "\e[34m$1\e[0m"
}

print_yellow() {
  echo -e "\e[33m$1\e[0m"
}

print_red() {
  echo -e "\e[31m$1\e[0m"
}

# Проверка Docker
check_docker() {
  print_blue "🔍 Проверка Docker..."
  if ! command -v docker &> /dev/null; then
    print_red "❌ Docker не установлен!"
    print_yellow "Установите Docker: https://docs.docker.com/get-docker/"
    exit 1
  fi
  
  if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then
    print_red "❌ Docker Compose не установлен!"
    print_yellow "Установите Docker Compose: https://docs.docker.com/compose/install/"
    exit 1
  fi
  
  print_green "✅ Docker и Docker Compose установлены"
}

# Проверка Docker запущен
check_docker_running() {
  print_blue "🔍 Проверка запуска Docker..."
  if ! docker info &> /dev/null; then
    print_red "❌ Docker не запущен!"
    print_yellow "Запустите Docker и повторите попытку"
    exit 1
  fi
  print_green "✅ Docker запущен"
}

# Скачивание репозитория
download_repo() {
  print_blue "📥 Скачивание репозитория..."
  if [ -d "DLE" ]; then
    print_yellow "⚠️  Папка DLE уже существует"
    read -p "Удалить существующую папку? (y/N): " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]; then
      rm -rf DLE
    else
      print_blue "Используем существующую папку"
      cd DLE
      return
    fi
  fi
  
  git clone https://github.com/VC-HB3-Accelerator/DLE.git
  cd DLE
  print_green "✅ Репозиторий скачан"
}

# Проверка файлов образов
check_images() {
  print_blue "🔍 Проверка файлов образов..."
  if [ ! -d "docker-data/images" ]; then
    print_red "❌ Папка docker-data/images не найдена!"
    print_yellow "Убедитесь, что репозиторий содержит экспортированные образы"
    exit 1
  fi
  
  local images=("backend.tar" "frontend.tar" "vector-search.tar" "ollama.tar" "webssh-agent.tar")
  for image in "${images[@]}"; do
    if [ ! -f "docker-data/images/$image" ]; then
      print_red "❌ Файл образа $image не найден!"
      exit 1
    fi
  done
  
  print_green "✅ Все файлы образов найдены"
}

# Проверка файлов томов
check_volumes() {
  print_blue "🔍 Проверка файлов томов..."
  if [ ! -d "docker-data/volumes" ]; then
    print_red "❌ Папка docker-data/volumes не найдена!"
    print_yellow "Убедитесь, что репозиторий содержит экспортированные тома"
    exit 1
  fi
  
  local volumes=("postgres_data.tar.gz" "ollama_data.tar.gz" "vector_search_data.tar.gz" "backend_node_modules.tar.gz" "frontend_node_modules.tar.gz")
  for volume in "${volumes[@]}"; do
    if [ ! -f "docker-data/volumes/$volume" ]; then
      print_red "❌ Файл тома $volume не найден!"
      exit 1
    fi
  done
  
  print_green "✅ Все файлы томов найдены"
}

# Импорт образов
import_images() {
  print_blue "📦 Импорт образов..."
  
  local images=("backend.tar" "frontend.tar" "vector-search.tar" "ollama.tar" "webssh-agent.tar")
  for image in "${images[@]}"; do
    print_blue "Импорт $image..."
    if docker load -i "docker-data/images/$image"; then
      print_green "✅ $image импортирован"
    else
      print_red "❌ Ошибка импорта $image"
      exit 1
    fi
  done
  
  print_green "✅ Все образы импортированы"
}

# Создание томов
create_volumes() {
  print_blue "💾 Создание томов..."
  
  local volumes=("digital_legal_entitydle_postgres_data" "digital_legal_entitydle_ollama_data" "digital_legal_entitydle_vector_search_data" "digital_legal_entitydle_backend_node_modules" "digital_legal_entitydle_frontend_node_modules")
  
  for volume in "${volumes[@]}"; do
    if docker volume ls | grep -q "$volume"; then
      print_yellow "⚠️  Том $volume уже существует"
    else
      docker volume create "$volume"
      print_green "✅ Том $volume создан"
    fi
  done
}

# Импорт томов
import_volumes() {
  print_blue "📥 Импорт данных в тома..."
  
  # PostgreSQL
  print_blue "Импорт postgres_data..."
  docker run --rm -v digital_legal_entitydle_postgres_data:/target -v "$(pwd)/docker-data/volumes:/backup" alpine tar xzf /backup/postgres_data.tar.gz -C /target
  print_green "✅ postgres_data импортирован"
  
  # Ollama
  print_blue "Импорт ollama_data..."
  docker run --rm -v digital_legal_entitydle_ollama_data:/target -v "$(pwd)/docker-data/volumes:/backup" alpine tar xzf /backup/ollama_data.tar.gz -C /target
  print_green "✅ ollama_data импортирован"
  
  # Vector Search
  print_blue "Импорт vector_search_data..."
  docker run --rm -v digital_legal_entitydle_vector_search_data:/target -v "$(pwd)/docker-data/volumes:/backup" alpine tar xzf /backup/vector_search_data.tar.gz -C /target
  print_green "✅ vector_search_data импортирован"
  
  # Backend node_modules
  print_blue "Импорт backend_node_modules..."
  docker run --rm -v digital_legal_entitydle_backend_node_modules:/target -v "$(pwd)/docker-data/volumes:/backup" alpine tar xzf /backup/backend_node_modules.tar.gz -C /target
  print_green "✅ backend_node_modules импортирован"
  
  # Frontend node_modules
  print_blue "Импорт frontend_node_modules..."
  docker run --rm -v digital_legal_entitydle_frontend_node_modules:/target -v "$(pwd)/docker-data/volumes:/backup" alpine tar xzf /backup/frontend_node_modules.tar.gz -C /target
  print_green "✅ frontend_node_modules импортирован"
  
  print_green "✅ Все тома импортированы"
}

# Запуск приложения
start_application() {
  print_blue "🚀 Запуск приложения..."
  
  if docker-compose up -d; then
    print_green "✅ Приложение запущено"
    print_blue "🌐 Доступ к приложению: http://localhost:5173"
  else
    print_red "❌ Ошибка запуска приложения"
    print_yellow "Проверьте логи: docker-compose logs"
    exit 1
  fi
}

# Проверка статуса
check_status() {
  print_blue "🔍 Проверка статуса контейнеров..."
  sleep 10
  
  if docker-compose ps | grep -q "Up"; then
    print_green "✅ Контейнеры запущены"
    print_blue "🌐 Приложение доступно по адресу: http://localhost:5173"
  else
    print_yellow "⚠️  Некоторые контейнеры могут быть не готовы"
    print_blue "Проверьте статус: docker-compose ps"
    print_blue "Просмотрите логи: docker-compose logs"
  fi
}

# Основная функция
main() {
  print_blue "🚀 Установка шаблона приложения Digital Legal Entity"
  print_blue "=================================================="
  
  # Проверки
  check_docker
  check_docker_running
  
  # Скачивание
  download_repo
  
  # Проверка файлов
  check_images
  check_volumes
  
  # Импорт
  import_images
  create_volumes
  import_volumes
  
  # Запуск
  start_application
  check_status
  
  print_green "🎉 Установка завершена!"
  print_blue "=================================================="
  print_blue "🌐 Приложение доступно: http://localhost:5173"
  print_blue "🔧 Управление:"
  print_blue "   Запуск:   docker-compose up -d"
  print_blue "   Остановка: docker-compose down"
  print_blue "   Логи:     docker-compose logs"
}

# Запуск
main "$@"
