#!/bin/bash
# =============================================================================
# Connect-CMS V2 自動インストールスクリプト（Xserver用・サブドメイン対応）
# =============================================================================
#
# 【概要】
#   XserverへのConnect-CMS V2インストールを対話形式で自動化するスクリプト。
#   git clone からシンボリックリンク作成まで全ステップを自動実行する。
#
# 【対応環境】
#   - サーバー    : Xserver（レンタルサーバー）
#   - PHP         : 8.1 〜 8.3（自動検出: php83 → php82 → php81 の優先順）
#   - Laravel     : 10.x
#   - DB文字コード: utf8mb4
#   - プロトコル  : HTTPS前提（SESSION_SECURE_COOKIE=true を自動設定）
#   - サブドメイン: 対応あり
#
# 【V1との主な違い】
#   - PHP 8.1以上必須（V1は7.4以上）
#   - Laravel 10（V1はLaravel 8）
#   - DB文字コードが utf8mb4（V1は utf8）
#   - git checkout 2 でV2ブランチに切り替えが必要
#   - .env の MAIL_DRIVER → MAIL_MAILER に変更済み
#
# 【使い方】
#   1. FileZillaでホームディレクトリ（/home/USERNAME/）にアップロード
#   2. SSH接続後、ホームディレクトリで以下を実行
#      $ chmod +x install_connect_cms_v2.sh
#      $ ./install_connect_cms_v2.sh
#
# 【事前準備】（スクリプト実行前に完了させること）
#   1. XserverのSSL設定で対象ドメインのHTTPS（無料SSL）を有効化
#   2. Xserverのデータベース管理でDBを作成（文字コード: utf8mb4）
#      - サーバーパネル → MySQL設定
#        ① MySQLデータベース追加
#        ② MySQLユーザー追加
#        ③ MySQLデータベース一覧でDBとユーザーを紐付け
#   3. SSH接続できる状態にする（2段階認証設定済み）
#   4. サブドメインの場合はXserverのサブドメイン設定を完了させる
#
# 【入力項目一覧】（STEP 1 で入力）
#   - ドメイン種別    : 1=メインドメイン / 2=サブドメイン
#   - 親ドメイン名    : サブドメイン選択時のみ（例: susumu.cyou）
#   - サブドメイン名  : サブドメイン選択時のみ（例: test1.susumu.cyou）
#   - ドメイン名      : メインドメイン選択時（Enterでデフォルト値）
#   - インストール先  : Enterで推奨パスを自動設定
#   - DB名            : Enterで USERNAME_connectcms を使用
#   - DBユーザー名    : Enterで USERNAME を使用
#   - DBパスワード    : 必須・非表示入力
#   - 送信元メール    : メール送信に使用するアドレス
#   - SMTPホスト      : Enterで smtp.example.com を使用
#   - SMTPポート      : Enterで 587 を使用
#   - SMTPユーザー名  : メール認証ユーザー名
#   - SMTPパスワード  : 非表示入力
#
# 【実行ステップ】
#   STEP 0: 事前確認（SSL・DB・SSH）
#   STEP 1: インストール設定の入力
#   STEP 2: PHPバージョン設定（$HOME/bin/php にシンボリックリンク作成）
#   STEP 3: git clone + V2ブランチ「2」切り替え + 最新安定版タグに切り替え
#   STEP 4: Composerインストール（allow_url_fopen=1 付き）
#   STEP 5: .env 自動生成・APP_KEY生成
#   STEP 6: DBマイグレーション・Seeder
#   STEP 7: シンボリックリンク作成（既存ディレクトリは _old にリネーム）
#   STEP 8: キャッシュクリア（config / cache / view）
#
# 【ディレクトリ構成（サブドメイン test1.◯◯◯.com の例）】
#   ~/◯◯◯.com/
#     ├── connect-cms-test1/        ← インストール先（非公開）
#     │     ├── .env
#     │     ├── public/             ← Webに公開するのはここのみ
#     │     └── ...
#     └── public_html/
#           └── test1.◯◯◯.com/ → connect-cms-test1/public/ （シンボリックリンク）
#
# 【トラブルシューティング】
#   - PHPバージョンエラー     : ls /usr/bin/php* で利用可能なバイナリを確認
#   - git checkout 2 エラー   : git checkout master && git pull 後に再実行
#   - composer installエラー  : php -d allow_url_fopen=1 composer.phar install --no-dev
#   - DBエラー                : .env の DB_DATABASE / DB_USERNAME / DB_PASSWORD を確認
#   - HTTPS後ログイン不可     : https:// でアクセスしているか確認（httpは不可）
#   - シンボリックリンクエラー: ls -la ~/ドメイン/public_html/ で状態確認後、手動リネーム
#   - 500エラー               : storage/logs/laravel-*.log を確認
#
# 【関連ファイル】
#   - install_connect_cms_v1.sh : V1用インストールスクリプト
#   - connect-cms-v2-install-spec.docx : 詳細仕様書
#
# 【更新履歴】
#   2026-03-28 初版作成
#   2026-04-07 修正: set -euo pipefail に強化、composer.phar後片付け追加
#
# =============================================================================

