#!/usr/bin/env bash

# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
# Source: https://github.com/twentyhq/twenty

source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os

msg_info "Installing Dependencies"
$STD apt install -y \
  build-essential \
  redis-server
msg_ok "Installed Dependencies"

PG_VERSION="16" setup_postgresql
PG_DB_NAME="twenty_db" PG_DB_USER="twenty" setup_postgresql_db
NODE_VERSION="24" setup_nodejs

fetch_and_deploy_gh_release "twenty" "twentyhq/twenty" "tarball"

msg_info "Building Application"
cd /opt/twenty
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
$STD corepack enable
$STD corepack prepare yarn@4.9.2 --activate
$STD yarn install --immutable || $STD yarn install
export NODE_OPTIONS="--max-old-space-size=4096"
$STD npx nx run twenty-server:build
$STD npx nx build twenty-front
cp -r /opt/twenty/packages/twenty-front/build /opt/twenty/packages/twenty-server/dist/front
unset NODE_OPTIONS
msg_ok "Built Application"

msg_info "Configuring Application"
APP_SECRET=$(openssl rand -base64 32)
mkdir -p /opt/twenty/packages/twenty-server/.local-storage
cat <<EOF >/opt/twenty/.env
NODE_PORT=3000
PG_DATABASE_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@localhost:5432/${PG_DB_NAME}
REDIS_URL=redis://localhost:6379
SERVER_URL=http://${LOCAL_IP}:3000
APP_SECRET=${APP_SECRET}
STORAGE_TYPE=local
NODE_ENV=production
EOF
msg_ok "Configured Application"

msg_info "Running Database Migrations"
cd /opt/twenty/packages/twenty-server
set -a && source /opt/twenty/.env && set +a
$STD su - postgres -c "psql -d ${PG_DB_NAME} -c '
  CREATE SCHEMA IF NOT EXISTS public;
  CREATE SCHEMA IF NOT EXISTS core;
  CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\";
  CREATE EXTENSION IF NOT EXISTS unaccent;
  CREATE OR REPLACE FUNCTION public.unaccent_immutable(input text)
    RETURNS text LANGUAGE sql IMMUTABLE
    AS \$func\$SELECT public.unaccent(\$\$public.unaccent\$\$::regdictionary, input)\$func\$;
'"
$STD npx -y typeorm migration:run -d dist/database/typeorm/core/core.datasource
msg_ok "Ran Database Migrations"

msg_info "Creating Services"
cat <<EOF >/etc/systemd/system/twenty-server.service
[Unit]
Description=Twenty CRM Server
After=network.target postgresql.service redis-server.service
Requires=postgresql.service redis-server.service

[Service]
Type=simple
User=root
WorkingDirectory=/opt/twenty/packages/twenty-server
EnvironmentFile=/opt/twenty/.env
ExecStart=/usr/bin/node dist/main
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

cat <<EOF >/etc/systemd/system/twenty-worker.service
[Unit]
Description=Twenty CRM Worker
After=network.target postgresql.service redis-server.service twenty-server.service
Requires=postgresql.service redis-server.service

[Service]
Type=simple
User=root
WorkingDirectory=/opt/twenty/packages/twenty-server
EnvironmentFile=/opt/twenty/.env
Environment=DISABLE_DB_MIGRATIONS=true
Environment=DISABLE_CRON_JOBS_REGISTRATION=true
ExecStart=/usr/bin/node dist/queue-worker/queue-worker
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

systemctl enable -q --now redis-server twenty-server twenty-worker
msg_ok "Created Services"

motd_ssh
customize
cleanup_lxc
