/*
 * #dependsFile client/zarafa/core/data/RecordFactory.js
 * #dependsFile client/zarafa/contact/DistlistMemberStore.js
 */
Ext.namespace('Zarafa.contact');

/**
 * @class Zarafa.contact.DistListRecordFields
 * Array of {@link Ext.data.Field field} configurations for the
 * {@link Zarafa.core.data.IPMRecord IPMRecord} object.
 * These fields will be available in all 'IPM.DistList' type messages.
 */
Zarafa.contact.DistListRecordFields = [
	{name: 'fileas'},
	{name: 'dl_name'},
	{name: 'subject'},
	{name: 'display_name'},
	{name: 'sensitivity', type: 'int', defaultValue: Zarafa.core.mapi.Sensitivity.NONE},
	{name: 'address_type', type: 'string', defaultValue: 'SMTP'},
	{name: 'private', type: 'boolean', defaultValue: false}
];

/**
 * @class Zarafa.contact.DistlistRecord
 * @extends Zarafa.core.data.IPMRecord
 * 
 * An extension to the {@link Zarafa.core.data.IPMRecord IPMRecord} specific to records which are
 * used as Distribution Lists
 */
Zarafa.contact.DistlistRecord = Ext.extend(Zarafa.core.data.IPMRecord, {
	/**
	 * Convert this distribution list record into a {@link Zarafa.core.data.IPMRecipientRecord recipient}
	 * which can be used for composing news mails.
	 *
	 * @param {Zarafa.core.mapi.RecipientType} recipientType (optional) The recipient type which should
	 * be applied to this recipient. Defaults to {@link Zarafa.core.mapi.RecipientType#MAPI_TO}.
	 * @return {Zarafa.core.data.IPMRecipientRecord} The recipientRecord for this addressbook item
	 */
	convertToRecipient : function(recipientType)
	{
		var recipientRecord = Zarafa.core.data.RecordFactory.createRecordObjectByCustomType(Zarafa.core.data.RecordCustomObjectType.ZARAFA_RECIPIENT, {
			entryid : Zarafa.core.EntryId.wrapContactProviderEntryId(this.get('entryid'), Zarafa.core.mapi.ObjectType.MAPI_DISTLIST),
			object_type : Zarafa.core.mapi.ObjectType.MAPI_DISTLIST,
			display_type : Zarafa.core.mapi.DisplayType.DT_DISTLIST,
			display_type_ex : Zarafa.core.mapi.DisplayType.DT_DISTLIST,
			display_name : this.get('display_name'),
			email_address : this.get('fileas'),
			address_type : 'MAPIPDL',
			recipient_type : recipientType || Zarafa.core.mapi.RecipientType.MAPI_TO
		});

		return recipientRecord;
	},

	/**
	 * Convert this {@link Zarafa.contact.DistlistRecord DistlistRecord} into a {@link Zarafa.contact.DistlistMemberRecord DistlistMemberRecord}
	 * which can be used as record inside {@link Zarafa.contact.DistlistMemberStore}.
	 * @return {Zarafa.contact.DistlistMemberRecord} The distribution list member for distlist item.
	 */
	convertToDistlistMember : function()
	{
		return Zarafa.core.data.RecordFactory.createRecordObjectByCustomType(Zarafa.core.data.RecordCustomObjectType.ZARAFA_DISTLIST_MEMBER, {
			entryid : this.get('entryid'),
			address_type : 'MAPIPDL',
			// mapi_parseoneoff will fail if we don't give email_address
			email_address : this.get('fileas'),
			distlist_type : Zarafa.core.mapi.DistlistType.DL_DIST,
			display_name : this.get('display_name')
		});
	},

	/**
	 * Returns whether the IPMRecord supports the use of recipients or not (See {@link #supportsSubStore}).
	 * @return {Boolean} True if recipients are supported.
	 */
	supportsMembers: function()
	{
		return this.supportsSubStore('members');
	},

	/**
	 * Creates a Folder store for the {@link Zarafa.core.data.IPMRecord IPMRecord} (See {@link #createSubStore}).
	 * @return {Zarafa.core.data.IPMRecipientStore} The new Folder store.
	 */
	createMemberStore : function()
	{
		return this.createSubStore('members');
	},

	/**
	 * Set the Member store for the {@link Zarafa.core.data.IPMRecord record} (See {@link #setSubStore}).
	 * @param {Zarafa.core.data.IPMRecipientStore} memberStore The Member store.
	 * @return {Zarafa.core.data.IPMRecipientStore} The Member store.
	 */
	setMemberStore : function(memberStore)
	{
		return this.setSubStore('members', memberStore);
	},

	/**
	 * Get the Members store for the {@link Zarafa.core.data.IPMRecord IPMRecord} (See {@link #getSubStore}).
	 * @return {Zarafa.core.data.IPMRecipientStore} The Members store.
	 */
	getMemberStore : function()
	{
		return this.getSubStore('members');
	},

	/**
	 * Helper function to return names of all members of distribution list.
	 * @return {String} comma seperated member names
	 */
	getMemberNames : function()
	{
		var store = this.getSubStore('members');
		var names = [];

		store.each(function(member) {
			var name = member.get('display_name');

			if(!Ext.isEmpty(name)) {
				names.push(name);
			} else {
				names.push(member.get('email_address'));
			}
		}, this);

		return names.join('; ');
	}
});

Zarafa.core.data.RecordFactory.addFieldToMessageClass('IPM.DistList', Zarafa.contact.DistListRecordFields);
Zarafa.core.data.RecordFactory.setSubStoreToMessageClass('IPM.DistList', 'members', Zarafa.contact.DistlistMemberStore);
Zarafa.core.data.RecordFactory.setBaseClassToMessageClass('IPM.DistList', Zarafa.contact.DistlistRecord);