<script src="//cdn.jsdelivr.net/npm/featherlight@1.7.14/release/featherlight.min.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
  function isFaster(time1, time2) {
    let arr1 = time1.split(':');
    let arr2 = time2.split(':');

    for (let i in arr1) {
      let val1 = parseInt(arr1[i]);
      let val2 = parseInt(arr2[i]);
      if (val1 < val2) return true;
      if (val1 > val2) return false;
    }
    return false;
  }

  function scoretimeComparison(sub1, sub2) {
    if (!sub2) return true;
    return sub1['score'] > sub2['score'] || (sub1['score'] === sub2['score'] && isFaster(sub1['time'], sub2['time']));
  }

  function highlightFirstSolve() {
    // bucket to store submissions by problems
    let bestSubmissions = {};

    // get information
    $('td a').each(function() {
      var td = $(this)[0];
      var link = $(this).attr('data-featherlight');
      if (link && link.includes('submissions')) {
        let scoreAndTime = (td.innerText.split('\n'))
        let linkElements = link.split('/')

        // get information
        let problem = linkElements[linkElements.length - 2];
        let score = parseFloat(scoreAndTime[0].replace(',', '.'));
        let time = scoreAndTime[1];

        if (time) {
          let curSubmission = {
            'td': $(this).parent(),
            'score': score,
            'time': time
          }

          // update best submissions
          let curBest = bestSubmissions[problem]

          if (scoretimeComparison(curSubmission, curBest) && score) {
            bestSubmissions[problem] = curSubmission;
          }
        }
      }
    })
    for (let problem in bestSubmissions) {
      bestSubmissions[problem]['td'].addClass('first-solve')
    }
  }

  function renew_filter(need_update=true) {
    var checkboxes = [
      '#show-schools-checkbox',
      '#show-fullnames-checkbox',
      '#show-total-score-checkbox',
    ];

    var checkboxes2 = [
      '#show-friends-checkbox',
      '#show-virtual-checkbox'
    ]

    for (var i of checkboxes) {
      var $box = $(i);
      if ($box.is(':checked')) {
        $box.prop('checked', false);
        $box.click();
        $box.prop('checked', true);
      }
    }

    var to_update = false;
    for (var i of checkboxes2) {
      var $box = $(i);
      if ($box.is(':checked')) {
        to_update = true;
      }
    }
    if (to_update && need_update) {
      update_ranking();
    }
  }

  function get_initial_rank() {
    var ranks = $('.rank-td').map(function() {return this.innerHTML}).get();
    var usernames = $('.user-name .rating a').map(function() {return this.text}).get();
    window.user_rank = new Map();
    for (var i = 0; i < ranks.length; i++) {
      window.user_rank[usernames[i]] = ranks[i];
    }
  }

  function add_initial_friend_rank() {
    var usernames = $('.user-name .rating a').map(function() {return this.text}).get();

    var is_virtual = [];
    $('.user-name').each(function() {
      if($(this).children('sub').length) {
        is_virtual.push(1);
      }
      else is_virtual.push(0);
    });

    $('.rank-td').each(function(i) {
      if (!is_virtual[i]) this.innerHTML += ' (' + window.user_rank[usernames[i]] + ')';
    });
  }

  function update_ranking() {
    var friend = $('#show-friends-checkbox').is(':checked');
    var virtual = $('#show-virtual-checkbox').is(':checked');
    $('#loading-gif').show();
    var url = `{{url('contest_ranking_ajax', contest.key)}}?friend=${friend}&virtual=${virtual}`;
    {% if page_type == 'final_ranking' %}
      url += "&final=true";
    {% endif %}
    $.get({
      url: url,
      success: function(HTML) {
        $('#users-table').html(HTML);
        highlightFirstSolve();
        renew_filter(false);
        $('#loading-gif').hide();
        if (!virtual && !friend) {
          get_initial_rank();
        }
        if (friend) {
          add_initial_friend_rank();
        }
      },
      fail: function() {
        console.log('Fail to update ranking');
      }
    });
  }

  $(function () {
    $('.leaving-forever').click(function () {
      return confirm('{{ _('Are you sure you want to leave?') }}\n' +
        '{{ _('You cannot come back to a virtual participation. You will have to start a new one.') }}');
    });

    $('.first-join').click(function () {
      return confirm('{{ _('Are you sure you want to join?') }}\n' +
        '{{ _('Joining a contest starts your timer, after which it becomes unstoppable.') }}');
    });

    var url = '{{ url('contest_participation', contest.key, '__username__') }}';
    var placeholder = $('#search-contest').replaceWith($('<select>').attr({
      id: 'search-contest'
    })).attr('placeholder');

    $('#search-contest').select2({
      placeholder: placeholder,
      ajax: {
        url: '{{ url('contest_user_search_select2_ajax', contest.key) }}'
      },
      minimumInputLength: 1,
      escapeMarkup: function (markup) {
        return markup;
      },
      templateResult: function (data, container) {
        return ('<img class="user-search-image" src="' + data.gravatar_url + '" width="24" height="24">' +
          '<span class="' + data.display_rank + ' user-search-name">' + data.text + '</span>');
      }
    }).on('change', function () {
      window.location.href = url.replace('__username__', $(this).val());
    });

    $('#show-schools-checkbox').click(function () {
      $('.school').toggle();
    });
    $('#show-fullnames-checkbox').click(function () {
      $('.fullname').toggle();
    });

    {% if request.user.is_authenticated %}
      $('#show-friends-checkbox').click(function() {
        update_ranking();
      })
    {% endif %}
    $('#show-virtual-checkbox').click(function() {
      update_ranking();
    })
    $('#show-total-score-checkbox').click(function() {
      $('.problem-score-col').toggle();
    })

    highlightFirstSolve();
    renew_filter();
    get_initial_rank();

    {% if participation_tab %}
      $('#show-virtual-checkbox').hide();
      $('#show-virtual-label').hide();
    {% else %}
      {% if request.in_contest %}
        clearInterval(window.rankingInterval);
        window.rankingInterval = setInterval(update_ranking, 60 * 1000);
      {% endif %}
    {% endif %}
  });

</script>