#!/usr/bin/env ruby
require 'fileutils'

# Caminho do arquivo NGINX
nginx_config_file = "/etc/nginx/sites-enabled/app.conf"

# Caminho da pasta original a ser copiada
source_dir = "/app"

# Usuário e grupo para o chown
target_user = "www-data"
target_group = "www-data"

# Caminho relativo para o arquivo database.yml dentro de cada pasta
database_config_file = "config/database.yml"

# Obtém a variável de ambiente DOCKER_DB_NAME
docker_db_name = ENV['DOCKER_DB_NAME']

# Verifica se a variável contém o caractere '&'
if docker_db_name && docker_db_name.include?('&')
  # Divide a variável em array de strings usando '&' como delimitador e remove 'gerencial_'
  db_names = docker_db_name.split('&').map { |db_name| db_name.gsub(/^gerencial_/, '') }

  # Lê o conteúdo atual do arquivo
  file_content = File.read(nginx_config_file)

  # Define a linha onde será inserido o novo conteúdo
  insert_line = "{LOCATIONS}"

  # Para cada string no array, cria o conteúdo a ser adicionado e copia a pasta
  additional_content = db_names.map do |db_name|
    # Define o caminho da nova pasta
    target_dir = "/#{db_name}"

    # Copia a pasta /app para o novo caminho com o nome da variável
    if File.exist?(source_dir)
      FileUtils.cp_r(source_dir, target_dir)
      puts "Pasta #{source_dir} copiada para #{target_dir}"

      # Altera a propriedade da pasta para o usuário www-data
      FileUtils.chown_R(target_user, target_group, target_dir)
      puts "Permissões alteradas para #{target_user}:#{target_group} em #{target_dir}"

      # Substitui o valor da variável DOCKER_DB_NAME no arquivo config/database.yml
      db_config_path = File.join(target_dir, database_config_file)
      if File.exist?(db_config_path)
        db_config_content = File.read(db_config_path)
        updated_db_config = db_config_content.gsub("<%= ENV['DOCKER_DB_NAME'] %>", "gerencial_#{db_name}")
        File.open(db_config_path, 'w') { |file| file.write(updated_db_config) }
        puts "Arquivo #{db_config_path} atualizado com a variável #{db_name}"
      else
        puts "Arquivo #{db_config_path} não encontrado."
      end

      # Executa o comando bundle exec rake db:migrate
      Dir.chdir(target_dir) do
        system("bundle exec rake db:migrate RAILS_ENV=production")
        puts "Comando db:migrate executado para #{db_name}"

        # alterar a string de controle de sessão
        #session_store_file = "config/initializers/session_store.rb"
        new_session_key = "_minha_app_custom_session"
        #system("sed -i \"s/_intersol/#{db_name}/\" #{session_store_file}")
        system("sed -i 's|municipio: \"teste\"|municipio: \"#{db_name}\"|' config/application.yml")
        system("sed -i 's|FACEBOOK_APP_ID|#{ENV['FACEBOOK_APP_ID']}|' config/application.yml")
        system("sed -i 's|FACEBOOK_APP_SECRET|#{ENV['FACEBOOK_APP_SECRET']}|' config/application.yml")
        system("sed -i 's|SMTP_USER|#{ENV['SMTP_USER']}|' config/application.yml")
        system("sed -i 's|SMTP_PASSWORD|#{ENV['SMTP_PASSWORD']}|' config/application.yml")
        system("sed -i \"s|:access_key_id => ENV\\['GERENCIAL_S3_USER'\\]|:access_key_id => '#{ENV['GERENCIAL_S3_USER']}'|\" config/environments/production.rb")
        system("sed -i \"s|:secret_access_key => ENV\\['GERENCIAL_S3_PASSWORD'\\]|:secret_access_key => '#{ENV['GERENCIAL_S3_PASSWORD']}'|\" config/environments/production.rb")
        system("sed -i \"s|ENV\\['GERENCIAL_EMAIL_USER'\\],|'#{ENV['SMTP_USER']}',|\" config/environments/production.rb")
        system("sed -i \"s|ENV\\['GERENCIAL_EMAIL_PASSWORD'\\],|'#{ENV['SMTP_PASSWORD']}',|\" config/environments/production.rb")
        system("sed -i \"s|host: ENV\\['host'\\]|host: '#{ENV['HOST']}'|\" config/environments/production.rb")
        system("sed -i \"s|_DOCKER_DB_NAME_|_#{db_name}_|\" config/environments/production.rb")
        # atualizar o crontab
        system("bundle exec whenever --update-crontab")
      end
    else
      puts "A pasta #{source_dir} não existe."
    end

    # Cria a configuração NGINX para cada valor da array
    <<~CONFIG
      location /#{db_name}/ {
          alias /#{db_name}/public;
          passenger_base_uri /#{db_name};
          passenger_app_root /#{db_name};
          passenger_document_root /#{db_name}/public;
          passenger_enabled on;

          # Ajustes de timeout
          proxy_connect_timeout 1800;
          proxy_send_timeout 1800;
          proxy_read_timeout 1800;
          send_timeout 1800;
      }
    CONFIG

  end.join("\n")

  # Insere o novo conteúdo abaixo da linha desejada
  updated_content = file_content.gsub(insert_line, "#{additional_content}")

  # Escreve o conteúdo atualizado de volta no arquivo NGINX
  File.open(nginx_config_file, 'w') { |file| file.write(updated_content) }

  puts "Configurações adicionadas com sucesso!"

