# log

import csv
from tqdm import tqdm

import contributor as con

# コントリビュータの追加した行などを更新
def add_con_lines(c, insertions, deletions): # c:contributors
    c.add_insertions(insertions) # 追加した行
    c.add_deletions(deletions) # 削除した行

# コントリビュータの更新
def set_contributor(c, author, insertions, deletions, commit): # c:contributors
    # リストの重複を確認して追加
    i = 0
    for j in range(len(c)):
        # authorが既に存在するか確認
        if author in c[i].get_name():
            c[i].add_commit_count(1)
            add_con_lines(c[i], insertions, deletions)
            c[i].set_first_commit(commit.committed_datetime.strftime('%Y-%m-%d'))
            break
        i += 1
    # authorがまだ登録されていない場合、追加
    if i == len(c):
        c.append(con.Contributor(author, 1))
        add_con_lines(c[i], insertions, deletions)
        c[i].set_last_commit(commit.committed_datetime.strftime('%Y-%m-%d'))

def run(repo):
    # log.csv
    f_log = open("./log/log.csv","w+", encoding="utf_8_sig", newline='')
    csv_log = csv.writer(f_log)
    # csvヘッダー追加
    csv_log.writerow([
        'commit_no',
        'author',
        'committed_datetime',
        'message',
        'hexsha'])

    # contributors.csv
    f_con = open("./log/contributors.csv","w+", encoding="utf_8_sig", newline='')
    csv_con = csv.writer(f_con)
    csv_con.writerow([
        'Contributor',
        'Commits(%)',
        '+lines',
        '-lines',
        'First commit',
        'Last commit',
        'Active days',
        'Ranking'])

    sum_commits    = repo.git.rev_list('--count', 'HEAD') # コミットの総数
    commit_count   = 0
    commit_files   = 0 # 変更したファイル数
    sum_insertions = 0 # 追加した行数の合計
    sum_deletions  = 0 # 削除した行数の合計
    lines          = 0 # 変更行の合計
    merge_count    = 0 # マージコミット数
    contributors   = []
    with tqdm(total=int(sum_commits), desc='log.csv') as pbar: # プログレスバーの設定
        for commit in repo.iter_commits():
            commit_no =  int(sum_commits) - commit_count
            insertions   = 0 # 追加した行数（コミットごと）
            deletions    = 0 # 削除した行数（コミットごと）

            file_list = commit.stats.files # ファイルごとの変更履歴（行）
            for file_name in file_list:
                commit_files += 1
                insertions += file_list.get(file_name).get('insertions') # 追加した行数
                deletions  += file_list.get(file_name).get('deletions') # 削除した行数
                lines      += file_list.get(file_name).get('lines') # 変更行の合計

            # log.csvに書き込み
            csv_log.writerow([
                commit_no,
                commit.author,
                commit.committed_datetime.strftime('%Y-%m-%d %H:%M:%S'),
                commit.message,
                commit.hexsha])
            commit_count += 1

            # コントリビュータを更新
            set_contributor(contributors, str(commit.author), insertions, deletions, commit)

            sum_insertions += insertions
            sum_deletions  += deletions

            # マージコミット数を計測
            if commit.message.startswith("Merge"):
                merge_count += 1

            pbar.update(1) # プログレスバーの進捗率を更新

    rank = 1
    with tqdm(total=len(contributors), desc='contributors.csv') as pbar:
        for con in sorted(contributors, key=lambda c: c.commit_count, reverse=True):
            # contributors.csvに書き込み
            commit_percent = con.get_commit_count() / int(sum_commits) * 100
            csv_con.writerow([
                con.get_name(),
                str(con.get_commit_count()) + "({:.1f})".format(commit_percent),
                con.get_insertions(),
                con.get_deletions(),
                con.get_first_commit(),
                con.get_last_commit(),
                0,
                rank])
            rank += 1
            pbar.update(1)

    f_log.close()
    f_con.close()

    print("コミット数：" + sum_commits)
    print("マージコミット数：" + str(merge_count))
    print("変更したファイル数(のべ)：" + str(commit_files))
    print("・追加した行数：" + str(sum_insertions))
    print("・削除した行数：" + str(sum_deletions))
    print("・変更行の和　：" + str(lines))
    print("・変更行の差　：" + str(sum_insertions - sum_deletions))
    print("コントリビュータ：" + str(len(contributors)))
    for contributor in sorted(contributors, key=lambda c: c.commit_count, reverse=True):
        print(contributor)