#!/bin/bash

# エラー発生時に即座に終了
set -e

# ログファイルの設定
LOG_FILE="/tmp/install_$(date +%Y%m%d_%H%M%S).log"

# エラーハンドリング関数
handle_error() {
    echo "エラー: $1" | tee -a "$LOG_FILE"
    exit 1
}

# ログ出力関数
log_message() {
    echo "$1" | tee -a "$LOG_FILE"
}

# コマンドライン引数を処理する
# $@ はすべての引数を表す
# $# は引数の数を表す
# $1, $2, ... は個別の引数を表す

# デフォルトのインストールモード
INSTALL_MODE="backup"

# 使用方法を表示する関数
show_usage() {
  echo "使用方法: $0 <インストール先のパス> [オプション]"
  echo "オプション:"
  echo "  --mode=backup  既存のディレクトリをバックアップしてからインストール（デフォルト）"
  echo "  --mode=clean   既存のディレクトリを削除してからインストール"
  echo "  --mode=merge   既存のディレクトリとマージしてインストール"
  exit 1
}

# 引数の処理
if [ $# -eq 0 ]; then
  show_usage
fi

# インストール先のパスを絶対パスに変換
INSTALL_PATH="$(realpath "$1")" || handle_error "パスの解決に失敗しました: $1"
shift

# オプションの処理
while [ $# -gt 0 ]; do
  case "$1" in
    --mode=*)
      INSTALL_MODE="${1#--mode=}"
      if [[ ! "$INSTALL_MODE" =~ ^(backup|clean|merge)$ ]]; then
        handle_error "無効なモード '$INSTALL_MODE' が指定されました。"
      fi
      ;;
    *)
      handle_error "無効なオプション '$1' が指定されました。"
      ;;
  esac
  shift
done

# インストール先のディレクトリが存在しない場合は作成
if [ ! -d "$INSTALL_PATH" ]; then
  mkdir -p "$INSTALL_PATH" || handle_error "インストール先ディレクトリの作成に失敗しました: $INSTALL_PATH"
  log_message "インストール先ディレクトリを作成しました: $INSTALL_PATH"
fi

# バックアップディレクトリの設定
BACKUP_DIR="${INSTALL_PATH}/backups/$(date +%Y%m%d_%H%M%S)"

# コピーするファイル/ディレクトリのリスト
DIRS_TO_COPY=(
  "AJAX"
  "APP"
  "blogs"
  "css"
  "img"
  "QR"
  "QR2"
  "SS"
  "test"
  "tmp"
  "wp-content/plugins/Chat_Control"
  "wp-content/plugins/ChatWidget"
  "wp-content/plugins/Game_Result"
  "wp-content/plugins/League_Schedule"
  "wp-content/plugins/Member_List"
  "wp-content/plugins/Presult"
  "wp-content/plugins/Setup_Division"
  "wp-content/plugins/Setup_Order"
  "wp-content/plugins/Setup_Schedule"
  "wp-content/plugins/Setup_TeamMember"
  "wp-content/plugins/update_Schedule"
  "wp-content/plugins/DragDrop.js"
  "wp-content/themes/light-league"
)

log_message "インストール前チェックを開始します..."
log_message "インストール先: $INSTALL_PATH"
log_message "インストールモード: $INSTALL_MODE"
log_message ""
log_message "コピー対象ファイル/ディレクトリ一覧:"
for path in "${DIRS_TO_COPY[@]}"; do
  log_message "- $path"
done
log_message ""

# 事前チェック
has_error=false
log_message "インストール元のファイル/ディレクトリ確認中..."
for path in "${DIRS_TO_COPY[@]}"; do
  if [ ! -e "$path" ]; then
    log_message "警告: インストール元の $path が見つかりません。スキップします。"
    has_error=true
    continue
  fi

  # コピー先に同名のファイル/ディレクトリが存在するかチェック
  target_path="$INSTALL_PATH/$path"
  if [ -e "$target_path" ]; then
    case "$INSTALL_MODE" in
      backup)
        log_message "情報: $target_path は既に存在します。バックアップを作成します。"
        ;;
      clean)
        log_message "情報: $target_path は既に存在します。削除されます。"
        ;;
      merge)
        if [ -d "$path" ]; then
          log_message "情報: $target_path は既に存在します。マージされます。"
        else
          log_message "情報: $target_path は既に存在します。上書きされます。"
        fi
        ;;
    esac
  fi
done
log_message ""

if [ "$has_error" = true ]; then
  log_message "警告: 一部のインストール元ファイル/ディレクトリが見つかりませんでした。"
  read -p "続行しますか？ (y/N): " confirm
  if [ "$confirm" != "y" ]; then
    log_message "インストールを中止します。"
    exit 1
  fi
else
  log_message "事前チェックが完了しました。すべてのインストール元ファイル/ディレクトリが存在します。"
fi

# 実行確認
read -p "インストールを実行しますか？ (y/N): " confirm
if [ "$confirm" != "y" ]; then
  log_message "インストールを中止します。"
  exit 1
fi

log_message "インストールを開始します..."

# バックアップモードの場合、バックアップディレクトリを作成
if [ "$INSTALL_MODE" = "backup" ]; then
  mkdir -p "$BACKUP_DIR"
fi

# 各ファイル/ディレクトリのコピー処理
for path in "${DIRS_TO_COPY[@]}"; do
  if [ ! -e "$path" ]; then
    log_message "警告: インストール元の $path が見つかりません。スキップします。"
    continue
  fi

  log_message "$path をコピーしています..."
  # 親ディレクトリのパスを作成
  parent_dir="$INSTALL_PATH/$(dirname "$path")"
  mkdir -p "$parent_dir"
  target_path="$INSTALL_PATH/$path"

  # 既存ファイル/ディレクトリの処理
  if [ -e "$target_path" ]; then
    case "$INSTALL_MODE" in
      backup)
        backup_path="${BACKUP_DIR}/$path"
        mkdir -p "$(dirname "$backup_path")"
        log_message "バックアップを作成中: $backup_path"
        mv "$target_path" "$backup_path"
        ;;
      clean)
        log_message "既存のファイル/ディレクトリを削除中: $target_path"
        rm -rf "$target_path"
        ;;
      merge)
        if [ -d "$path" ]; then
          log_message "既存のディレクトリとマージします: $target_path"
        else
          log_message "既存のファイルを上書きします: $target_path"
          rm -f "$target_path"
        fi
        ;;
    esac
  fi

  # ファイル/ディレクトリのコピー
  cp -rp "$path" "$parent_dir/" || handle_error "$path のコピーに失敗しました。"
  log_message "$path のコピーが完了しました。"
done

log_message "インストールが完了しました。"
log_message "ログファイル: $LOG_FILE"

# バックアップモードの場合、バックアップの場所を表示
if [ "$INSTALL_MODE" = "backup" ] && [ -d "$BACKUP_DIR" ]; then
  log_message "バックアップは以下の場所に保存されました: $BACKUP_DIR"
fi

