#!/usr/bin/env python3
# Copyright (c) 2020 Intel Corp.
# SPDX-License-Identifier: Apache-2.0

"""
Syntax of file:
    [
        {
            "version": "<commit>",
            "date": "<date>",
            "weekly: False,
        },
    ]
"""
import json
import argparse
import urllib.request
import os

from git import Git
from datetime import datetime

VERSIONS_FILE = "versions.json"


def parse_args():
    parser = argparse.ArgumentParser(
                description="Manage versions to be tested.")
    parser.add_argument('-l', '--list', action="store_true",
                        help="List all published versions")
    parser.add_argument('-u', '--update',
                        help="Update versions file from tree.")
    parser.add_argument('-L', '--latest', action="store_true",
                        help="Get latest published version")
    parser.add_argument('-w', '--weekly', action="store_true",
                        help="Mark as weekly")
    return parser.parse_args()


def get_versions():
    data = None
    if not os.path.exists('versions.json'):
        url = 'https://testing.zephyrproject.org/daily_tests/versions.json'
        urllib.request.urlretrieve(url, 'versions.json')
    with open("versions.json", "r") as fp:
        data = json.load(fp)

    return data

def handle_compat(item):
    item_compat = {}
    if isinstance(item, str):
        item_compat['version'] =  item
        item_compat['weekly'] = False
        item_compat['date'] = None
    else:
        item_compat = item

    return item_compat

def show_versions():
    data = get_versions()
    for item in data:
        item_compat = handle_compat(item)
        is_weekly = item_compat.get('weekly', False)
        wstr = ""
        datestr = ""
        if is_weekly:
            wstr = "(marked for weekly testing)"
        if item_compat.get('date'):
            pdate = datetime.strptime(item_compat['date'], '%Y-%m-%dT%H:%M:%S.%f')
            date = pdate.strftime("%b %d %Y %H:%M:%S")
            datestr = f"published on {date}"
        print(f"- {item_compat['version']} {datestr} {wstr}")


def show_latest():
    data = get_versions()
    latest = data[-1]
    item_compat = handle_compat(latest)

    ver = item_compat.get("version")
    date = item_compat.get("date", False)
    is_weekly = item_compat.get('weekly')
    datestr = ""
    if date:
        datestr = f"published on {date}"
    print(f"Latest version is {ver} {datestr}")
    if is_weekly:
        print("This version is marked for weekly testing.")


def update(git_tree, is_weekly=False):
    g = Git(git_tree)
    today = datetime.now().strftime('%Y-%m-%dT%H:%M:%S.%f')
    version = g.describe()
    published = False
    data = get_versions()

    found = list(filter(lambda item: (isinstance(item, dict) and
                        item.get('version') == version) or item == version, data))
    if found:
        published = True
        print("version already published")
    else:
        print(f"New version {version}, adding to file...")

    if data and not published:
        with open(VERSIONS_FILE, "w") as versions:
            item = {}
            item['version'] = version
            item['date'] = today
            item['weekly'] = is_weekly
            data.append(item)
            json.dump(data, versions)

def main():
    args = parse_args()
    if args.update:
        update(args.update, args.weekly)
    elif args.list:
        show_versions()
    elif args.latest:
        show_latest()
    else:
        print("You did not specify any options")

if __name__ == "__main__":
    main()
