const { GraphQLScalarType, Kind } = require('graphql');

const kinds = {
  [Kind.STRING]: ast => {
    return ast.value;
  },
  [Kind.BOOLEAN]: ast => {
    return kinds[Kind.STRING](ast);
  },
  [Kind.INT]: ast => {
    return Number(ast.value);
  },
  [Kind.FLOAT]: ast => {
    return kinds[Kind.INT](ast);
  },
  [Kind.OBJECT]: ast => {
    const value = Object.create(null);
    ast.fields.forEach(field => {
      value[field.name.value] = parseLiteral(field.value);
    });

    return value;
  },
  [Kind.LIST]: ast => {
    return ast.values.map(parseLiteral);
  }
};

// https://github.com/taion/graphql-type-json/blob/master/src/index.js
const parseLiteral = ast => {
  const kind = kinds[ast.kind];
  return kind ? kinds[ast.kind](ast) : null;
};

// From http://stackoverflow.com/a/34229603
module.exports = new GraphQLScalarType({
  name: 'DynamicObjectType',
  serialize: v => v,
  parseValue: v => v,
  parseLiteral
});
