# Copyright (C) 2017-2018  The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU Affero General Public License version 3, or any later version
# See top-level LICENSE file for more information

from django.shortcuts import render
from django.utils.safestring import mark_safe

from swh.web.common import service
from swh.web.common.utils import (
    reverse, format_utc_iso_date, get_swh_persistent_id
)
from swh.web.common.exc import handle_view_exception
from swh.web.browse.browseurls import browse_route
from swh.web.browse.utils import (
    gen_person_link, gen_revision_link,
    get_snapshot_context, gen_link,
    gen_snapshot_link
)


@browse_route(r'release/(?P<sha1_git>[0-9a-f]+)/',
              view_name='browse-release')
def release_browse(request, sha1_git):
    """
    Django view that produces an HTML display of a SWH release
    identified by its id.

    The url that points to it is :http:get:`/browse/release/(sha1_git)/`.
    """
    try:
        release = service.lookup_release(sha1_git)
        snapshot_context = None
        origin_info = None
        snapshot_id = request.GET.get('snapshot_id', None)
        origin_type = request.GET.get('origin_type', None)
        origin_url = request.GET.get('origin_url', None)
        if not origin_url:
            origin_url = request.GET.get('origin', None)
        timestamp = request.GET.get('timestamp', None)
        visit_id = request.GET.get('visit_id', None)
        if origin_url:
            snapshot_context = get_snapshot_context(snapshot_id, origin_type,
                                                    origin_url, timestamp,
                                                    visit_id)
            origin_info = snapshot_context['origin_info']
        elif snapshot_id:
            snapshot_context = get_snapshot_context(snapshot_id)
    except Exception as exc:
        return handle_view_exception(request, exc)

    release_data = {}

    release_data['author'] = \
        gen_person_link(release['author']['id'], release['author']['name'],
                        snapshot_context)
    release_data['date'] = format_utc_iso_date(release['date'])
    release_data['id'] = sha1_git
    release_data['name'] = release['name']
    release_data['synthetic'] = release['synthetic']
    release_data['target type'] = release['target_type']

    if release['target_type'] == 'revision':
        release_data['target'] = \
            gen_revision_link(release['target'],
                              snapshot_context=snapshot_context)
    elif release['target_type'] == 'content':
        content_url = \
            reverse('browse-content',
                    kwargs={'query_string': 'sha1_git:' + release['target']})
        release_data['target'] = gen_link(content_url, release['target'])
    elif release['target_type'] == 'directory':
        directory_url = \
            reverse('browse-directory',
                    kwargs={'sha1_git': release['target']})
        release_data['target'] = gen_link(directory_url, release['target'])
    elif release['target_type'] == 'release':
        release_url = \
            reverse('browse-release',
                    kwargs={'sha1_git': release['target']})
        release_data['target'] = gen_link(release_url, release['target'])

    release_note_lines = release['message'].split('\n')

    vault_cooking = None

    release_target_link = '<b>Target:</b> '
    if release['target_type'] == 'revision':
        release_target_link += '<i class="octicon octicon-git-commit fa-fw"></i>' # noqa
        revision = service.lookup_revision(release['target'])
        vault_cooking = {
            'directory_context': True,
            'directory_id': revision['directory'],
            'revision_context': True,
            'revision_id': release['target']
        }
    else:
        release_target_link += release['target_type']
    release_target_link += ' ' + release_data['target']

    if snapshot_context:
        release_data['snapshot id'] = snapshot_context['snapshot_id']

    if origin_info:
        release_url = reverse('browse-release',
                              kwargs={'sha1_git': release['id']})
        release_data['context-independent release'] = \
            gen_link(release_url, link_text='Browse',
                     link_attrs={'class': 'btn btn-default btn-sm',
                                 'role': 'button'})
        release_data['origin id'] = origin_info['id']
        release_data['origin type'] = origin_info['type']
        release_data['origin url'] = gen_link(origin_info['url'],
                                              origin_info['url'])
        browse_snapshot_link = \
            gen_snapshot_link(snapshot_context['snapshot_id'],
                              link_text='Browse',
                              link_attrs={'class': 'btn btn-default btn-sm',
                                          'role': 'button'})
        release_data['snapshot'] = browse_snapshot_link

    swh_rel_id = get_swh_persistent_id('release', sha1_git)
    show_ids_options = snapshot_context and \
        snapshot_context['origin_info'] is not None
    swh_ids = [
        {
            'object_type': 'release',
            'title': 'Release ' + sha1_git,
            'swh_id': swh_rel_id,
            'swh_id_url': reverse('browse-swh-id',
                                  kwargs={'swh_id': swh_rel_id}),
            'show_options': show_ids_options
        }
    ]

    if snapshot_context:
        snapshot_id = snapshot_context['snapshot_id']

    if snapshot_id:
        swh_snp_id = get_swh_persistent_id('snapshot', snapshot_id)

        swh_ids.append({
            'object_type': 'snapshot',
            'title': 'Snapshot ' + snapshot_id,
            'swh_id': swh_snp_id,
            'swh_id_url': reverse('browse-swh-id',
                                  kwargs={'swh_id': swh_snp_id}),
            'show_options': show_ids_options
        })

    return render(request, 'release.html',
                  {'heading': 'Release',
                   'swh_object_name': 'Release',
                   'swh_object_metadata': release_data,
                   'release_name': release['name'],
                   'release_note_header': release_note_lines[0],
                   'release_note_body': '\n'.join(release_note_lines[1:]),
                   'release_target_link': mark_safe(release_target_link),
                   'snapshot_context': snapshot_context,
                   'show_actions_menu': True,
                   'breadcrumbs': None,
                   'vault_cooking': vault_cooking,
                   'top_right_link': None,
                   'top_right_link_text': None,
                   'swh_ids': swh_ids})
