#!/usr/bin/env bash
set -euo pipefail

# Install standalone CMS core into any site (independent copy).
# Example:
#   ./install_cms.sh \
#     --site-root /srv/www/client/mynewsite \
#     --app-name "My New Site CMS" \
#     --app-brand "My New Site" \
#     --db-name mynewsite_cms \
#     --db-user root \
#     --db-pass "REPLACE_ME" \
#     --run-db-bootstrap

CORE_PACKAGE_DEFAULT="/srv/www/seethruit/CMSinstall/core"
DB_HOST_DEFAULT="127.0.0.1"
DB_PORT_DEFAULT="3306"
TIMEZONE_DEFAULT="America/New_York"
DB_USER_DEFAULT="root"
CMS_STYLESHEET_DEFAULT="/assets/cms.css"

SITE_ROOT=""
CORE_PACKAGE="$CORE_PACKAGE_DEFAULT"
DB_HOST="$DB_HOST_DEFAULT"
DB_PORT="$DB_PORT_DEFAULT"
DB_NAME=""
DB_USER="$DB_USER_DEFAULT"
DB_PASS=""
APP_NAME=""
APP_BRAND=""
CMS_STYLESHEET="$CMS_STYLESHEET_DEFAULT"
APP_TIMEZONE="$TIMEZONE_DEFAULT"
SKIP_THEME_COPY="0"
RUN_DB_BOOTSTRAP="0"

usage() {
  cat <<'EOF'
Usage:
  install_cms.sh --site-root <absolute_path> [options]

Required:
  --site-root <path>          Site root, e.g. /srv/www/client/example

Optional:
  --core-package <path>       Standalone core package path (default: /srv/www/seethruit/CMSinstall/core)
  --db-host <value>           DB host (default: 127.0.0.1)
  --db-port <value>           DB port (default: 3306)
  --db-name <value>           DB name (default: <site_slug>_cms)
  --db-user <value>           DB user (default: root)
  --db-pass <value>           DB password (default: empty)
  --app-name <value>          CMS app name (default: "<Site Slug Title Case> CMS")
  --app-brand <value>         Brand used in copy (default: "<Site Slug Title Case>")
  --cms-stylesheet <path>     Public CSS path for CMS pages (default: /assets/cms.css)
  --timezone <value>          App timezone (default: America/New_York)
  --skip-theme-copy           Do not create/copy CMS css file
  --run-db-bootstrap          Try DB create/import with provided app credentials
  -h, --help                  Show help
EOF
}

title_from_slug() {
  local slug="$1"
  slug="${slug//-/ }"
  slug="${slug//_/ }"
  awk '{for(i=1;i<=NF;i++){ $i=toupper(substr($i,1,1)) substr($i,2)}; print}' <<<"$slug"
}

sanitize_slug() {
  local s="$1"
  s="$(tr '[:upper:]' '[:lower:]' <<<"$s")"
  s="$(sed -E 's/[^a-z0-9]+/_/g; s/^_+//; s/_+$//' <<<"$s")"
  echo "$s"
}

while (($#)); do
  case "$1" in
    --site-root) SITE_ROOT="${2:-}"; shift 2 ;;
    --core-package) CORE_PACKAGE="${2:-}"; shift 2 ;;
    --db-host) DB_HOST="${2:-}"; shift 2 ;;
    --db-port) DB_PORT="${2:-}"; shift 2 ;;
    --db-name) DB_NAME="${2:-}"; shift 2 ;;
    --db-user) DB_USER="${2:-}"; shift 2 ;;
    --db-pass) DB_PASS="${2:-}"; shift 2 ;;
    --app-name) APP_NAME="${2:-}"; shift 2 ;;
    --app-brand) APP_BRAND="${2:-}"; shift 2 ;;
    --cms-stylesheet) CMS_STYLESHEET="${2:-}"; shift 2 ;;
    --timezone) APP_TIMEZONE="${2:-}"; shift 2 ;;
    --skip-theme-copy) SKIP_THEME_COPY="1"; shift ;;
    --run-db-bootstrap) RUN_DB_BOOTSTRAP="1"; shift ;;
    -h|--help) usage; exit 0 ;;
    *) echo "Unknown argument: $1" >&2; usage; exit 1 ;;
  esac
