// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

/**
 * @fileoverview Utility for converting from a kind to a TypeObject.
 * @private
 */

var kind = require('./kind.js');
var Type = require('./type.js');
var types = require('./types.js');

module.exports = typeObjectFromKind;

// All Types below are constructed with 'isValidated' set to true. This avoids a
// cyclic dependency with canonicalize.js and type.js.
var _primitiveTypeObject = new Type({
  name: 'PrimitiveTypeObject',
  kind: kind.STRUCT,
  fields: [
    {
      name: 'Kind',
      type: types.STRING
    },
    {
      name: 'Name',
      type: types.STRING
    }
  ]
}, true);

var _optionalTypeObject = new Type({
  name: 'OptionalTypeObject',
  kind: kind.STRUCT,
  fields: [
    {
      name: 'Kind',
      type: types.STRING
    },
    {
      name: 'Name',
      type: types.STRING
    },
    {
      name: 'Elem',
      type: types.TYPEOBJECT
    }
  ]
}, true);

var _enumTypeObject = new Type({
  name: 'EnumTypeObject',
  kind: kind.STRUCT,
  fields: [
    {
      name: 'Kind',
      type: types.STRING
    },
    {
      name: 'Name',
      type: types.STRING
    },
    {
      name: 'Labels',
      type: new Type({
        kind: kind.LIST,
        elem: types.STRING
      }, true)
    }
  ]
}, true);

var _listTypeObject = new Type({
  name: 'ListTypeObject',
  kind: kind.STRUCT,
  fields: [
    {
      name: 'Kind',
      type: types.STRING
    },
    {
      name: 'Name',
      type: types.STRING
    },
    {
      name: 'Elem',
      type: types.TYPEOBJECT
    }
  ]
}, true);

var _arrayTypeObject = new Type({
  name: 'ArrayTypeObject',
  kind: kind.STRUCT,
  fields: [
    {
      name: 'Kind',
      type: types.STRING
    },
    {
      name: 'Name',
      type: types.STRING
    },
    {
      name: 'Elem',
      type: types.TYPEOBJECT
    },
    {
      name: 'Len',
      type: types.UINT32
    }
  ]
}, true);

var _setTypeObject = new Type({
  name: 'SetTypeObject',
  kind: kind.STRUCT,
  fields: [
    {
      name: 'Kind',
      type: types.STRING
    },
    {
      name: 'Name',
      type: types.STRING
    },
    {
      name: 'Key',
      type: types.TYPEOBJECT
    }
  ]
}, true);

var _mapTypeObject = new Type({
  name: 'MapTypeObject',
  kind: kind.STRUCT,
  fields: [
    {
      name: 'Kind',
      type: types.STRING
    },
    {
      name: 'Name',
      type: types.STRING
    },
    {
      name: 'Key',
      type: types.TYPEOBJECT
    },
    {
      name: 'Elem',
      type: types.TYPEOBJECT
    }
  ]
}, true);

var _structTypeObject = new Type({
  name: 'StructTypeObject',
  kind: kind.STRUCT,
  fields: [
    {
      name: 'Kind',
      type: types.STRING
    },
    {
      name: 'Name',
      type: types.STRING
    },
    {
      name: 'Fields',
      type: new Type({
        kind: kind.LIST,
        elem: new Type({
          kind: kind.STRUCT,
          fields: [
            {
              name: 'Name',
              type: types.STRING
            },
            {
              name: 'Type',
              type: types.TYPEOBJECT
            }
          ]
        }, true)
      }, true)
    }
  ]
}, true);

var _unionTypeObject = new Type({
  name: 'UnionTypeObject',
  kind: kind.STRUCT,
  fields: [
    {
      name: 'Kind',
      type: types.STRING
    },
    {
      name: 'Name',
      type: types.STRING
    },
    {
      name: 'Fields',
      type: new Type({
        kind: kind.LIST,
        elem: new Type({
          kind: kind.STRUCT,
          fields: [
            {
              name: 'Name',
              type: types.STRING
            },
            {
              name: 'Type',
              type: types.TYPEOBJECT
            }
          ]
        }, true)
      }, true)
    }
  ]
}, true);

/**
 * Returns the corresponding type object for a given kind.
 * @private
 * @param {kind} k The kind.
 * @return {TypeObject} The corresponding type object.
 */
function typeObjectFromKind(k) {
  switch (k) {
    case kind.BOOL:
    case kind.BYTE:
    case kind.UINT16:
    case kind.UINT32:
    case kind.UINT64:
    case kind.INT8:
    case kind.INT16:
    case kind.INT32:
    case kind.INT64:
    case kind.FLOAT32:
    case kind.FLOAT64:
    case kind.COMPLEX64:
    case kind.COMPLEX128:
    case kind.STRING:
    case kind.ANY:
    case kind.TYPEOBJECT:
      return _primitiveTypeObject;
    case kind.OPTIONAL:
      return _optionalTypeObject;
    case kind.ENUM:
      return _enumTypeObject;
    case kind.LIST:
      return _listTypeObject;
    case kind.ARRAY:
      return _arrayTypeObject;
    case kind.SET:
      return _setTypeObject;
    case kind.MAP:
      return _mapTypeObject;
    case kind.STRUCT:
      return _structTypeObject;
    case kind.UNION:
      return _unionTypeObject;
    default:
      throw new TypeError('Unknown kind ' + k);
  }
}
