import Ember from 'ember';
import V3Serializer from 'travis/serializers/v3';

export default V3Serializer.extend({
  isNewSerializerAPI: true,

  extractRelationships(modelClass, resourceHash) {
    if(resourceHash['@type']) {
      return this._super(...arguments);
    } else {
      let relationships = {};

      modelClass.eachRelationship((key, relationshipMeta) => {
        // V2 API payload
        let relationship = null;
        let relationshipKey = this.keyForV2Relationship(key, relationshipMeta.kind, 'deserialize');
        let alternativeRelationshipKey = key.underscore();

        if (resourceHash.hasOwnProperty(alternativeRelationshipKey) || resourceHash.hasOwnProperty(relationshipKey)) {
          let data = null;
          let relationshipHash = resourceHash[alternativeRelationshipKey] || resourceHash[relationshipKey];
          if (relationshipMeta.kind === 'belongsTo') {
            data = this.extractRelationship(relationshipMeta.type, relationshipHash);
          } else if (relationshipMeta.kind === 'hasMany') {
            data = relationshipHash.map((item) => this.extractRelationship(relationshipMeta.type, item));
          }
          relationship = { data };
        }

        if (relationship) {
          relationships[key] = relationship;
        }
      });

      return relationships;
    }
  },

  normalize(modelClass, resourceHash) {
    if(resourceHash['@type']) {
      return this._super(...arguments);
    } else {
      var modelKey = modelClass.modelName;
      var attributes = resourceHash[modelKey];
      if(attributes) {
        for(var key in attributes) {
          resourceHash[key] = attributes[key];
        }

        resourceHash['type'] = modelKey;
        delete resourceHash[modelKey];
      }

      let { data, included } = this._super(...arguments);
      if(!included) {
        included = [];
      }
      let store = this.store;

      if(data.relationships) {
        Object.keys(data.relationships).forEach(function (key) {
          let relationship = data.relationships[key];
          let process = function(data) {
            if(Object.keys(data).sort()+'' !== 'id,type' || (data['@href'] && data.type === 'branch')) {
              // no need to add records if they have only id and type
              let type = key === 'defaultBranch' ? 'branch' : key.singularize();
              let serializer = store.serializerFor(type);
              let modelClass = store.modelFor(type);
              let normalized = serializer.normalize(modelClass, data);
              included.push(normalized.data);
              if(normalized.included) {
                normalized.included.forEach(function(item) {
                  included.push(item);
                });
              }
            }
          };

          if(Array.isArray(relationship.data)) {
            relationship.data.forEach(process);
          } else if(relationship && relationship.data) {
            process(relationship.data);
          }
        });
      }

      return { data, included };
    }
  },

  keyForV2Relationship(key, typeClass, method) {
    return key.underscore() + '_id';
  }
});