{#-
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you under the Apache License, Version 2.0 (the
       "License"); you may not use this file except in compliance
       with the License.  You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

       Unless required by applicable law or agreed to in writing,
       software distributed under the License is distributed on an
       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
       KIND, either express or implied.  See the License for the
       specific language governing permissions and limitations
       under the License.
-#}
{% extends 'allura:templates/repo/repo_master.html' %}

{% block title %}
  {{c.project.name}} / {{c.app.config.options.mount_label}} / Merge Request #{{req.request_number}}: {{req.summary}} ({{req.status}})
{% endblock %}

{% block header %}{{c.app.config.options.mount_label}}
Merge Request #{{req.request_number}}: {{req.summary}} ({{req.status}})
{% endblock %}

{% block actions %}
  {% if c.user and c.user != c.user.anonymous() %}
    {{ c.subscribe_form.display(value=subscribed, action='subscribe', style='icon') }}
  {% endif %}
  {% if h.has_access(req, 'write')() %}
    {{ g.icons['edit'].render(href='edit', show_title=True) }}
  {% endif %}
{% endblock %}

{% block content %}
  <div class="grid-19">
    <div id="merge_task_status" class="task_status">
      {% if merge_status == 'complete' %}
        <h2 class="complete">Merged</h2>
      {% else %}
        <img src="{{g.forge_static('images/spinner.gif')}}" class="spinner" style="display:none"/>
        <h2 class="busy ready">Merging...</h2>
        <h2 class="complete">Merged</h2>
        <h2 class="fail">Something went wrong. Please, merge manually</h2>
      {% endif %}
  </div>
    <div id="can_merge_task_status" class="task_status">
      {% if can_merge_status != 'complete' %}
        <img src="{{g.forge_static('images/spinner.gif')}}" class="spinner" style="display:none"/>
        <h2 class="busy ready">Checking if merge is possible...</h2>
        <h2 class="fail">Something went wrong. Please, merge manually</h2>
      {% endif %}
    </div>
  </div>

  {% if req.downstream_repo %}
    <p>
      <a href="{{req.creator_url}}" rel="nofollow">{{req.creator_name}}</a>
      wants to merge {{h.text.plural(commits|count, 'commit', 'commits')}}
      from <a href="{{req.downstream_url}}" rel="nofollow">{{req.downstream_url}}</a>
      to {{ req.target_branch }},
      {{lib.abbr_date(req.mod_date)}}
    </p>

    <div{% if h.has_access(req, 'write') %} class="active-md" data-markdownlink="" {% endif %}>{{g.markdown.convert(req.description)}}</div>

    {% if error %}
      <div class='grid-19 error'>
        Can't find commits to merge. Please checkout
        <a href="{{req.downstream_url}}" rel="nofollow">{{req.downstream_url}}</a>
        and follow the instructions to merge manually.
      </div>
    {% endif %}

    {% if req.merge_allowed(c.user) %}
    <div class='grid-19 merge-help'>
        <div class="merge-help-text can-merge-in-progress" {% if can_merge is none %}style="display: block;"{% endif %}>
            Checking if merge is possible...
        </div>
        <div class="merge-help-text merge-ok" {% if can_merge == True %}style="display: block;"{% endif %}>
            Merge request has no conflicts. You can merge automatically.
        </div>
        <div class="merge-help-text merge-conflicts" {% if can_merge == False %}style="display: block;"{% endif %}>
            Merge request has conflicts. Follow manual instructions below to merge.
        </div>
    </div>
    {% endif %}

    <div class="grid-19 merge-toolbar">
    {% if req.merge_allowed(c.user) %}
        <form action="merge" method="POST" onsubmit="return confirm('Do you really want to Accept this Merge Request?');">
          {{ lib.csrf_token() }}
          <button type="submit" id="merge-btn" {% if not can_merge or merge_status in ('ready', 'busy') %}disabled="disabled"{% endif %}>
            <i class="fa fa-code-fork fa-flip-vertical" aria-hidden="true"></i> Merge
          </button>
        </form>
    {% endif %}

    {% if req.creator == c.user and req.status == "open" %}
        <form action="save" method="POST" onsubmit="return confirm('Do you really want to Reject this Merge Request?');">
            {{ lib.csrf_token() }}
            <input type="hidden" value="rejected" name="status">
            <button type="submit" id="reject-btn" type="submit" >
                <i class="fa fa-ban" aria-hidden="true"></i> Reject
            </button>
        </form>

        <form action="refresh" method="POST">
            {{ lib.csrf_token() }}
            <button type="submit" id="refresh-btn" type="submit" >
                <i class="fa fa-refresh" aria-hidden="true"></i> Refresh Commits
            </button>
            <input type="hidden" value="{{req.source_branch}}" name="source_branch">
        </form>
    {% endif %}

    </div>

    {% if commits_task_started %}
        <div class='grid-19 commits-loading'>
            <p>
            <img src="{{g.forge_static('images/spinner.gif')}}" class="spinner"/>
            Determining commits...
            </p>
        </div>
    {% else %}
        {{ c.log_widget.display(value=commits, app=downstream_app) }}
    {% endif %}

    {% if h.has_access(c.app, 'write')() %}
      <div class="grid-19">
        To merge the commits, please execute the following commands in your working copy:
      </div>
      <div class="grid-19">
        <textarea class="merge-instructions" readonly>{{ c.app.repo.merge_command(req) | safe }}</textarea>
      </div>
      {% if merge_status not in ('ready', 'busy') %}
        {{ c.mr_dispose_form.display(action="save", value=dict(status=req.status)) }}
        <br style="clear:both">
      {% endif %}
    {% endif %}
  {% else %}
    <p>
      Original repository by
      <a href="{{req.creator_url}}" rel="nofollow">{{req.creator_name}}</a>
      is deleted
    </p>
    <div>{{g.markdown.convert(req.description)}}</div>
    {% if h.has_access(c.app, 'write')() %}
      {{ c.mr_dispose_form.display(action="save", value=dict(status=req.status)) }}
      <br style="clear:both">
    {% endif %}
  {% endif %}

{% endblock %}

{% block after_content %}
  <div id="discussion_holder">
    <h2>Discussion</h2>
    {% set thread=req.discussion_thread %}
    {{c.thread.display(
        value=thread,
        new_post_text="New Comment",
        page=page,
        limit=limit,
        count=count)}}
  </div>
{% endblock %}

{% block extra_css %}
{{ super() }}
<style type="text/css">
  .merge-help-text { display: none; }
  .merge-ok { color: green; }
  .merge-conflicts { color: red; }
  .can-merge-in-progress { color: grey; }
  .merge-instructions { width:80%; height:60px; }
  .merge-toolbar { padding-bottom: 1em; }

  #merge_task_status .{{ merge_status }} { display: inline-block; }
  #can_merge_task_status .{{ can_merge_status }} { display: inline-block; }
  .task_status { margin: 0 10px; }
  .task_status h2 { display: none; }
  .task_status h2.complete { color: #C6D880; }
  .task_status h2.busy { color: #003565; }
  .task_status h2.fail { color: #f33; }
</style>
{% endblock %}

{% block extra_js %}
{{ super() }}
<script type="text/javascript">
$(function() {
    var delay = 500;
    var delay_threshold = 60000;

    function make_status_watcher(spinner_selector, status_url, on_complete, on_progress, on_error) {

      var check_status = function() {
        $.get(status_url, function(data) {
          if (data.status === 'complete') {
            $(spinner).hide();
            on_complete();
          } else {
            if (data.status === 'ready' || data.status === 'busy') {
              on_progress();
            } else {
              $(spinner).hide();
              on_error();
            }
            if (delay < delay_threshold) {
              delay = delay * 1.5;
            }
            window.setTimeout(check_status, delay);
          }
        });
      }

      var start = function() {
        $(spinner_selector).show();
        window.setTimeout(check_status, delay);
      }

      return start;
    }

    {% if merge_status in ('ready', 'busy') %}
      var spinner = '#merge_task_status > .spinner';
      var url = "{{request.path.rstrip('/') + '/merge_task_status'}}";
      function on_complete() {
        $('#merge_task_status h2').hide();
        $('#merge_task_status h2.complete').show();
        location.reload();
      }
      function on_progress() {
        $('#merge_task_status h2').hide();
        $('#merge_task_status h2.busy').show();
      }
      function on_error() {
        $('#merge_task_status h2').hide();
        $('#merge_task_status h2.fail').show();
      }
      var start_watcher = make_status_watcher(spinner, url, on_complete, on_progress, on_error);
      start_watcher();

    {% elif can_merge_status in ('ready', 'busy') %}
      var spinner = '#can_merge_task_status > .spinner';
      var url = "{{request.path.rstrip('/') + '/can_merge_task_status'}}";
      var can_merge_result_url = "{{request.path.rstrip('/') + '/can_merge_result'}}";
      function on_complete() {
        $('#can_merge_task_status h2').hide();
        $.get(can_merge_result_url, function(data) {
          $('.merge-help-text').hide();
          if (data.can_merge) {
            $('.merge-ok').show();
            $('#merge-btn').prop('disabled', false);
          } else {
            $('.merge-conflicts').show();
            $('#merge-btn').prop('disabled', true);
          }
        });
      }
      function on_progress() {
        $('#can_merge_task_status h2').hide();
        $('#can_merge_task_status h2.busy').show();
        $('.merge-help-text').hide();
        $('.can-merge-in-progress').show();
      }
      function on_error() {
        $('#can_merge_task_status h2').hide();
        $('#can_merge_task_status h2.fail').show();
        $('.merge-help-text').hide();
        $('.merge-conflicts').show();
      }
      var start_watcher = make_status_watcher(spinner, url, on_complete, on_progress, on_error);
      start_watcher();
    {% endif %}

    {% if commits_task_started %}
      var check_commits = function() {
        $.get('{{ request.path.rstrip('/') }}/commits_html', function(data, textStatus, jqXHR) {
            if (jqXHR.status === 200) {
                $('.commits-loading').replaceWith(data);
            } else if (jqXHR.status === 500) {
                $('.commits-loading').replaceWith('<p>An error occurred while determining the commits in this merge request.</p>')
            } else {
                if (delay < delay_threshold) {
                    delay = delay * 1.5;
                }
                window.setTimeout(check_commits, delay);
            }
        });
      };
      check_commits();
    {% endif %}
});
</script>
{% endblock %}