set -euo pipefail

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m'

info()    { echo -e "${BLUE}[INFO]${NC} $1"; }
success() { echo -e "${GREEN}[OK]${NC}   $1"; }
warn()    { echo -e "${YELLOW}[WARN]${NC} $1"; }
error()   { echo -e "${RED}[ERROR]${NC} $1"; exit 1; }
step()    { echo -e "\n${BOLD}${CYAN}========================================${NC}"; \
            echo -e "${BOLD}${CYAN}  $1${NC}"; \
            echo -e "${BOLD}${CYAN}========================================${NC}"; }

clear
echo -e "${BOLD}${BLUE}"
echo "  ____                            _        ____ __  __ ____"
echo " / ___|___  _ __  _ __   ___  ___| |_     / ___|  \/  / ___|"
echo "| |   / _ \| '_ \| '_ \ / _ \/ __| __|   | |   | |\/| \___ \\"
echo "| |__| (_) | | | | | | |  __/ (__| |_    | |___| |  | |___) |"
echo " \____\___/|_| |_|_| |_|\___|\___|\__|    \____|_|  |_|____/"
echo -e "${NC}"
echo -e "${BOLD}  V2 自動インストールスクリプト for Xserver${NC}"
echo -e "  ${CYAN}HTTPS前提 / PHP 8.1以上 / Laravel 10 / サブドメイン対応${NC}"
echo ""

# -----------------------------------------------------------------------------
# STEP 0: 事前確認
# -----------------------------------------------------------------------------
step "STEP 0: 事前確認"
echo ""
warn "このスクリプトを実行する前に以下が完了していることを確認してください："
echo ""
echo "  1. XserverのSSL設定でHTTPS（無料SSL）を有効にしている"
echo "  2. Xserverのデータベース管理でDBを作成済み（文字コード: utf8mb4）"
echo "  3. SSH接続済みであること"
echo "  4. サブドメインを使う場合はXserverのサブドメイン設定済みであること"
echo ""
read -p "上記を確認しました。インストールを開始しますか？ [y/N]: " confirm
[[ "$confirm" =~ ^[Yy]$ ]] || { echo "インストールを中止しました。"; exit 0; }

# -----------------------------------------------------------------------------
# STEP 1: インストール設定の入力
# -----------------------------------------------------------------------------
step "STEP 1: インストール設定の入力"
echo ""

USERNAME=$(whoami)
info "サーバーID（USERNAME）を自動検出: ${BOLD}${USERNAME}${NC}"
echo ""

# ドメイン種別の選択
echo "インストール先のドメイン種別を選択してください："
echo "  1) メインドメイン / 独自ドメイン（例: susumu.cyou）"
echo "  2) サブドメイン（例: test1.susumu.cyou）"
echo ""
read -p "選択 [1/2]: " DOMAIN_TYPE
echo ""

