import React, { useReducer, createContext, useMemo } from "react";
import { jobStatus } from "./JobContext.jsx";

const StoreContext = createContext();

const ACTIONS = {
  UPDATE: "u",
};

const silencedMock = new Array(10).fill(0).map((v, i) => ({
  name: `Test${i + 1}`,
  class: `SomeTestClass${i % 2 ? i - 1 : i / 2}`,
  method: "someMethod",
  id: Date.now(),
  silencedUntil: `2022-05-10T16:${2 + i}:33.810Z`,
}));

const catalogMock = new Array(10).fill(0).map((v, i) => ({
  name: `Test${i + 1}`,
  class: `SomeTestClass${i % 2 ? i - 1 : i / 2}`,
  repo: "Repo",
  isCompound: i % 5 ? false : true,
  type: i % 3 ? "api" : "ui",
}));

const failingMock = new Array(12).fill(0).map((v, i) => ({
  class: `SomeTestClass${i % 2 ? i - 1 : i / 2}`,
  name: `TestThatDoesOneThing${i + 1}`,
  timestamp: `2022-05-10T16:0${i < 10 ? i : i - 10}:33.810Z`,
  method: `SomeMethod`,
  silencedUntil: i % 4 ? null : `2022-05-10T16:0${i}:33.810Z`,
  frequency: "1hour",
  type: i % 3 ? "api" : "ui",
  dailyFails: i + 1,
  screenshot: "https://picsum.photos/1920/1080",
  recentResults: [1, 0, 0, 1, 0],
  isCompound: i % 5 ? false : true,
  failedMessage: `Some Test FailureMessage ${i}`,
  jobStatus: (() => {
    switch (i) {
      case 1:
        return jobStatus.OK;
      case 3:
        return jobStatus.ERROR;
      case 4:
        return jobStatus.PENDING;
      case 5:
        return jobStatus.ACTIVE;
      case 6:
        return jobStatus.CANCELED;
      case 8:
        return jobStatus.QUEUED;
      default:
        return null;
    }
  })(),
}));

const initialState = {
  pages: ["failing", "alerting", "jobs", "catalog", "settings", "about"],
  intervals: [],
  catalog: catalogMock,
  failing: failingMock,
  silenced: silencedMock,
  regions: [],
  catalogSearch: "",
  focusJob: false,
  simplifiedControls: true,
  logAppDetails: true,
  defaultRegion: "us", // Local Store
  defaultPage: "failing", // Local Store
};

const reducer = (state, action) => {
  const { store } = action;
  // Actions
  switch (action.type) {
    case ACTIONS.UPDATE:
      return { ...state, ...store };
    default:
      return state;
  }
};

export const StoreProvider = ({ children }) => {
  const [state, dispatch] = useReducer(reducer, initialState);

  function silenceRequest(silenceInfo) {
    const req = {
      name: silenceInfo.name ?? "*",
      class: silenceInfo.class ?? "*",
      method: silenceInfo.method ?? "*",
      silencedUntil: silenceInfo.silencedUntil,
    };
    console.log("Would upsert silence", req);
  }

  function removeFailure(failure) {
    const req = {
      name: failure.name,
      class: failure.class,
    };
    console.log("Would remove failure", req);
  }

  const context = {
    state,
    dispatch,
    silenceRequest,
    removeFailure,
    updateStore: (store) => dispatch({ type: ACTIONS.UPDATE, store }),
  };
  const contextValue = useMemo(() => context, [state, dispatch]);

  return (
    <StoreContext.Provider value={contextValue}>
      {children}
    </StoreContext.Provider>
  );
};

export default StoreContext;
