<template>
  <div>
    <projbreadcrumbs
      :ownertype="ownertype"
      :ownername="ownername"
      :projectref="projectref"
    />

    <div class="mb-8">
      <span class="text-3xl">{{ projectName() }}</span>
    </div>

    <div class="flex justify-between">
      <ul class="flex-grow tab">
        <li class="tab-element-disabled">
          <i class="mr-1 mdi mdi-run-fast" />
          <span>Runs</span>
        </li>
        <li>
          <tabarrow />
        </li>
        <li
          class="tab-element"
          :class="[
            {
              'tab-element-selected':
                $route.name.match('project runs') ||
                $route.name.endsWith('project'),
            },
          ]"
        >
          <router-link :to="projectRunsLink(ownertype, ownername, projectref)">
            <i class="mr-1 mdi mdi-asterisk" />
            <span>All</span>
          </router-link>
        </li>
        <li
          class="tab-element"
          :class="[
            {
              'tab-element-selected': $route.name.match(
                'project branches runs'
              ),
            },
          ]"
        >
          <router-link
            :to="projectBranchesRunsLink(ownertype, ownername, projectref)"
          >
            <i class="mr-1 mdi mdi-source-branch" />
            <span>Branches</span>
          </router-link>
        </li>
        <li
          class="tab-element"
          :class="[
            { 'tab-element-selected': $route.name.match('project tags runs') },
          ]"
        >
          <router-link
            :to="projectTagsRunsLink(ownertype, ownername, projectref)"
          >
            <i class="mr-1 mdi mdi-tag" />
            <span>Tags</span>
          </router-link>
        </li>
        <li
          class="tab-element"
          :class="[
            {
              'tab-element-selected': $route.name.match(
                'project pull requests runs'
              ),
            },
          ]"
        >
          <router-link
            :to="projectPRsRunsLink(ownertype, ownername, projectref)"
          >
            <i class="mr-1 mdi mdi-source-pull" />
            <span>Pull Requests</span>
          </router-link>
        </li>
        <li
          v-if="
            run &&
            ($route.name.endsWith('project run') ||
              $route.name.endsWith('project run task'))
          "
        >
          <tabarrow />
        </li>
        <li
          class="tab-element"
          v-if="
            run &&
            ($route.name.endsWith('project run') ||
              $route.name.endsWith('project run task'))
          "
          :class="[
            { 'tab-element-selected': $route.name.endsWith('project run') },
          ]"
        >
          <router-link
            :to="
              projectRunLink(
                ownertype,
                ownername,
                projectref,
                $route.params.runid
              )
            "
          >
            <p>
              Run
              <strong>#{{ run.counter }}</strong>
            </p>
          </router-link>
        </li>
        <li v-if="run && $route.name.endsWith('project run task')">
          <tabarrow />
        </li>
        <li
          class="tab-element"
          v-if="run && $route.name.endsWith('project run task')"
          :class="[
            {
              'tab-element-selected': $route.name.endsWith('project run task'),
            },
          ]"
        >
          <router-link
            :to="
              projectRunTaskLink(
                ownertype,
                ownername,
                projectref,
                $route.params.runid,
                $route.params.taskid
              )
            "
          >
            <p>
              Task
              <strong>{{ run.tasks[$route.params.taskid].name }}</strong>
            </p>
          </router-link>
        </li>
        <li
          v-if="$route.name.endsWith('project settings')"
          class="tab-element"
          :class="[
            {
              'tab-element-selected': $route.name.endsWith('project settings'),
            },
          ]"
        >
          <router-link
            :to="projectSettingsLink(ownertype, ownername, projectref)"
          >
            <i class="mr-1 mdi mdi-settings" />
            <span>Project Settings</span>
          </router-link>
        </li>
      </ul>
      <ul class="flex tab">
        <li>
          <div class="relative">
            <div
              class="flex -mt-3"
              v-click-outside="() => (dropdownActive = false)"
              @click="dropdownActive = !dropdownActive"
            >
              <button
                class="relative flex items-center focus:outline-none bg-transparent hover:bg-gray-300 text-dark font-semibold hover:text-dark py-1 px-4 border border-gray-500 rounded"
              >
                <i class="mr-4 mdi mdi-settings" />
                <i class="mdi mdi-chevron-down"></i>
              </button>
            </div>
            <div
              v-if="dropdownActive"
              class="z-10 origin-top-right absolute right-0 mt-2 w-64 bg-white rounded-lg border shadow-md py-2"
            >
              <ul>
                <li>
                  <router-link
                    class="block px-4 py-2 hover:bg-blue-500 hover:text-white"
                    :to="projectSettingsLink(ownertype, ownername, projectref)"
                  >
                    <i class="mr-1 mdi mdi-settings" />
                    <span>Project Settings</span>
                  </router-link>
                </li>
              </ul>
            </div>
          </div>
        </li>
      </ul>
    </div>
    <router-view class="mt-8"></router-view>
  </div>
</template>

<script>
import * as vClickOutside from 'v-click-outside-x';

import {
  projectLink,
  projectRunsLink,
  projectBranchesRunsLink,
  projectTagsRunsLink,
  projectPRsRunsLink,
  projectRunLink,
  projectRunTaskLink,
  projectSettingsLink,
} from '@/util/link.js';

import { fetchRun } from '@/util/data.js';

import projbreadcrumbs from '@/components/projbreadcrumbs.vue';
import tabarrow from '@/components/tabarrow.vue';

export default {
  name: 'Project',
  components: { projbreadcrumbs, tabarrow },
  directives: {
    clickOutside: vClickOutside.directive,
  },
  props: {
    ownertype: String,
    ownername: String,
    projectref: Array,
  },
  data() {
    return {
      fetchAbort: null,

      dropdownActive: false,
      run: null,
    };
  },
  watch: {
    $route: async function (route) {
      if (this.fetchAbort) {
        this.fetchAbort.abort();
      }
      this.fetchAbort = new AbortController();

      this.run = null;
      if (route.params.runid) {
        let { data, error, aborted } = await fetchRun(
          route.params.runid,
          this.fetchAbort.signal
        );
        if (aborted) {
          return;
        }
        if (error) {
          this.$store.dispatch('setError', error);
          return;
        }
        this.run = data;
      }
    },
  },
  methods: {
    projectLink: projectLink,
    projectRunsLink: projectRunsLink,
    projectBranchesRunsLink: projectBranchesRunsLink,
    projectTagsRunsLink: projectTagsRunsLink,
    projectPRsRunsLink: projectPRsRunsLink,
    projectRunLink: projectRunLink,
    projectRunTaskLink: projectRunTaskLink,
    projectSettingsLink: projectSettingsLink,
    projectName() {
      return this.projectref[this.projectref.length - 1];
    },
  },
  created: async function () {
    this.fetchAbort = new AbortController();

    if (this.$route.params.runid) {
      let { data, error, aborted } = await fetchRun(
        this.$route.params.runid,
        this.fetchAbort.signal
      );
      if (aborted) {
        return;
      }
      if (error) {
        this.$store.dispatch('setError', error);
        return;
      }
      this.run = data;
    }
  },
  beforeDestroy() {
    if (this.fetchAbort) {
      this.fetchAbort.abort();
    }
  },
};
</script>

<style scoped lang="scss"></style>