#!/opt/brepo/ruby33/bin/ruby
# info: utility to prepare existing server with hestiacp to use bunkerweb
# do not run this script n the server, where bunkerweb was installed with hestiacp
# installation
# options: COMMAND
#
# example: v-bunkerweb-migrate migrate-nginx
#
# Commands:
# migratenginx - move old nginx configs to the new port and path
# migratetobunkerweb - create items of sites in the bunkerweb database

#------------------------------------------#
#                Variables & Functions                     #
#------------------------------------------#

# Argument definition
v_command = ARGV[0]

require "/usr/local/hestia/func_ruby/global_options"

load_ruby_options_defaults
$HESTIA = load_hestia_default_path_from_env

require "main"
require "modules"
require "HestiaBunkerWebApi"

require 'json' unless defined?(JSON)
require 'fileutils'

def copy_nginx_files(src_root, dest_root)
  FileUtils.mkdir_p(dest_root)
  Dir.foreach(src_root) do |entry|
    next if entry == '.' || entry == '..'
    next if entry == 'modules' || entry == 'modules-enabled'
    src_path = File.join(src_root, entry)
    dest_path = File.join(dest_root, entry)
    if File.directory?(src_path)
      FileUtils.mkdir_p(dest_path)
      copy_nginx_files(src_path, dest_path)
    else
      FileUtils.cp(src_path, dest_path)
    end
  end
end

# Function to log and execute migration stages
def log_migrate_stage(stage)
  log_file = '/usr/local/hestia/log/bunkerweb_migrate_stages.log'
  # Check if the stage has already been recorded
  if File.exist?(log_file) && File.readlines(log_file).any? { |line| line.strip == stage }
    puts "Stage #{stage} already completed, skipping."
    return
  end
  # Execute the stage block
  begin
    yield
    # Record the successful stage
    File.open(log_file, 'a') { |f| f.puts stage }
    puts "Stage #{stage} completed."
  rescue => e
    hestia_print_error_message_to_cli "Stage #{stage} failed: #{e.message}"
    exit 1
  end
end

hestia_check_privileged_user

load_global_bash_variables "/etc/hestiacp/hestia.conf"
if $HESTIA.nil?
  hestia_print_error_message_to_cli "Can't find HESTIA base path"
  exit 1
end

load_global_bash_variables "#{$HESTIA}/conf/hestia.conf"

#------------------------------------------#
#                    Verifications                         #
#------------------------------------------#

check_args 1, ARGV, "COMMAND"

# Perform verification if read-only mode is enabled
check_hestia_demo_mode

#------------------------------------------#
#                       Action                             #
#------------------------------------------#

case v_command.to_sym
when :migratenginx
  log_migrate_stage('stage1') do
    if $BUNKERWEB.nil?
      hestia_change_sys_config_value("BUNKERWEB", "yes")
    end
  end
  log_migrate_stage('stage2') do
    unless system('yum install -y nginx-system')
      hestia_print_error_message_to_cli "Failed to install nginx-system via yum"
      log_event E_ARGS, $ARGUMENTS
      exit 1
    end
  end
  log_migrate_stage('stage3') do
    hestia_change_sys_config_value("PROXY_PORT", "8078")
    hestia_change_sys_config_value("PROXY_SSL_PORT", "8079")
  end
  log_migrate_stage('stage4') do
    FileUtils.rm_f Dir.glob('/usr/local/hestia/nginx-system/etc/nginx/conf.d/*.conf')
    src_root = '/etc/nginx'
    dest_root = '/usr/local/hestia/nginx-system/etc/nginx'
    copy_nginx_files(src_root, dest_root)
  end
  #stage5 замена /etc/nginx на /usr/local/hestia/nginx-system/etc/nginx
  #stage6 замена портов на 8078
  #stage7 проверить, нужно ли что-то менять в шаблонах
  #stage8 активация из запуск nginx-system
when :migratetobunkerweb
  #TODO настройка bunkerweb
else
  hestia_print_error_message_to_cli "unknown command"
  log_event E_ARGS, $ARGUMENTS
  exit 1
end

exit 0