done

if [[ -z "$SITE_ROOT" ]]; then
  echo "Error: --site-root is required." >&2
  usage
  exit 1
fi

if [[ ! -d "$SITE_ROOT" ]]; then
  echo "Error: site root does not exist: $SITE_ROOT" >&2
  exit 1
fi

if [[ ! -d "$SITE_ROOT/public" ]]; then
  echo "Error: expected public dir not found at: $SITE_ROOT/public" >&2
  exit 1
fi

if [[ ! -d "$CORE_PACKAGE/public/admin" || ! -d "$CORE_PACKAGE/private/app" ]]; then
  echo "Error: invalid core package path: $CORE_PACKAGE" >&2
  exit 1
fi

site_slug="$(basename "$SITE_ROOT")"
site_slug="$(sanitize_slug "$site_slug")"

if [[ -z "$DB_NAME" ]]; then
  DB_NAME="${site_slug}_cms"
fi
if [[ -z "$APP_BRAND" ]]; then
  APP_BRAND="$(title_from_slug "$site_slug")"
fi
if [[ -z "$APP_NAME" ]]; then
  APP_NAME="${APP_BRAND} CMS"
fi

ADMIN_DIR="$SITE_ROOT/public/admin"
mkdir -p "$ADMIN_DIR"

# Remove shared wrapper if present from older installs.
rm -f "$ADMIN_DIR/_cms_bootstrap.php"

mkdir -p "$SITE_ROOT/private/app/services"
mkdir -p "$SITE_ROOT/private/database/migrations"

cp "$CORE_PACKAGE/private/app/bootstrap.php" "$SITE_ROOT/private/app/bootstrap.php"
cp "$CORE_PACKAGE/private/app/EmployeeTypeDashboard.php" "$SITE_ROOT/private/app/EmployeeTypeDashboard.php"
cp "$CORE_PACKAGE/private/app/sync-employee-type-dashboards.php" "$SITE_ROOT/private/app/sync-employee-type-dashboards.php"
chmod 755 "$SITE_ROOT/private/app/sync-employee-type-dashboards.php" 2>/dev/null || true
cp "$CORE_PACKAGE/private/app/services/PosIntegrations.php" "$SITE_ROOT/private/app/services/PosIntegrations.php"
cp "$CORE_PACKAGE/private/app/services/SmtpMailer.php" "$SITE_ROOT/private/app/services/SmtpMailer.php"
cp "$CORE_PACKAGE/private/database/schema.sql" "$SITE_ROOT/private/database/schema.sql"
cp "$CORE_PACKAGE/private/database/migrations/20260324_phase2.sql" "$SITE_ROOT/private/database/migrations/20260324_phase2.sql"
cp "$CORE_PACKAGE/private/database/migrations/20260326_logistics_module.sql" "$SITE_ROOT/private/database/migrations/20260326_logistics_module.sql"

cp "$CORE_PACKAGE/public/admin/login.php" "$ADMIN_DIR/login.php"
cp "$CORE_PACKAGE/public/admin/logout.php" "$ADMIN_DIR/logout.php"
cp "$CORE_PACKAGE/public/admin/index.php" "$ADMIN_DIR/index.php"
cp "$CORE_PACKAGE/public/admin/dashboard.php" "$ADMIN_DIR/dashboard.php"
cp "$CORE_PACKAGE/public/admin/export.php" "$ADMIN_DIR/export.php"
cp "$CORE_PACKAGE/public/admin/db-setup.php" "$ADMIN_DIR/db-setup.php"
cp "$CORE_PACKAGE/public/admin/client-portal-hub.php" "$ADMIN_DIR/client-portal-hub.php"
mkdir -p "$ADMIN_DIR/partials"
cp "$CORE_PACKAGE/public/admin/partials/"*.php "$ADMIN_DIR/partials/"

