#
# Cookbook Name:: kosmos-mastodon
# Recipe:: default
#

include_recipe "kosmos-nodejs"
include_recipe "kosmos-redis"
include_recipe "java"

elasticsearch_user 'elasticsearch'

elasticsearch_install 'elasticsearch' do
  type 'package'
  version '6.8.2'
end

elasticsearch_configure 'elasticsearch' do
  allocated_memory node["kosmos-mastodon"]["elasticsearch"]["allocated_memory"]
end

elasticsearch_service 'elasticsearch'

postgresql_data_bag_item = data_bag_item('credentials', 'postgresql')

mastodon_path = node["kosmos-mastodon"]["directory"]

mastodon_user = "mastodon"

group mastodon_user do
  gid 62786
end

user mastodon_user do
  comment "mastodon user"
  uid 62786
  gid 62786
  shell "/bin/bash"
  home mastodon_path
end

package %w(build-essential imagemagick ffmpeg libxml2-dev libxslt1-dev file git
           curl pkg-config libprotobuf-dev protobuf-compiler libidn11
           libidn11-dev libjemalloc2 libpq-dev)

npm_package "yarn" do
  version "1.22.4"
end

ruby_version = "2.7.2"

execute "systemctl daemon-reload" do
  command "systemctl daemon-reload"
  action :nothing
end

# mastodon-web service
#
template "/lib/systemd/system/mastodon-web.service" do
  source "mastodon-web.systemd.service.erb"
  variables user: mastodon_user,
            app_dir: mastodon_path,
            port: node["kosmos-mastodon"]["puma_port"],
            bundle_path: "/opt/ruby_build/builds/#{ruby_version}/bin/bundle"
  notifies :run, "execute[systemctl daemon-reload]", :immediately
  notifies :restart, "service[mastodon-web]", :delayed
end

# mastodon-sidekiq service
#
template "/lib/systemd/system/mastodon-sidekiq.service" do
  source "mastodon-sidekiq.systemd.service.erb"
  variables user: mastodon_user,
            app_dir: mastodon_path,
            bundle_path: "/opt/ruby_build/builds/#{ruby_version}/bin/bundle",
            sidekiq_threads: node["kosmos-mastodon"]["sidekiq_threads"]
  notifies :run, "execute[systemctl daemon-reload]", :immediately
  notifies :restart, "service[mastodon-sidekiq]", :delayed
end

# mastodon-sidekiq-scheduler service
#
template "/lib/systemd/system/mastodon-sidekiq-scheduler.service" do
  source "mastodon-sidekiq-scheduler.systemd.service.erb"
  variables user: mastodon_user,
            app_dir: mastodon_path,
            bundle_path: "/opt/ruby_build/builds/#{ruby_version}/bin/bundle",
            sidekiq_threads: 1
  notifies :run, "execute[systemctl daemon-reload]", :immediately
  notifies :restart, "service[mastodon-sidekiq-scheduler]", :delayed
end

# mastodon-streaming service
#
template "/lib/systemd/system/mastodon-streaming.service" do
  source "mastodon-streaming.systemd.service.erb"
  variables user: mastodon_user,
            app_dir: mastodon_path,
            port: node["kosmos-mastodon"]["streaming_port"]
  notifies :run, "execute[systemctl daemon-reload]", :immediately
  notifies :restart, "service[mastodon-streaming]", :delayed
end

application mastodon_path do
  owner "mastodon"
  group "mastodon"

  # Take care of application restarts manually, in the git resource
  action_on_update false

  environment "HOME" => mastodon_path,
              "PATH" => "/opt/ruby_build/builds/#{ruby_version}/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"

  ruby_runtime ruby_version do
    provider :ruby_build
    version ruby_version
  end

  git do
    user mastodon_user
    group mastodon_user
    repository node["kosmos-mastodon"]["repo"]
    revision   node["kosmos-mastodon"]["revision"]
    # Restart services on deployments
    notifies :restart, "application[#{mastodon_path}]", :delayed
  end

  mastodon_credentials = data_bag_item('credentials', 'mastodon')

  template ".env.production" do
    source "env.production.erb"
    mode  "0640"
    owner mastodon_user
    group mastodon_user
    variables redis_url: node["kosmos-mastodon"]["redis_url"],
              domain: node["kosmos-mastodon"]["server_name"],
              paperclip_secret: mastodon_credentials['paperclip_secret'],
              secret_key_base: mastodon_credentials['secret_key_base'],
              otp_secret: mastodon_credentials['otp_secret'],
              smtp_login: mastodon_credentials['smtp_user_name'],
              smtp_password: mastodon_credentials['smtp_password'],
              smtp_from_address: "mail@#{node['kosmos-mastodon']['server_name']}",
              s3_bucket: "kosmos-social",
              aws_access_key_id: mastodon_credentials['aws_access_key_id'],
              aws_secret_access_key: mastodon_credentials['aws_secret_access_key'],
              s3_region: "eu-west-1",
              vapid_private_key: mastodon_credentials['vapid_private_key'],
              vapid_public_key: mastodon_credentials['vapid_public_key'],
              db_pass: postgresql_data_bag_item['mastodon_user_password'],
              db_host: "pg.kosmos.local"
    notifies :restart, "application[#{mastodon_path}]", :delayed
  end

  execute "bundle install" do
    environment "HOME" => mastodon_path
    user mastodon_user
    cwd mastodon_path
    command "/opt/ruby_build/builds/#{ruby_version}/bin/bundle install --without development,test --deployment"
  end

  execute "yarn install" do
    environment "HOME" => mastodon_path, "NODE_ENV" => "production"
    user mastodon_user
    cwd mastodon_path
    command "yarn install --pure-lockfile"
  end

  execute 'rake db:migrate' do
    environment "RAILS_ENV" => "production", "HOME" => mastodon_path#, "SKIP_POST_DEPLOYMENT_MIGRATIONS" => "true"
    user mastodon_user
    group mastodon_user
    cwd mastodon_path
    command "PATH=\"/opt/ruby_build/builds/#{ruby_version}/bin:$PATH\" bundle exec rake db:migrate"
  end

  execute 'rake assets:precompile' do
    environment "RAILS_ENV" => "production", "HOME" => mastodon_path
    user mastodon_user
    group mastodon_user
    cwd mastodon_path
    command "PATH=\"/opt/ruby_build/builds/#{ruby_version}/bin:$PATH\" bundle exec rake assets:precompile"
  end

  service "mastodon-web" do
    action [:enable, :start]
  end

  service "mastodon-sidekiq" do
    action [:enable, :start]
  end

  service "mastodon-sidekiq-scheduler" do
    action [:enable, :start]
  end

  service "mastodon-streaming" do
    action [:enable, :start]
  end
end
