/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


import { generateModal } from '../utils/models';

export default generateModal({
  namespace: 'topology',
  state: {
    getClusterTopology: {
      nodes: [],
      calls: [],
    },
  },
  dataQuery: `
    query Topology($duration: Duration!) {
      getClusterTopology(duration: $duration) {
        nodes {
          id
          name
          type
          ... on ApplicationNode {
            sla
            cpm
            avgResponseTime
            apdex
            isAlarm
            numOfServer
            numOfServerAlarm
            numOfServiceAlarm
          }
        }
        calls {
          source
          target
          isAlert
          callType
          cpm
          avgResponseTime
        }
      }
    }
  `,
  reducers: {
    filterApplication(preState, { payload: { aa } }) {
      const { variables } = preState;
      if (aa.length < 1) {
        const newVariables = { ...variables };
        delete newVariables.appRegExps;
        delete newVariables.appFilters;
        return {
          ...preState,
          variables: newVariables,
        };
      }
      return {
        ...preState,
        variables: {
          ...variables,
          appFilters: aa,
          appRegExps: aa.map((a) => {
            try {
              return new RegExp(a, 'i');
            } catch (e) {
              return null;
            }
          }),
        },
      };
    },
  },
});