cat > "$SITE_ROOT/private/app/config.local.php" <<EOF
<?php
return array(
  'DB_HOST' => '$(printf "%s" "$DB_HOST")',
  'DB_PORT' => '$(printf "%s" "$DB_PORT")',
  'DB_NAME' => '$(printf "%s" "$DB_NAME")',
  'DB_USER' => '$(printf "%s" "$DB_USER")',
  'DB_PASS' => '$(printf "%s" "$DB_PASS")',
  'APP_TIMEZONE' => '$(printf "%s" "$APP_TIMEZONE")',
  'APP_NAME' => '$(printf "%s" "$APP_NAME")',
  'APP_BRAND' => '$(printf "%s" "$APP_BRAND")',
  'CMS_STYLESHEET' => '$(printf "%s" "$CMS_STYLESHEET")',
);
EOF

if [[ "$SKIP_THEME_COPY" == "0" ]]; then
  css_target_rel="${CMS_STYLESHEET#/}"
  css_target="$SITE_ROOT/public/$css_target_rel"
  css_target_dir="$(dirname "$css_target")"
  mkdir -p "$css_target_dir"
  cp "$CORE_PACKAGE/public/assets/cms.css" "$css_target"
fi

# Login submit-lock helper is always copied for auth pages.
mkdir -p "$SITE_ROOT/public/assets"
cp "$CORE_PACKAGE/public/assets/login-submit-lock.js" "$SITE_ROOT/public/assets/login-submit-lock.js"

if [[ "$RUN_DB_BOOTSTRAP" == "1" ]]; then
  mysql --protocol=TCP -h "$DB_HOST" -P "$DB_PORT" -u "$DB_USER" ${DB_PASS:+-p"$DB_PASS"} \
    -e "CREATE DATABASE IF NOT EXISTS \`$DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
  awk 'BEGIN{IGNORECASE=1} !/^[[:space:]]*CREATE[[:space:]]+DATABASE/ && !/^[[:space:]]*USE[[:space:]]+/' \
    "$SITE_ROOT/private/database/schema.sql" \
    | mysql --protocol=TCP -h "$DB_HOST" -P "$DB_PORT" -u "$DB_USER" ${DB_PASS:+-p"$DB_PASS"} "$DB_NAME"
  mysql --protocol=TCP -h "$DB_HOST" -P "$DB_PORT" -u "$DB_USER" ${DB_PASS:+-p"$DB_PASS"} "$DB_NAME" \
    < "$SITE_ROOT/private/database/migrations/20260324_phase2.sql"
  mysql --protocol=TCP -h "$DB_HOST" -P "$DB_PORT" -u "$DB_USER" ${DB_PASS:+-p"$DB_PASS"} "$DB_NAME" \
    < "$SITE_ROOT/private/database/migrations/20260326_logistics_module.sql"
fi

if command -v php >/dev/null 2>&1; then
  php "$SITE_ROOT/private/app/sync-employee-type-dashboards.php" "$SITE_ROOT" || true
else
  echo "Note: php not found in PATH; run role dashboard sync manually:" >&2
  echo "  php $SITE_ROOT/private/app/sync-employee-type-dashboards.php $SITE_ROOT" >&2
fi

cat <<EOF
Install complete.

Site root:           $SITE_ROOT
Admin pages:         $ADMIN_DIR
Installed core from: $CORE_PACKAGE
App name:            $APP_NAME
Brand:               $APP_BRAND
DB (target):         $DB_NAME
CMS stylesheet:      $CMS_STYLESHEET

Note: CMS now runs as an independent copy under this site root.
Bootstrap superuser (change password immediately after first login):
  username: admin
  password: password123
EOF
