import fs from 'fs';
import { delay } from 'roadhog-api-doc';
import { getGlobalTopology, getServiceTopology, getEndpointTopology } from './mock/topology';
import { Alarms, AlarmTrend } from './mock/alarm';
import { TraceBrief, Trace } from './mock/trace'
import { makeExecutableSchema, addMockFunctionsToSchema } from 'graphql-tools';
import { graphql } from 'graphql';
import { ClusterBrief, getServiceInstances, getAllServices, searchEndpoint, EndpointInfo } from './mock/metadata';
import { IntValues, Thermodynamic } from './mock/metric';
import { getServiceTopN, getAllEndpointTopN, getServiceInstanceTopN, getEndpointTopN } from './mock/aggregation';

const noMock = process.env.NO_MOCK === 'true';

const resolvers = {
  Query: {
    getAllServices,
    getServiceInstances,
    getServiceTopN,
    getAllEndpointTopN,
    getGlobalTopology,
    getServiceTopology,
    getEndpointTopology,
    searchEndpoint,
    getEndpointTopN,
    getServiceInstanceTopN,
  }
}

const schema = makeExecutableSchema({ typeDefs: [
  "scalar Long",
  fs.readFileSync('query-protocol/common.graphqls', 'utf8'),
  fs.readFileSync('query-protocol/metadata.graphqls', 'utf8'),
  fs.readFileSync('query-protocol/alarm.graphqls', 'utf8'),
  fs.readFileSync('query-protocol/metric.graphqls', 'utf8'),
  fs.readFileSync('query-protocol/aggregation.graphqls', 'utf8'),
  fs.readFileSync('query-protocol/trace.graphqls', 'utf8'),
  fs.readFileSync('query-protocol/topology.graphqls', 'utf8'),
], resolvers });

addMockFunctionsToSchema({
  schema,
  mocks: {
    Long: () => 1,
    ClusterBrief,
    Thermodynamic,
    AlarmTrend,
    Alarms,
    TraceBrief,
    Trace,
    IntValues,
    EndpointInfo,
  },
  preserveResolvers: true
});

const proxy = {
  'POST /api/graphql': (req, res) => {
    const { query: source, variables: variableValues } = req.body;
    graphql({ schema, source, variableValues }).then((result) => res.send(result));
  },
  'POST /api/login/account': (req, res) => {
    const { password, userName } = req.body;
    if (password === '888888' && userName === 'admin') {
      res.send({
        status: 'ok',
        currentAuthority: 'admin',
      });
      return;
    }
    res.send({
      status: 'error',
      currentAuthority: 'guest',
    });
  },
};

export default noMock ? {} : delay(proxy, 1000);
