/**
 * Proxy to access Google **[calendar resources](https://developers.google.com/google-apps/calendar/v3/reference/calendarList)**.
 */
Ext.define('Ext.google.data.CalendarsProxy', {
    extend: 'Ext.google.data.AbstractProxy',
    alias: 'proxy.google-calendars',
 
    requires: [
        'Ext.google.data.EventsProxy'
    ],
 
    googleApis: { 'calendar': { version: 'v3' } },
 
    /**
     * @method buildApiRequests
     * @protected
     * @inheritdoc
     */
    buildApiRequests: function(request) {
        var me = this,
            action = request.getAction();
 
        switch (action) {
        case 'read':
            return me.buildReadApiRequests(request);
        case 'update':
            return me.buildUpdateApiRequests(request);
        default:
            Ext.raise('unsupported request: calendars.' + action);
            return null;
        }
    },
 
    /**
     * @method extractResponseData
     * @protected
     * @inheritdoc
     */
    extractResponseData: function(response) {
        var me = this,
            data = me.callParent(arguments),
            items = [];
 
        // We assume that the response contains only results of the same kind.
        Ext.each(data.results, function(result) {
            switch (result.kind) {
            case 'calendar#calendarList':
                items = items.concat(result.items.map(me.fromApiCalendar.bind(me)));
                break;
            default:
                break;
            }
        });
 
        return {
            items: me.sanitizeItems(items),
            success: data.success,
            error: data.error
        };
    },
 
    privates: {
        // https://developers.google.com/google-apps/calendar/v3/reference/calendarList#resource
        toApiCalendar: function(data) {
            var res = {};
 
            Ext.Object.each(data, function(key, value) {
                switch (key) {
                case 'id':
                    res.calendarId = value;
                    break;
                case 'hidden':
                    res.selected = !value;
                    break;
                default:
                    break;
                }
            });
 
            return res;
        },
 
        // https://developers.google.com/google-apps/calendar/v3/reference/calendarList#resource
        fromApiCalendar: function(data) {
            var record = {
                    hidden: !data.selected,
                    editable: false,
                    eventStore: {
                        autoSync: true,
                        proxy: {
                            type: 'google-events',
                            resourceTypes: 'events'
                        }
                    }
                };
 
            Ext.Object.each(data, function(key, value) {
                switch (key) {
                case 'id':
                case 'description':
                    record[key] = value;
                    break;
                case 'backgroundColor':
                    record.color = value;
                    break;
                case 'summary':
                    record.title = value;
                    break;
                case 'accessRole':
                    record.editable = (value == 'owner' || value == 'writer');
                    break;
                default:
                    break;
                }
            });
 
            return record;
        },
 
        // https://developers.google.com/google-apps/calendar/v3/reference/calendarList/list
        buildReadApiRequests: function(request) {
            return gapi.client.calendar.calendarList.list();
        },
 
        // https://developers.google.com/google-apps/calendar/v3/reference/calendarList/patch
        buildUpdateApiRequests: function(request) {
            var data = this.toApiCalendar(request.getJsonData());
            return gapi.client.calendar.calendarList.patch(data);
        }
    }
});