#!/usr/bin/env python3
"""
Git Commit 通知腳本
==================
在 git commit/push 後發送 Telegram 通知。

使用方式：
    python commit_notify.py              # 自動偵測最新 commit
    python commit_notify.py --message "自訂訊息"
"""

import sys
sys.stdout.reconfigure(encoding='utf-8')

import os
import subprocess
import argparse

# 加入 notifier 模組路徑
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from notifier import send_commit_notification, send_success

def get_git_info(repo_dir=None):
    """取得 Git 資訊

    Args:
        repo_dir: Git 專案目錄，如果為 None 則使用當前目錄
    """
    try:
        # 設定 cwd 參數，讓 git 在指定目錄執行
        cwd = repo_dir if repo_dir else None

        # 專案名稱
        repo_path = subprocess.check_output(
            ['git', 'rev-parse', '--show-toplevel'],
            stderr=subprocess.DEVNULL,
            encoding='utf-8',
            cwd=cwd
        ).strip()
        repo_name = os.path.basename(repo_path)

        # 分支名稱
        branch = subprocess.check_output(
            ['git', 'rev-parse', '--abbrev-ref', 'HEAD'],
            stderr=subprocess.DEVNULL,
            encoding='utf-8',
            cwd=cwd
        ).strip()

        # 最新 commit 訊息
        commit_message = subprocess.check_output(
            ['git', 'log', '-1', '--pretty=format:%s'],
            stderr=subprocess.DEVNULL,
            encoding='utf-8',
            cwd=cwd
        ).strip()

        # commit hash
        commit_hash = subprocess.check_output(
            ['git', 'log', '-1', '--pretty=format:%h'],
            stderr=subprocess.DEVNULL,
            encoding='utf-8',
            cwd=cwd
        ).strip()

        # 變更統計
        try:
            stat = subprocess.check_output(
                ['git', 'diff', '--stat', 'HEAD~1', 'HEAD'],
                stderr=subprocess.DEVNULL,
                encoding='utf-8',
                cwd=cwd
            ).strip()
            # 解析最後一行的統計資訊
            last_line = stat.split('\n')[-1] if stat else ''
            files_changed = 0
            insertions = 0
            deletions = 0
            if 'file' in last_line:
                import re
                match = re.search(r'(\d+) files? changed', last_line)
                if match:
                    files_changed = int(match.group(1))
                match = re.search(r'(\d+) insertions?', last_line)
                if match:
                    insertions = int(match.group(1))
                match = re.search(r'(\d+) deletions?', last_line)
                if match:
                    deletions = int(match.group(1))
        except:
            files_changed = 0
            insertions = 0
            deletions = 0

        return {
            'repo_name': repo_name,
            'branch': branch,
            'commit_message': commit_message,
            'commit_hash': commit_hash,
            'files_changed': files_changed,
            'insertions': insertions,
            'deletions': deletions
        }
    except subprocess.CalledProcessError:
        return None

def main():
    parser = argparse.ArgumentParser(description='Git Commit 通知')
    parser.add_argument('--message', help='自訂訊息（不使用 git log）')
    parser.add_argument('--repo-dir', help='Git 專案目錄路徑')

    args = parser.parse_args()

    if args.message:
        # 使用自訂訊息
        success = send_success("Git Commit", details={"訊息": args.message})
    else:
        # 自動偵測 git 資訊
        info = get_git_info(repo_dir=args.repo_dir)
        if info:
            success = send_commit_notification(
                repo_name=info['repo_name'],
                branch=info['branch'],
                commit_message=info['commit_message'],
                files_changed=info['files_changed'],
                insertions=info['insertions'],
                deletions=info['deletions']
            )
        else:
            print("無法取得 Git 資訊，請確認目前目錄是 Git 專案")
            sys.exit(1)

    print("通知已發送" if success else "發送失敗")
    sys.exit(0 if success else 1)

if __name__ == "__main__":
    main()