if [[ "$DOMAIN_TYPE" == "2" ]]; then
    read -p "親ドメイン名（例: susumu.cyou）: " PARENT_DOMAIN
    [[ -z "$PARENT_DOMAIN" ]] && error "親ドメイン名は必須です"

    read -p "サブドメイン名（例: test1.susumu.cyou）: " SUBDOMAIN
    [[ -z "$SUBDOMAIN" ]] && error "サブドメイン名は必須です"

    DOMAIN="$SUBDOMAIN"
    PUBLIC_HTML_DIR="${HOME}/${PARENT_DOMAIN}/public_html/${SUBDOMAIN}"
    DEFAULT_INSTALL_DIR="${HOME}/${PARENT_DOMAIN}/connect-cms-${SUBDOMAIN%%.*}"
    info "アクセスURL        : ${BOLD}https://${DOMAIN}${NC}"
    info "公開ディレクトリ   : ${BOLD}${PUBLIC_HTML_DIR}${NC}"
else
    DEFAULT_DOMAIN="${USERNAME}.xsrv.jp"
    read -p "ドメイン名 [${DEFAULT_DOMAIN}]: " INPUT_DOMAIN
    DOMAIN="${INPUT_DOMAIN:-$DEFAULT_DOMAIN}"

    PUBLIC_HTML_DIR="${HOME}/${DOMAIN}/public_html"
    DEFAULT_INSTALL_DIR="${HOME}/${DOMAIN}/connect-cms"
    info "アクセスURL        : ${BOLD}https://${DOMAIN}${NC}"
    info "公開ディレクトリ   : ${BOLD}${PUBLIC_HTML_DIR}${NC}"
fi

echo ""
read -p "インストールディレクトリ [${DEFAULT_INSTALL_DIR}]: " INPUT_INSTALL_DIR
INSTALL_DIR="${INPUT_INSTALL_DIR:-$DEFAULT_INSTALL_DIR}"
info "インストール先: ${BOLD}${INSTALL_DIR}${NC}"
echo ""

# DB設定
info "データベース設定を入力してください"
read -p "DB名 [${USERNAME}_connectcms]: " INPUT_DB_NAME
DB_NAME="${INPUT_DB_NAME:-${USERNAME}_connectcms}"

read -p "DBユーザー名 [${USERNAME}]: " INPUT_DB_USER
DB_USER="${INPUT_DB_USER:-${USERNAME}}"

read -s -p "DBパスワード: " DB_PASS
echo ""
[[ -z "$DB_PASS" ]] && error "DBパスワードは必須です"

# メール設定
echo ""
info "メール設定を入力してください"
read -p "送信元メールアドレス: " MAIL_FROM
read -p "SMTPホスト [smtp.example.com]: " INPUT_MAIL_HOST
MAIL_HOST="${INPUT_MAIL_HOST:-smtp.example.com}"
read -p "SMTPポート [Xserverは587、他サーバーは要確認]: " INPUT_MAIL_PORT
MAIL_PORT="${INPUT_MAIL_PORT:-587}"
read -p "SMTPユーザー名: " MAIL_USER
read -s -p "SMTPパスワード: " MAIL_PASS
echo ""
read -p "メール暗号化 [Xserverは tls、暗号化なしの場合は空Enter]: " INPUT_MAIL_ENC
MAIL_ENC="${INPUT_MAIL_ENC:-tls}"
echo ""

# 設定確認
echo ""
step "入力内容の確認"
echo ""
echo -e "  アクセスURL      : ${BOLD}https://${DOMAIN}${NC}"
echo -e "  インストール先   : ${BOLD}${INSTALL_DIR}${NC}"
echo -e "  公開ディレクトリ : ${BOLD}${PUBLIC_HTML_DIR}${NC}"
echo -e "  DB名             : ${BOLD}${DB_NAME}${NC}"
echo -e "  DBユーザー       : ${BOLD}${DB_USER}${NC}"
echo -e "  送信元メール     : ${BOLD}${MAIL_FROM}${NC}"
echo -e "  SMTPホスト       : ${BOLD}${MAIL_HOST}:${MAIL_PORT}${NC}"
  echo -e "  メール暗号化     : ${BOLD}${MAIL_ENC:-（なし）}${NC}"
echo ""
read -p "この設定でインストールしますか？ [y/N]: " confirm2
[[ "$confirm2" =~ ^[Yy]$ ]] || { echo "インストールを中止しました。"; exit 0; }

# -----------------------------------------------------------------------------
# STEP 2: PHPバージョン設定
# -----------------------------------------------------------------------------
step "STEP 2: PHPバージョン設定"
echo ""

