import fetchMock, { FetchMockStatic } from 'fetch-mock';
import {
  DataFrame,
  ReadOnlyParamSet,
  ColumnHeader,
  Trace,
  TraceSet,
  FrameRequest,
  AnomalyMap,
  Anomaly,
} from '../json';
import { findAnomalyInRange, findSubDataframe, generateSubDataframe, range } from './index';
import { fromParamSet } from '../../../infra-sk/modules/query';

// Generates an array where the values are repeated from the template.
const generateTraceFromTemplate = (template: number[], size: number) => {
  return Array(Math.ceil(size / template.length))
    .fill(template)
    .flat()
    .filter((v) => typeof v === 'number')
    .slice(0, size);
};

// Check if the given array contains at least one number.
const containsAtLeastOneNumber = (values: any[] | null) =>
  values?.filter((v) => typeof v === 'number').length || 0 > 0;

/**
 * Generate a dataframe set as followings:
 * {
 *  header: [ {
 *    offset: range.begin,
 *    timesteamp: time + timeSpan * ...(range.end - range.begin)
 *  } ...],
 *  traceset: {
 *    ",key=0": [rand()...],
 *    ",key=(tracesCount)": [rand()...],
 *  },
 * }
 *
 * There will be [range.end - range.begin] number of consecutive offsets and
 * timestamped with timeSpan intervals. The data can be filled with the given
 * array by repeating itself to fill the number of commits.
 *
 * The generated trace values can be controlled by the optional traceValues.
 * The traceValues provides a template trace values to copy from. If not given,
 * the trace values will be generated randomly, which will be different in each
 * run. This can be used to test a stable trace that produce the same chart, or
 * a specific trace values you need to validate.
 * @param range The start and end commit position (offset range)
 * @param time  The start of the timestamp
 * @param tracesCount The number of traces
 * @param timeSpans The time intervals for timestamp, multiple spans will make
 *  each offset advance in a different stamp
 * @param traceValues The trace template numbers to copy from, or random if
 *  not given. See above.
 * @returns DataFrame
 */
export const generateFullDataFrame = (
  range: range,
  time: number,
  tracesCount: number,
  timeSpans: number[],
  traceValues: (number[] | null)[] = [],
  keys?: string[]
): DataFrame => {
  const offsets = Array(range.end - range.begin).fill(0);
  const traces = Array(tracesCount).fill(0);
  const traceKeys = keys ?? traces.map((_, v) => `,key=${v}`);
  // A helper function to generate the timestamp at index.
  // The timeSpans are accumulated one by one.
  const timeSpan = (idx: number) =>
    Array(idx)
      .fill(0)
      .reduce((pre, _, idx) => pre + timeSpans[idx % timeSpans.length], 0);
  return {
    header: offsets.map(
      (_, v) =>
        ({
          offset: range.begin + v,
          timestamp: time + timeSpan(v),
        }) as ColumnHeader
    ),
    traceset: Object.fromEntries(
      traces.map((_, v) => [
        traceKeys[v],
        containsAtLeastOneNumber(traceValues[v])
          ? generateTraceFromTemplate(traceValues[v]!, offsets.length)
          : (offsets.map(() => Math.random()) as Trace),
      ])
    ) as TraceSet,
    skip: 0,
    paramset: ReadOnlyParamSet({}),
    traceMetadata: [],
  };
};

/**
 * Generates the AnomalyMap from the DataFrame using simple input.
 * @param df The dataframe used for the base commit and trace.
 * @param data The list of anomaly data
 * @returns The AnomalyMap
 */
export const generateAnomalyMap = (
  df: DataFrame,
  data: {
    trace?: number; // The trace index in DataFrame
    commit: number; // The commit offset from the first commit in DataFrame
    bugId?: number; // The bugId that can be used to validate test.
  }[]
) => {
  if ((df.header?.length || 0) <= 0) {
    return {};
  }
  const firstCommit = df.header![0]!.offset;
  const anomaly: AnomalyMap = {};
  data.forEach((each) => {
    const traceKey = `,key=${each.trace || 0}`;
    anomaly[traceKey] = anomaly[traceKey] || {};
    anomaly[traceKey]![firstCommit + each.commit] = {
      bug_id: each.bugId || 0,
    } as Anomaly;
  });
  return anomaly;
};

export const mockUserIssues = (isError: boolean) => {
  const mock: FetchMockStatic = fetchMock;
  if (isError) {
    return mock.post('/_/user_issues/', 500);
  }

  mock.post(
    {
      url: '/_/user_issues/',
      method: 'POST',
      matchPartialBody: true,
      delay: 0,
    },
    () => {
      return {
        UserIssues: [
          { UserId: 'a@b.com', TraceKey: ',a=1,', CommitPosition: 1, IssueId: 2345 },
          { UserId: 'a@b.com', TraceKey: ',b=1,', CommitPosition: 3, IssueId: 3456 },
          { UserId: 'a@b.com', TraceKey: ',c=1,', CommitPosition: 8, IssueId: 4567 },
        ],
      };
    }
  );

  return mock;
};

export const mockFrameStart = (
  df: DataFrame,
  paramset: ReadOnlyParamSet,
  anomaly: AnomalyMap = null,
  delayInMS: number = 0,
  mock: FetchMockStatic = fetchMock
) => {
  mock.post(
    {
      url: '/_/frame/start',
      method: 'POST',
      matchPartialBody: true,
      delay: delayInMS,
      body: {
        queries: [fromParamSet(paramset)],
      },
    },
    (_, req) => {
      const body: FrameRequest = JSON.parse(req.body!.toString());
      const subrange = findSubDataframe(df.header!, {
        begin: body.begin,
        end: body.end,
      });

      return {
        status: 'Finished',
        messages: [{ key: 'Loading', value: 'Finished' }],
        results: {
          dataframe: generateSubDataframe(df, subrange),
          anomalymap: findAnomalyInRange(anomaly, {
            begin: df.header![subrange.begin]?.offset || 0,
            end: df.header![subrange.end]?.offset || 0,
          }),
        },
      };
    }
  );
  return mock;
};