else
  # Se DOCKER_DB_NAME não contém '&', processa apenas o valor único removendo 'gerencial_'
  db_name = docker_db_name.gsub(/^gerencial_/, '')

  # Define o caminho da nova pasta
  target_dir = "/#{db_name}"

  # Copia a pasta /app para o novo caminho com o nome da variável
  if File.exist?(source_dir)

    # Lê o conteúdo atual do arquivo
    file_content = File.read(nginx_config_file)

    # Adiciona o bloco location apenas uma vez
    insert_line = "{LOCATIONS}"
    additional_content = <<~CONFIG
      location /#{db_name}/ {
          alias /app/public;
          passenger_base_uri /#{db_name};
          passenger_app_root /app;
          passenger_document_root /app/public;
          passenger_enabled on;
          client_max_body_size 50M;

          # Ajustes de timeout
          proxy_connect_timeout 1800;
          proxy_send_timeout 1800;
          proxy_read_timeout 1800;
          send_timeout 1800;
      }
    CONFIG

    # Insere o conteúdo adicional uma única vez abaixo da linha desejada
    updated_content = file_content.gsub(insert_line, "#{additional_content}")

    # Escreve o conteúdo atualizado de volta no arquivo NGINX
    File.open(nginx_config_file, 'w') { |file| file.write(updated_content) }

    puts "Configuração adicionada com sucesso!"

    Dir.chdir("/app") do
      # Executa o comando bundle exec rake db:migrate
      system("bundle exec rake db:migrate RAILS_ENV=production")
      # atualizar o crontab
      system("bundle exec whenever --update-crontab")
      puts "Comando db:migrate executado para #{db_name}"
      system("sed -i 's|municipio: \"teste\"|municipio: \"#{ENV['URL_BASE']}\"|' config/application.yml")
      system("sed -i 's|FACEBOOK_APP_ID|#{ENV['FACEBOOK_APP_ID']}|' config/application.yml")
      system("sed -i 's|FACEBOOK_APP_SECRET|#{ENV['FACEBOOK_APP_SECRET']}|' config/application.yml")
      system("sed -i 's|SMTP_USER|#{ENV['SMTP_USER']}|' config/application.yml")
      system("sed -i 's|SMTP_PASSWORD|#{ENV['SMTP_PASSWORD']}|' config/application.yml")
      system("sed -i \"s|:access_key_id => ENV\\['GERENCIAL_S3_USER'\\]|:access_key_id => '#{ENV['GERENCIAL_S3_USER']}'|\" config/environments/production.rb")
      system("sed -i \"s|:secret_access_key => ENV\\['GERENCIAL_S3_PASSWORD'\\]|:secret_access_key => '#{ENV['GERENCIAL_S3_PASSWORD']}'|\" config/environments/production.rb")
      system("sed -i \"s|ENV\\['GERENCIAL_EMAIL_USER'\\],|'#{ENV['SMTP_USER']}',|\" config/environments/production.rb")
      system("sed -i \"s|ENV\\['GERENCIAL_EMAIL_PASSWORD'\\],|'#{ENV['SMTP_PASSWORD']}',|\" config/environments/production.rb")
      system("sed -i \"s|host: ENV\\['host'\\]|host: '#{ENV['HOST']}'|\" config/environments/production.rb")
      system("sed -i \"s|_DOCKER_DB_NAME_|_#{db_name}_|\" config/environments/production.rb")
    end
  else
    puts "A pasta #{source_dir} não existe."
  end
end