info "利用可能なPHPバイナリを検索中..."
PHP_BINS=$(ls /usr/bin/php8* 2>/dev/null || true)
[[ -z "$PHP_BINS" ]] && error "PHP 8.x のバイナリが見つかりません"

echo ""
info "見つかったPHPバイナリ:"
for bin in $PHP_BINS; do
    echo "    $bin  ($($bin -r 'echo PHP_VERSION;' 2>/dev/null || echo '取得失敗'))"
done
echo ""

PHP_BIN=""
for candidate in php8.3 php8.2 php8.1 php83 php82 php81; do
    if [[ -x "/usr/bin/${candidate}" ]]; then
        PHP_BIN="/usr/bin/${candidate}"
        break
    fi
done

if [[ -z "$PHP_BIN" ]]; then
    read -p "使用するPHPバイナリのフルパスを入力してください: " PHP_BIN
    [[ -x "$PHP_BIN" ]] || error "指定されたPHPバイナリが見つかりません: ${PHP_BIN}"
fi

info "使用するPHP: ${BOLD}${PHP_BIN}${NC} ($(${PHP_BIN} -r 'echo PHP_VERSION;'))"
mkdir -p "$HOME/bin"
ln -sf "$PHP_BIN" "$HOME/bin/php"

if ! grep -q 'export PATH=$HOME/bin:$PATH' "$HOME/.bashrc" 2>/dev/null; then
    echo 'export PATH=$HOME/bin:$PATH' >> "$HOME/.bashrc"
fi
export PATH="$HOME/bin:$PATH"

PHP_VERSION=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
php -r 'if(PHP_MAJOR_VERSION < 8 || (PHP_MAJOR_VERSION == 8 && PHP_MINOR_VERSION < 1)) { exit(1); }' \
    || error "PHP 8.1以上が必要ですが ${PHP_VERSION} が検出されました"
success "PHPバージョン設定完了（${PHP_VERSION}）"

# -----------------------------------------------------------------------------
# STEP 3: git clone + V2ブランチ切り替え
# -----------------------------------------------------------------------------
step "STEP 3: Connect-CMS V2 取得"
echo ""

PARENT_DIR=$(dirname "$INSTALL_DIR")
mkdir -p "$PARENT_DIR"
cd "$PARENT_DIR"

if [[ -d "$INSTALL_DIR" ]]; then
    warn "インストール先ディレクトリが既に存在します: ${INSTALL_DIR}"
    read -p "削除して続行しますか？ [y/N]: " del_confirm
    [[ "$del_confirm" =~ ^[Yy]$ ]] || error "インストールを中止しました"
    rm -rf "$INSTALL_DIR"
fi

# git操作にはユーザー設定が必要なため事前に確認・設定する
if [[ -z "$(git config --global user.email)" ]]; then
    info "gitユーザー設定がないため自動設定します..."
    git config --global user.email "${USERNAME}@sv14609.xserver.jp"
    git config --global user.name "${USERNAME}"
    success "gitユーザー設定完了"
fi

info "git clone 実行中..."
git clone https://github.com/opensource-workshop/connect-cms.git "$(basename $INSTALL_DIR)"
cd "$INSTALL_DIR"

info "V2ブランチに切り替え中..."
git checkout master && git pull
git checkout 2
LATEST_TAG=$(git describe --tags --abbrev=0)
git checkout "$LATEST_TAG"
success "V2最新安定版 ${BOLD}${LATEST_TAG}${NC} に切り替え完了"

# -----------------------------------------------------------------------------
# STEP 4: Composerインストール
# -----------------------------------------------------------------------------
step "STEP 4: Composerインストール"
echo ""

info "Composerをダウンロード中..."
curl -sS https://getcomposer.org/installer | php
success "Composer ダウンロード完了"

info "依存ライブラリをインストール中（数分かかります）..."
php -d allow_url_fopen=1 composer.phar install --no-dev --no-interaction
success "Composerインストール完了"

info "composer.phar を削除中..."
rm -f composer.phar
success "composer.phar を削除しました"

# -----------------------------------------------------------------------------
# STEP 5: .env 自動生成
# -----------------------------------------------------------------------------
step "STEP 5: .env 設定"
echo ""

