'use strict';

const { GraphQLScalarType } = require('graphql');
const { Kind } = require('graphql');
const { parseType } = require('@strapi/utils');
const { ValidationError } = require('@strapi/utils').errors;

/**
 * A GraphQL scalar used to store Time (HH:mm:ss.SSS) values
 * @type {GraphQLScalarType}
 */
const TimeScalar = new GraphQLScalarType({
  name: 'Time',

  description: 'A time string with format HH:mm:ss.SSS',

  serialize(value) {
    return parseType({ type: 'time', value });
  },

  parseValue(value) {
    return parseType({ type: 'time', value });
  },

  parseLiteral(ast) {
    if (ast.kind !== Kind.STRING) {
      throw new ValidationError('Time cannot represent non string type');
    }

    const value = ast.value;

    return parseType({ type: 'time', value });
  },
});

module.exports = TimeScalar;
