#!/usr/bin/python
# -*- coding: utf8 -*-

"""
С 2019-05-24 чейнджлоги для java-релизов считаются более экономно: по сборочным зависимостям вместо эвристик про каталги. 
Cтарая реализация -- это direct-arc-log-old.py, новая -- direct-arc-log.py.

Этот скрипт считает статистику: сколько тикетов в каждом релизе сэкономил новый алгоритм.
Скрипт берет java-релизы между двумя датами и считает количество коммитов по старому способу взятия changelog'а и по новому для сравнения.

Обязательно надо указать начальную дату для статистики:
direct-releases-changelog-stat 2019-05-27

Можно начальную и конечную:
direct-releases-changelog-stat 2019-05-27 2019-06-03

Можно указать приложение:
direct-releases-changelog-stat 2019-05-27 --app java-web

Можно все вместе:
direct-releases-changelog-stat 2019-05-27 2019-06-03 --app java-api5
"""

import os
import sys
import subprocess
import argparse
import yaml
import re
import datetime
import dateutil.parser
import logging

sys.path.insert(0, '/opt/direct-py/startrek-python-client-sni-fix')
from startrek_client import Startrek
logging.getLogger('startrek_client').setLevel(logging.CRITICAL)

SCRIPT_NAME = os.path.basename(__file__)

APPS_CONFIG_PATH = '/etc/yandex-direct/direct-apps.conf.yaml'
with open(APPS_CONFIG_PATH, 'r') as fh:
    APPS_CONFIG = yaml.load(fh)['apps']

STARTREK_TOKEN_FILE = '/etc/direct-tokens/startrek'
with open(STARTREK_TOKEN_FILE) as fh:
    STARTREK_TOKEN = fh.readline().strip()
startrek_client = Startrek(token=STARTREK_TOKEN, useragent=SCRIPT_NAME)

VERSION_RE = r'\b(1\.([0-9]{7,})(?:\.([0-9]{7,}))?-[0-9]+)\b'

def make_pct_diff_str(diff, old):
    if old == 0:
        return "--"
    s = "-"+str(100*diff/old) + "%"
    return s

def main():
    parser = argparse.ArgumentParser(description='Get svn logs related to the specific release from arcadia')
    parser.add_argument('date_from', type=str, help='first date in period')
    parser.add_argument('date_until', nargs='?', type=str, help='last date in period')
    parser.add_argument('--app', type=str, choices=APPS_CONFIG.keys(), help='app name')

    args = parser.parse_args()

    dt_from = dateutil.parser.parse(args.date_from)
    dt_until = datetime.datetime.now() if not args.date_until else dateutil.parser.parse(args.date_until)
    apps = APPS_CONFIG.keys() if not args.app else [args.app]
    st_query = u'Queue: DIRECT Type: Release Components: "Releases: JavaDirect" Created: %s .. %s' % (dt_from.strftime('%Y-%m-%d'), dt_until.strftime('%Y-%m-%d'))

    sum_old = 0
    sum_new = 0
    sum_diff = 0
    row_with_format = u"%14s %5s %5s %5s %5s"
    delim = "-" * 32
    print row_with_format % ("TICKET", "OLD", "NEW", "DIFF", "DIFF_PCT")

    for app in apps:
        try:
            if APPS_CONFIG[app]['type'] != 'arcadia-java':
                continue
    
            print row_with_format % (app + ':', '', '', '', '')
            releases = list(startrek_client.issues.find(st_query + u' Components: "%s" "Sort By": key DESC' % (
                APPS_CONFIG[app]['tracker-component']
            )))

            sum_old_app = 0
            sum_new_app = 0
    
            for idx in range(len(releases) - 1):
                new_count = len(re.findall('^r[0-9]+ \|', releases[idx].description, re.M))
    
                base_rev_cur = re.search(VERSION_RE, releases[idx].summary).group(2)
                base_rev_prev = re.search(VERSION_RE, releases[idx + 1].summary).group(2)
    
                old_changelog = subprocess.check_output(["direct-arc-log-old.py", app, base_rev_prev, base_rev_cur])
                old_count = len(re.findall('^r[0-9]+ \|', old_changelog, re.M))

                sum_old_app += old_count
                sum_new_app += new_count
    
                print row_with_format % (releases[idx].key, old_count, new_count, old_count - new_count, make_pct_diff_str(old_count - new_count, old_count))

            print delim
            print row_with_format % ('App summary:', sum_old_app, sum_new_app, sum_old_app - sum_new_app, make_pct_diff_str(sum_old_app - sum_new_app, sum_old_app))
            print ""

            sum_old += sum_old_app
            sum_new += sum_new_app
            sum_diff += sum_old_app - sum_new_app

        except Exception as e:
            print "EXCEPTION: %s %s" % (e, type(e))

    print delim
    print row_with_format % ("Full summary:", sum_old, sum_new, sum_diff, make_pct_diff_str(sum_diff, sum_old))
    
    return


if __name__ == '__main__':
    main()
