'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var has = require('has'); var $TypeError = GetIntrinsic('%TypeError%');

module.exports = function IsPropertyDescriptor(ES, Desc) {

    if (ES.Type(Desc) !== 'Object') {
            return false;
    }
    var allowed = {
            '[[Configurable]]': true,
            '[[Enumerable]]': true,
            '[[Get]]': true,
            '[[Set]]': true,
            '[[Value]]': true,
            '[[Writable]]': true
    };

for (var key in Desc) { // eslint-disable-line
            if (has(Desc, key) && !allowed[key]) {
                    return false;
            }
    }

    if (ES.IsDataDescriptor(Desc) && ES.IsAccessorDescriptor(Desc)) {
            throw new $TypeError('Property Descriptors may not be both accessor and data descriptors');
    }
    return true;

};