#!/bin/bash

# ptyGitSubtree - Git Subtree 관리 통합 스크립트
# 사용법: ptyGitSubtree [명령] [옵션]

# 색상 정의
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
MAGENTA='\033[0;35m'
NC='\033[0m' # No Color
BOLD='\033[1m'
DIM='\033[2m'

# 현재 등록된 subtree 목록 표시
show_subtrees() {
    echo -e "${BOLD}${CYAN}════════════════════════════════════════════════════════════════════════════════${NC}"
    echo -e "${BOLD}${CYAN}                              현재 Git Subtree 정보${NC}"
    echo -e "${BOLD}${CYAN}════════════════════════════════════════════════════════════════════════════════${NC}"
    echo ""

    # git remote 목록 가져오기
    local remotes=$(git remote 2>/dev/null)

    if [ -z "$remotes" ]; then
        echo -e "  ${YELLOW}등록된 remote가 없습니다.${NC}"
        echo ""
        return
    fi

    local found_subtree=false

    # 각 remote에 대해 subtree인지 확인
    for remote in $remotes; do
        # origin은 일반적으로 subtree가 아님
        if [ "$remote" = "origin" ]; then
            continue
        fi

        local url=$(git remote get-url "$remote" 2>/dev/null)
        local folder="$remote"

        # 해당 폴더가 존재하고 subtree 커밋 이력이 있는지 확인
        if [ -d "$folder" ]; then
            local squash_commit=$(git log --oneline --grep="git-subtree-dir: $folder" -1 2>/dev/null)
            local split_commit=$(git log --oneline --all --grep="Squashed '$folder/'" -1 2>/dev/null)

            if [ -n "$squash_commit" ] || [ -n "$split_commit" ]; then
                found_subtree=true

                echo -e "${BOLD}${YELLOW}[$folder]${NC}"
                echo -e "  ${GREEN}Remote:${NC}    $remote"
                echo -e "  ${GREEN}URL:${NC}       $url"

                # 폴더 정보
                local file_count=$(find "$folder" -type f 2>/dev/null | wc -l | tr -d ' ')
                local folder_size=$(du -sh "$folder" 2>/dev/null | cut -f1)
                echo -e "  ${GREEN}폴더:${NC}      $folder/ (${file_count}개 파일, ${folder_size})"

                # 마지막 subtree 작업 커밋
                local last_subtree_commit=$(git log --oneline --grep="git-subtree-dir: $folder" -1 2>/dev/null || \
                                            git log --oneline --all --grep="Squashed '$folder/'" -1 2>/dev/null)
                if [ -n "$last_subtree_commit" ]; then
                    echo -e "  ${GREEN}최근 동기화:${NC} $last_subtree_commit"
                fi

                # 마지막 커밋 날짜
                local last_date=$(git log --format="%ar" --grep="git-subtree-dir: $folder" -1 2>/dev/null || \
                                  git log --format="%ar" --all --grep="Squashed '$folder/'" -1 2>/dev/null)
                if [ -n "$last_date" ]; then
                    echo -e "  ${GREEN}동기화 시점:${NC} ${DIM}$last_date${NC}"
                fi

                echo ""
            fi
        fi
    done

    # subtree 커밋 로그에서 추가 정보 찾기 (remote가 없는 경우 대비)
    local subtree_dirs=$(git log --oneline --all 2>/dev/null | grep -oE "Squashed '[^']+/'" | sed "s/Squashed '//g" | sed "s/\/'//g" | sort -u)

    for dir in $subtree_dirs; do
        # 이미 표시된 것은 건너뛰기
        if git remote get-url "$dir" > /dev/null 2>&1; then
            continue
        fi

        if [ -d "$dir" ]; then
            found_subtree=true

            echo -e "${BOLD}${YELLOW}[$dir]${NC} ${RED}(remote 미등록)${NC}"

            local file_count=$(find "$dir" -type f 2>/dev/null | wc -l | tr -d ' ')
            local folder_size=$(du -sh "$dir" 2>/dev/null | cut -f1)
            echo -e "  ${GREEN}폴더:${NC}      $dir/ (${file_count}개 파일, ${folder_size})"

            local last_commit=$(git log --oneline --all --grep="Squashed '$dir/'" -1 2>/dev/null)
            if [ -n "$last_commit" ]; then
                echo -e "  ${GREEN}최근 동기화:${NC} $last_commit"
            fi

            echo -e "  ${YELLOW}힌트:${NC} ${DIM}remote 등록: git remote add $dir <URL>${NC}"
            echo ""
        fi
    done

    if [ "$found_subtree" = false ]; then
        echo -e "  ${YELLOW}등록된 subtree가 없습니다.${NC}"
        echo ""
        echo -e "  ${DIM}새 subtree 추가:${NC}"
        echo -e "  ${CYAN}ptyGitSubtree add <폴더명> <remote주소> [브랜치명]${NC}"
    fi
}