cp .env.example .env
sed -i "s|APP_URL=http://localhost|APP_URL=https://${DOMAIN}|" .env
sed -i "s|DB_DATABASE=laravel|DB_DATABASE=${DB_NAME}|" .env
sed -i "s|DB_USERNAME=root|DB_USERNAME=${DB_USER}|" .env
sed -i "s|DB_PASSWORD=|DB_PASSWORD=${DB_PASS}|" .env
sed -i "s|MAIL_HOST=smtp.mailtrap.io|MAIL_HOST=${MAIL_HOST}|" .env
sed -i "s|MAIL_PORT=2525|MAIL_PORT=${MAIL_PORT}|" .env
sed -i "s|MAIL_USERNAME=null|MAIL_USERNAME=${MAIL_USER}|" .env
sed -i "s|MAIL_PASSWORD=null|MAIL_PASSWORD=${MAIL_PASS}|" .env
sed -i "s|MAIL_ENCRYPTION=null|MAIL_ENCRYPTION=${MAIL_ENC}|" .env
sed -i "s|MAIL_FROM_ADDRESS=null|MAIL_FROM_ADDRESS=${MAIL_FROM}|" .env
sed -i "s|#SESSION_SECURE_COOKIE=true|SESSION_SECURE_COOKIE=true|" .env

info "APP_KEY を生成中..."
php artisan key:generate --force
success ".env 設定・APP_KEY 生成完了"

# -----------------------------------------------------------------------------
# STEP 6: DBマイグレーション・Seeder
# -----------------------------------------------------------------------------
step "STEP 6: データベース初期構築"
echo ""

info "DBマイグレーション実行中..."
php artisan migrate --force || error "DBマイグレーション失敗。DB設定を確認してください"
success "DBマイグレーション完了"

info "初期データを投入中..."
php artisan db:seed --force
success "Seeder完了"

# -----------------------------------------------------------------------------
# STEP 7: シンボリックリンク作成
# -----------------------------------------------------------------------------
step "STEP 7: シンボリックリンク作成"
echo ""

info "公開ディレクトリ: ${BOLD}${PUBLIC_HTML_DIR}${NC}"

if [[ -d "$PUBLIC_HTML_DIR" && ! -L "$PUBLIC_HTML_DIR" ]]; then
    info "既存のディレクトリを ${PUBLIC_HTML_DIR}_old にリネーム中..."
    mv "$PUBLIC_HTML_DIR" "${PUBLIC_HTML_DIR}_old"
    success "リネーム完了"
fi

if [[ -L "$PUBLIC_HTML_DIR" ]]; then
    warn "シンボリックリンクが既に存在します。上書きします。"
    rm "$PUBLIC_HTML_DIR"
fi

mkdir -p "$(dirname $PUBLIC_HTML_DIR)"
ln -s "${INSTALL_DIR}/public" "$PUBLIC_HTML_DIR"
success "シンボリックリンク作成完了"
info "  ${PUBLIC_HTML_DIR} -> ${INSTALL_DIR}/public"

# -----------------------------------------------------------------------------
# STEP 8: キャッシュクリア
# -----------------------------------------------------------------------------
step "STEP 8: キャッシュクリア"
echo ""

php artisan config:clear
php artisan cache:clear
php artisan view:clear
success "キャッシュクリア完了"

# -----------------------------------------------------------------------------
# 完了
# -----------------------------------------------------------------------------
echo ""
echo -e "${BOLD}${GREEN}"
echo "  ================================================"
echo "   インストール完了！"
echo "  ================================================"
echo -e "${NC}"
echo -e "  サイトURL     : ${BOLD}https://${DOMAIN}${NC}"
echo -e "  インストール先: ${BOLD}${INSTALL_DIR}${NC}"
echo -e "  バージョン    : ${BOLD}${LATEST_TAG}${NC}"
echo ""
echo -e "${YELLOW}  【重要】ログイン後にIDとパスワードを必ず変更してください${NC}"
echo "  初期ログイン情報:"
echo "  https://github.com/opensource-workshop/connect-cms/blob/master/database/seeders/DefaultUsersTableSeeder.php"
echo ""
echo -e "${CYAN}  公式サイト: https://connect-cms.jp${NC}"
echo ""
