import { EXTENSION_ICONS } from '~/vue_merge_request_widget/constants';

export const workingExtension = (shouldCollapse = true) => ({
  name: 'WidgetTestExtension',
  props: ['targetProjectFullPath'],
  expandEvent: 'test_expand_event',
  i18n: {
    loading: 'Test extension loading...',
  },
  computed: {
    summary({ count, targetProjectFullPath } = {}) {
      return `Test extension summary count: ${count} & ${targetProjectFullPath}`;
    },
    statusIcon({ count } = {}) {
      return count > 0 ? EXTENSION_ICONS.warning : EXTENSION_ICONS.success;
    },
    shouldCollapse() {
      return shouldCollapse;
    },
  },
  methods: {
    fetchCollapsedData({ targetProjectFullPath }) {
      return Promise.resolve({ targetProjectFullPath, count: 1 });
    },
    fetchFullData() {
      return Promise.resolve([
        {
          id: 1,
          text: 'Hello world',
          icon: {
            name: EXTENSION_ICONS.failed,
          },
          badge: {
            text: 'Closed',
          },
          link: {
            href: 'https://gitlab.com',
            text: 'GitLab.com',
          },
          actions: [{ text: 'Full report', href: 'https://gitlab.com', target: '_blank' }],
        },
      ]);
    },
  },
});

export const collapsedDataErrorExtension = {
  name: 'WidgetTestCollapsedErrorExtension',
  props: ['targetProjectFullPath'],
  expandEvent: 'test_expand_event',
  computed: {
    summary({ count, targetProjectFullPath }) {
      return `Test extension summary count: ${count} & ${targetProjectFullPath}`;
    },
    statusIcon({ count }) {
      return count > 0 ? EXTENSION_ICONS.warning : EXTENSION_ICONS.success;
    },
  },
  methods: {
    fetchCollapsedData() {
      return Promise.reject(new Error('Fetch error'));
    },
    fetchFullData() {
      return Promise.resolve([
        {
          id: 1,
          text: 'Hello world',
          icon: {
            name: EXTENSION_ICONS.failed,
          },
          badge: {
            text: 'Closed',
          },
          link: {
            href: 'https://gitlab.com',
            text: 'GitLab.com',
          },
          actions: [{ text: 'Full report', href: 'https://gitlab.com', target: '_blank' }],
        },
      ]);
    },
  },
};

export const fullDataErrorExtension = {
  name: 'WidgetTestCollapsedErrorExtension',
  props: ['targetProjectFullPath'],
  expandEvent: 'test_expand_event',
  computed: {
    summary({ count, targetProjectFullPath }) {
      return `Test extension summary count: ${count} & ${targetProjectFullPath}`;
    },
    statusIcon({ count }) {
      return count > 0 ? EXTENSION_ICONS.warning : EXTENSION_ICONS.success;
    },
  },
  methods: {
    fetchCollapsedData({ targetProjectFullPath }) {
      return Promise.resolve({ targetProjectFullPath, count: 1 });
    },
    fetchFullData() {
      return Promise.reject(new Error('Fetch error'));
    },
  },
};

export const pollingExtension = {
  ...workingExtension(),
  enablePolling: true,
};

export const pollingFullDataExtension = {
  ...workingExtension(),
  enableExpandedPolling: true,
  methods: {
    fetchCollapsedData({ targetProjectFullPath }) {
      return Promise.resolve({ targetProjectFullPath, count: 1 });
    },
    fetchFullData() {
      return Promise.resolve([
        {
          headers: { 'poll-interval': 0 },
          status: 200,
          data: {
            id: 1,
            text: 'Hello world',
            icon: {
              name: EXTENSION_ICONS.failed,
            },
            badge: {
              text: 'Closed',
            },
            link: {
              href: 'https://gitlab.com',
              text: 'GitLab.com',
            },
            actions: [{ text: 'Full report', href: 'https://gitlab.com', target: '_blank' }],
          },
        },
      ]);
    },
  },
};

export const fullReportExtension = {
  ...workingExtension(),
  computed: {
    ...workingExtension().computed,
    tertiaryButtons() {
      return [
        {
          text: 'test',
          href: `testref`,
          target: '_blank',
          fullReport: true,
        },
      ];
    },
  },
};

export const noTelemetryExtension = {
  ...fullReportExtension,
  telemetry: false,
};

export const multiPollingExtension = (endpointsToBePolled) => ({
  name: 'WidgetTestMultiPollingExtension',
  props: [],
  i18n: {
    loading: 'Test extension loading...',
  },
  computed: {
    summary(data) {
      return `Multi polling test extension reports: ${data?.[0]?.reports}, count: ${data.length}`;
    },
    statusIcon(data) {
      return data?.[0]?.reports === 'parsed' ? EXTENSION_ICONS.success : EXTENSION_ICONS.warning;
    },
  },
  enablePolling: true,
  methods: {
    fetchMultiData() {
      return endpointsToBePolled;
    },
  },
});

export const pollingErrorExtension = {
  ...collapsedDataErrorExtension,
  enablePolling: true,
};