# subtree 히스토리 표시
show_history() {
    echo -e "${BOLD}${CYAN}════════════════════════════════════════════════════════════════════════════════${NC}"
    echo -e "${BOLD}${CYAN}                              Git Subtree 히스토리${NC}"
    echo -e "${BOLD}${CYAN}════════════════════════════════════════════════════════════════════════════════${NC}"
    echo ""

    # 모든 subtree 관련 커밋
    git log --oneline --all --grep="git-subtree" --decorate -20 2>/dev/null

    if [ $? -ne 0 ] || [ -z "$(git log --oneline --all --grep="git-subtree" -1 2>/dev/null)" ]; then
        # 대안: Squashed 커밋 찾기
        git log --oneline --all --grep="Squashed '" --decorate -20 2>/dev/null
    fi

    echo ""
}

# subtree 추가
do_add() {
    local folder_name="$1"
    local remote_url="$2"
    local branch="${3:-main}"

    if [ -z "$folder_name" ] || [ -z "$remote_url" ]; then
        echo -e "${RED}사용법: ptyGitSubtree add <폴더명> <remote주소> [브랜치명]${NC}"
        echo -e "${DIM}예시: ptyGitSubtree add ptyLibrary_PHP https://gitlab.platyhouse.com/platyhouse/ptyLibrary_PHP${NC}"
        return 1
    fi

    # 폴더가 이미 존재하는지 확인
    if [ -d "$folder_name" ]; then
        echo -e "${RED}오류: '$folder_name' 폴더가 이미 존재합니다.${NC}"
        return 1
    fi

    # remote 등록 (이미 있으면 URL 업데이트)
    if git remote get-url "$folder_name" > /dev/null 2>&1; then
        git remote set-url "$folder_name" "$remote_url"
        echo -e "${GREEN}Remote '$folder_name' URL 업데이트됨${NC}"
    else
        git remote add "$folder_name" "$remote_url"
        echo -e "${GREEN}Remote '$folder_name' 등록됨${NC}"
    fi

    echo ""
    echo -e "${CYAN}Subtree 추가 중...${NC}"
    echo -e "  ${GREEN}폴더:${NC}   $folder_name"
    echo -e "  ${GREEN}Remote:${NC} $folder_name ($remote_url)"
    echo -e "  ${GREEN}브랜치:${NC} $branch"
    echo ""

    git subtree add --prefix="$folder_name" "$folder_name" "$branch" --squash

    if [ $? -eq 0 ]; then
        echo ""
        echo -e "${GREEN}완료: '$folder_name' subtree가 추가되었습니다.${NC}"
    else
        echo ""
        echo -e "${RED}오류: subtree 추가에 실패했습니다.${NC}"
        # 실패 시 remote 제거
        git remote remove "$folder_name" 2>/dev/null
        return 1
    fi
}

