#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Copyright (C) 2017-2020  The Project X-Ray Authors.
#
# Use of this source code is governed by a ISC-style
# license that can be found in the LICENSE file or at
# https://opensource.org/licenses/ISC
#
# SPDX-License-Identifier: ISC

import argparse
import hashlib
import os
import parse as format_parser
import subprocess
import sys
"""Module for generating the Info.md file found in the database directory."""

info_md_header = """
# Details

Last updated on {human_date} ({iso8601_date}).

Created using [Project X-Ray](https://github.com/SymbiFlow/prjxray) version [{commit_hash_short}](https://github.com/SymbiFlow/prjxray/commit/{commit_hash_long}).

Latest commit was;
```
{commit_latest}
```

"""

info_md_section = """

## Database for [{part_line}]({part_line}/)

### Settings

Created using following [settings/{part_line}.sh (sha256: {settings_sha256})](https://github.com/SymbiFlow/prjxray/blob/{commit_hash_long}/settings/{part_line}.sh)
```shell
{settings_contents}
```

### [Results]({part_line}/)

Results have checksums;

"""

info_md_file = " * [`{file_sha256}  ./{file_short_path}`](./{file_short_path})\n"


def sha256(s):
    m = hashlib.sha256()
    m.update(s)
    return m.hexdigest()


def sha256_file(p):
    return sha256(open(p, 'rb').read())


def run(c):
    o = subprocess.check_output(c, shell=True)
    return o.decode('utf-8').strip()


def main(argv):

    parser = argparse.ArgumentParser()
    parser.add_argument(
        '--keep',
        default=False,
        action="store_true",
        help="""\
Keep the existing commit information.
""")
    args = parser.parse_args()

    info_md_filename = os.path.join('database', 'Info.md')
    assert os.path.exists(info_md_filename), info_md_filename

    info_md = []

    info_md.append(open('database/README.md').read())

    v = {}
    v['human_date'] = run('TZ=UTC date')
    v['iso8601_date'] = run('TZ=UTC date --iso-8601=seconds')
    if not args.keep:
        v['commit_latest'] = run('git log -1')
        v['commit_hash_short'] = run('git log -1 --pretty=%h')
        v['commit_hash_long'] = run('git log -1 --pretty=%H')
    else:
        with open(info_md_filename) as f:
            result = format_parser.parse(
                '{before}' + info_md_header + '{after}', f.read())
        assert result
        assert result['human_date']
        assert result['iso8601_date']
        v['commit_latest'] = result['commit_latest']
        v['commit_hash_short'] = result['commit_hash_short']
        v['commit_hash_long'] = result['commit_hash_long']

    info_md.append(info_md_header.format(**v))

    for part_line in sorted(os.listdir('database')):
        if part_line.startswith('.'):
            continue
        part_path = os.path.join('database', part_line)

        if not os.path.isdir(part_path):
            continue

        files = list(os.listdir(part_path))
        files.sort()

        settings_path = os.path.join('settings', part_line + '.sh')
        settings_raw = open(settings_path, 'rb').read()

        w = {}
        w['commit_hash_long'] = v['commit_hash_long']
        w['part_line'] = part_line
        w['settings_contents'] = settings_raw.decode('utf-8')
        w['settings_sha256'] = sha256(settings_raw)

        info_md.append(info_md_section.format(**w))

        files = []
        for dirpath, dirnames, filenames in os.walk(part_path):
            for f in filenames:
                files.append(os.path.join(dirpath, f))

        files.sort()
        for p in files:
            x = {}
            x['file_real_path'] = './' + p
            x['file_short_path'] = os.path.join(
                part_line, os.path.relpath(p, part_path))
            x['file_sha256'] = sha256_file(p)
            info_md.append(info_md_file.format(**x))

    with open(info_md_filename, 'w') as f:
        f.write("".join(info_md))

    return 0


if __name__ == "__main__":
    sys.exit(main(sys.argv))
