#!/bin/bash

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE}      Git 智能提交工具 (Smart Push)     ${NC}"
echo -e "${BLUE}========================================${NC}"

# 1. 执行代码更新
echo -e "${YELLOW}[1/3] 正在检查远程更新...${NC}"
if [ -f "./update_repo.sh" ]; then
    ./update_repo.sh
    if [ $? -ne 0 ]; then
        echo -e "${RED}[错误] 代码更新失败，已终止提交操作。请先解决更新问题。${NC}"
        exit 1
    fi
else
    echo -e "${RED}[错误] 找不到 update_repo.sh 脚本，无法执行前置更新。${NC}"
    exit 1
fi

# 2. 检查本地变更
echo -e "${YELLOW}[2/3] 正在检查本地变更...${NC}"
STATUS=$(git status --porcelain)
if [ -z "$STATUS" ]; then
    echo -e "${GREEN}[提示] 本地没有需要提交的更改。${NC}"
    exit 0
fi

# 获取变更文件数量
FILE_COUNT=$(echo "$STATUS" | wc -l | xargs)
echo -e "${GREEN}检测到 ${FILE_COUNT} 个文件发生变更。${NC}"

# 3. 提交与推送
echo -e "${YELLOW}[3/3] 准备提交...${NC}"

# 获取提交信息
read -p "请输入提交信息 (Commit Message): " MSG
if [ -z "$MSG" ]; then
    MSG="Update code $(date +%Y-%m-%d)"
    echo -e "${YELLOW}未输入信息，使用默认: ${MSG}${NC}"
fi

# 批处理阈值
BATCH_LIMIT=500

if [ "$FILE_COUNT" -gt "$BATCH_LIMIT" ]; then
    echo -e "${YELLOW}警告: 变更文件数量 ($FILE_COUNT) 较多，建议分批提交以降低风险。${NC}"
    read -p "是否启用分批提交模式? (y/n) [默认: y]: " ENABLE_BATCH
    ENABLE_BATCH=${ENABLE_BATCH:-y}

    if [[ "$ENABLE_BATCH" == "y" ]]; then
        echo -e "${BLUE}>>> 启用分批模式 (每批 $BATCH_LIMIT 个文件) <<<${NC}"
        
        # 生成文件列表临时文件
        git status --porcelain | cut -c4- > .git_files_to_commit
        
        CURRENT_BATCH=1
        COUNTER=0
        PENDING_FILES=""
        
        while IFS= read -r FILE; do
            # 处理文件名中的引号 (简单处理)
            FILE="${FILE%\"}"
            FILE="${FILE#\"}"
            
            # 将文件添加到暂存区
            git add "$FILE"
            ((COUNTER++))
            
            # 达到批次限制，进行提交和推送
            if [ "$COUNTER" -eq "$BATCH_LIMIT" ]; then
                BATCH_MSG="$MSG (Batch $CURRENT_BATCH)"
                echo -e "${YELLOW}正在提交第 $CURRENT_BATCH 批...${NC}"
                
                if git commit -m "$BATCH_MSG"; then
                    echo -e "${YELLOW}正在推送第 $CURRENT_BATCH 批...${NC}"
                    if git push; then
                        echo -e "${GREEN}第 $CURRENT_BATCH 批推送成功！${NC}"
                    else
                        echo -e "${RED}第 $CURRENT_BATCH 批推送失败！请检查网络。${NC}"
                        rm .git_files_to_commit
                        exit 1
                    fi
                else
                     echo -e "${RED}第 $CURRENT_BATCH 批提交失败！${NC}"
                     rm .git_files_to_commit
                     exit 1
                fi
                
                # 重置计数器
                COUNTER=0
                ((CURRENT_BATCH++))
            fi
        done < .git_files_to_commit
        
        # 处理剩余文件
        if [ "$COUNTER" -gt 0 ]; then
            BATCH_MSG="$MSG (Batch $CURRENT_BATCH - Final)"
            echo -e "${YELLOW}正在提交最后一批...${NC}"
            git commit -m "$BATCH_MSG" && git push
        fi
        
        rm .git_files_to_commit
        echo -e "${GREEN}========================================${NC}"
        echo -e "${GREEN}      所有批次提交完成！      ${NC}"
        echo -e "${GREEN}========================================${NC}"
        exit 0
    fi
fi

# 正常一次性提交模式
git add .
if git commit -m "$MSG"; then
    echo -e "${YELLOW}正在推送到远程仓库...${NC}"
    if git push; then
        echo -e "${GREEN}========================================${NC}"
        echo -e "${GREEN}      提交并推送成功！      ${NC}"
        echo -e "${GREEN}========================================${NC}"
    else
        echo -e "${RED}[错误] 推送失败。可能是网络问题或远程拒绝。${NC}"
        echo -e "${YELLOW}建议: 尝试运行 ./update_repo.sh 再次更新，或检查 git push 错误信息。${NC}"
        exit 1
    fi
else
    echo -e "${RED}[错误] 提交失败。${NC}"
    exit 1
fi