# subtree pull
do_pull() {
    local folder_name="$1"
    local branch="${2:-main}"

    if [ -z "$folder_name" ]; then
        echo -e "${RED}사용법: ptyGitSubtree pull <폴더명> [브랜치명]${NC}"
        echo -e "${DIM}예시: ptyGitSubtree pull ptyLibrary_PHP${NC}"
        return 1
    fi

    # 폴더가 존재하는지 확인
    if [ ! -d "$folder_name" ]; then
        echo -e "${RED}오류: '$folder_name' 폴더가 존재하지 않습니다.${NC}"
        return 1
    fi

    # remote가 등록되어 있는지 확인
    if ! git remote get-url "$folder_name" > /dev/null 2>&1; then
        echo -e "${RED}오류: '$folder_name' remote가 등록되어 있지 않습니다.${NC}"
        echo -e "${DIM}먼저 ptyGitSubtree add로 subtree를 추가하거나, git remote add로 remote를 등록하세요.${NC}"
        return 1
    fi

    echo -e "${CYAN}Subtree pull 중...${NC}"
    echo -e "  ${GREEN}폴더:${NC}   $folder_name"
    echo -e "  ${GREEN}브랜치:${NC} $branch"
    echo ""

    git subtree pull --prefix="$folder_name" "$folder_name" "$branch" --squash

    if [ $? -eq 0 ]; then
        echo ""
        echo -e "${GREEN}완료: '$folder_name' subtree가 업데이트되었습니다.${NC}"
    else
        echo ""
        echo -e "${RED}오류: subtree pull에 실패했습니다.${NC}"
        return 1
    fi
}

# subtree push
do_push() {
    local folder_name="$1"
    local branch="${2:-main}"

    if [ -z "$folder_name" ]; then
        echo -e "${RED}사용법: ptyGitSubtree push <폴더명> [브랜치명]${NC}"
        echo -e "${DIM}예시: ptyGitSubtree push ptyLibrary_PHP${NC}"
        return 1
    fi

    # 폴더가 존재하는지 확인
    if [ ! -d "$folder_name" ]; then
        echo -e "${RED}오류: '$folder_name' 폴더가 존재하지 않습니다.${NC}"
        return 1
    fi

    # remote가 등록되어 있는지 확인
    if ! git remote get-url "$folder_name" > /dev/null 2>&1; then
        echo -e "${RED}오류: '$folder_name' remote가 등록되어 있지 않습니다.${NC}"
        echo -e "${DIM}먼저 ptyGitSubtree add로 subtree를 추가하거나, git remote add로 remote를 등록하세요.${NC}"
        return 1
    fi

    echo -e "${CYAN}Subtree push 중...${NC}"
    echo -e "  ${GREEN}폴더:${NC}   $folder_name"
    echo -e "  ${GREEN}브랜치:${NC} $branch"
    echo ""

    git subtree push --prefix="$folder_name" "$folder_name" "$branch"

    if [ $? -eq 0 ]; then
        echo ""
        echo -e "${GREEN}완료: '$folder_name' subtree가 push되었습니다.${NC}"
    else
        echo ""
        echo -e "${RED}오류: subtree push에 실패했습니다.${NC}"
        return 1
    fi
}

# remote 등록 (폴더가 이미 존재하는 경우)
do_register() {
    local folder_name="$1"
    local remote_url="$2"

    if [ -z "$folder_name" ] || [ -z "$remote_url" ]; then
        echo -e "${RED}사용법: ptyGitSubtree register <폴더명> <remote주소>${NC}"
        echo -e "${DIM}이미 존재하는 subtree 폴더에 remote를 등록합니다.${NC}"
        return 1
    fi

    # 폴더가 존재하는지 확인
    if [ ! -d "$folder_name" ]; then
        echo -e "${RED}오류: '$folder_name' 폴더가 존재하지 않습니다.${NC}"
        echo -e "${DIM}새 subtree를 추가하려면 'ptyGitSubtree add'를 사용하세요.${NC}"
        return 1
    fi

    # remote 등록 (이미 있으면 URL 업데이트)
    if git remote get-url "$folder_name" > /dev/null 2>&1; then
        git remote set-url "$folder_name" "$remote_url"
        echo -e "${GREEN}Remote '$folder_name' URL이 업데이트되었습니다.${NC}"
    else
        git remote add "$folder_name" "$remote_url"
        echo -e "${GREEN}Remote '$folder_name'가 등록되었습니다.${NC}"
    fi

    echo -e "  ${GREEN}URL:${NC} $remote_url"
}

# remote 삭제
do_unregister() {
    local folder_name="$1"

    if [ -z "$folder_name" ]; then
        echo -e "${RED}사용법: ptyGitSubtree unregister <폴더명>${NC}"
        echo -e "${DIM}subtree의 remote 등록을 해제합니다. (폴더는 삭제되지 않음)${NC}"
        return 1
    fi

    if git remote get-url "$folder_name" > /dev/null 2>&1; then
        git remote remove "$folder_name"
        echo -e "${GREEN}Remote '$folder_name'가 삭제되었습니다.${NC}"
        echo -e "${DIM}폴더 '$folder_name/'는 그대로 유지됩니다.${NC}"
    else
        echo -e "${YELLOW}Remote '$folder_name'가 등록되어 있지 않습니다.${NC}"
    fi
}

# 도움말
show_help() {
    echo -e "${BOLD}${CYAN}ptyGitSubtree${NC} - Git Subtree 관리 도구"
    echo ""
    echo -e "${BOLD}사용법:${NC}"
    echo "  ptyGitSubtree                     현재 subtree 정보 표시"
    echo "  ptyGitSubtree list                현재 subtree 정보 표시"
    echo "  ptyGitSubtree history             subtree 관련 커밋 히스토리"
    echo ""
    echo "  ptyGitSubtree add <폴더> <URL> [브랜치]    새 subtree 추가"
    echo "  ptyGitSubtree pull <폴더> [브랜치]         원격에서 변경사항 가져오기"
    echo "  ptyGitSubtree push <폴더> [브랜치]         원격으로 변경사항 보내기"
    echo ""
    echo "  ptyGitSubtree register <폴더> <URL>       기존 폴더에 remote 등록"
    echo "  ptyGitSubtree unregister <폴더>           remote 등록 해제"
    echo ""
    echo -e "${BOLD}예시:${NC}"
    echo "  ptyGitSubtree add ptyLibrary_PHP https://gitlab.platyhouse.com/platyhouse/ptyLibrary_PHP"
    echo "  ptyGitSubtree pull ptyLibrary_PHP main"
    echo "  ptyGitSubtree push ptyLibrary_PHP"
    echo ""
    echo -e "${BOLD}관련 명령어:${NC}"
    echo "  ptyGitSubtreeAdd     subtree 추가 전용 스크립트"
    echo "  ptyGitSubtreePull    subtree pull 전용 스크립트"
    echo "  ptyGitSubtreePush    subtree push 전용 스크립트"
}

# 메인 로직
case "$1" in
    "list"|"-l"|"ls")
        show_subtrees
        ;;
    "history"|"log")
        show_history
        ;;
    "add"|"-a")
        do_add "$2" "$3" "$4"
        ;;
    "pull"|"-p")
        do_pull "$2" "$3"
        ;;
    "push"|"-P")
        do_push "$2" "$3"
        ;;
    "register"|"reg")
        do_register "$2" "$3"
        ;;
    "unregister"|"unreg")
        do_unregister "$2"
        ;;
    "help"|"-h"|"--help")
        show_help
        ;;
    "")
        show_subtrees
        show_help
        ;;
    *)
        echo -e "${RED}알 수 없는 명령: $1${NC}"
        echo ""
        show_help
        exit 1
        ;;
esac

echo ""
