/**
 * 收藏夹页面主流程
 * @athor zhulin
 * @date 2014年4月11日
 * msg事件全部在这里注册；触发在data.js view.js等；
 *
 */
define(function (require, exports, module) {



    'use strict';
    // require('jquery');
    // require('underscore');

    var COUNTS_PER_PAGE = 20; // 每页的条目数量
    var APPEND_COUNTS = 5; // 下滚时每次追加的条目数目
    var BOTTOM_MARGIN = 200; // 滚动到离底部多少px时进行追加

    var logFlag = true;// 是否已经登录

    var data = require('./data.js');
    var view = require('./view.js');
    var msg = require('./msg.js');
    var sendLog = require('./log.js');


    // -------------------------------------------------------------------------
    // 初始化Tab
    // -------------------------------------------------------------------------
    var Tab = require('./tab.js');

    var cardsTab = new Tab({
        containerSelector : '.cards',
        btnSelector : '.cards-tab-hd',
        contentSelector : '.cards-tab-bd',
        curClass : 'current',
        mode : 'click',
        callback : function () {
            curCollectionTab = $(this).data('type');

            var logType;
            // 发送log
            switch(curCollectionTab) {
                case 'all':
                    logType = 'FAVOR_LIST';
                    break;
                case 'depricedReminder':
                    logType = 'PRICEALERT_LIST';
                    break;
            }

            setTimeout(function(){
                sendLog(logType);
            }, 200);

            // 切换到降价提醒
            if ($(this).hasClass('never-clicked')) {
                // 首次点该击tab 获取数据进行渲染
                newTab('depricedReminder');
                $(this).removeClass('never-clicked');
                // 隐藏提示数字
                $(this).find('#depricedReminderNumber').hide();

            } else {
                // 查看当前tab下是否内容已被清空；如果被清空则重新进行渲染
                // debugger;
                if (view.checkContents(curCollectionTab)) {
                    newTab(curCollectionTab, tabsStatus[curCollectionTab].curPage,tabsStatus[curCollectionTab].maxPage);

                    if (curCollectionTab === 'depricedReminder') {
                        // 隐藏降价信息提示
                        $('.deprice-info').hide();
                    }
                }

            }

        }
    });


    var collectionTab = new Tab({
        containerSelector : '.collections-hd',
        btnSelector : '.tab-hd',
        contentSelector : '.tab-bd',
        curClass : 'current',
        mode : 'click',
        callback : function () {
            curCollectionTab = $(this).data('type');
            var logType;
            // 发送log
            switch(curCollectionTab) {
                case 'all':
                    logType = 'FAVOR_LIST';
                    break;
                case 'depriced':
                    logType = 'FAVOR_RPICEDROPED';
                    break;
                case 'promotion':
                    logType = 'FAVOR_PROMOTIONED';
                    break;
            }
            setTimeout(function(){
                sendLog(logType);
            }, 200);
            if ($(this).hasClass('never-clicked')) {
                // 首次点击该tab 获取数据进行渲染
                newTab(curCollectionTab);


                $(this).removeClass('never-clicked');
                // 移除数字提示
                $(this).find('.number-tip').hide();
            }
            $('.ops').hide();
            // 控制对应的操作按钮展示和隐藏
            $('#' + curCollectionTab + 'Ops').show();
        }
    });

    var tabsInit = function () {
        cardsTab.init();
        collectionTab.init();
    };

    // -------------------------------------------------------------------------

    /**
     * 状态记录
     * type :
     * all | depriced | depricedReminder
     */
    var curCollectionTab = 'all';  // 切换collectiontab的时候改变
    var tabsStatus = {
        'all' : {
            'counts' : 0,
            'curPage' : 0, // 当前页码
            'maxPage' : 0 // 页码总数
        },
        'depriced' : {
            'counts' : 0,
            'curPage' : 0, // 当前页码
            'maxPage' : 0 // 页码总数
        },
        'promotion' : {
            'counts' : 0,
            'curPage' : 0, // 当前页码
            'maxPage' : 0 // 页码总数
        },
        'depricedReminder' : {
            'counts' : 0,
            'curPage' : 0, // 当前页码
            'maxPage' :0 // 页码总数
        }
    };

    // -------------------------------------------------------------------------
    // 注册消息
    // -------------------------------------------------------------------------
    /**
     * 未登录
     */
    msg.on('noLogin', function () {
        //未登录
        logFlag = false;
        view.renderNoLoginTip();
    });

    /**
     * 删除收藏夹中的条目
     */
    msg.on('deleteItems', function (urls) {

        data.deleteData(curCollectionTab, urls, function () {
            // 删除视图中的该项条目
            if (_.isArray(urls)) {
                _.each(urls, function (url) {
                    view.deleteItem(url);
                });
            } else {
                view.deleteItem(urls);
            }
        });
    });

    /**
     * 切换页码
     */
    msg.on('goToPage', function (pageIndex, source) {
        if (!_.isNumber(pageIndex) && !_.isString(pageIndex)) {
            throw new Error('页码参数错误！');
        }

        var type = curCollectionTab;
        // 当前页不做跳转
        if (pageIndex === tabsStatus[type].curPage) {
            return;
        }

        var logType, logPosition;
        switch(type) {
            case 'depricedReminders':
                logType = (source === 'hd' ?
                    'PRICEALERT_LIST_PAGECHANGERIGHT_CLICK' : 'PRICEALERT_LIST_PAGECHANGE_CLICK');
                break;
            default:
                logType = (source === 'hd' ?
                    'FAVOR_LIST_RIGHTPAGECHANGE_CLICK' : 'FAVOR_LIST_PAGECHANGE_CLICK');
                break;
        }

        switch(pageIndex) {
            case 'prev':
                pageIndex = tabsStatus[type].curPage - 1;
                logPosition = 'PREV';
                break;
            case 'next':
                pageIndex = tabsStatus[type].curPage + 1;
                logPosition = 'NEXT';
                break;
            default:
              logPosition = 'NUM';
        }
        sendLog(logType, undefined, logPosition);

        if (pageIndex > tabsStatus[type].maxPage) return;
        newTab(type, pageIndex);
    });

    /**
     * 更新总页码数目
     */
    msg.on('updateMaxPageNum', function (totalPageCounts, type) {
        tabsStatus[type].maxPage = totalPageCounts;
    });

    /**
     * 更改接受订阅提醒的邮箱
     */
    msg.on('setEmailData', function (email) {
        data.userInfo.changeDepricedEmail(email);
        $('.modify-depriced-reminder-email').data('email', email);
    });

    /**
     * 渲染网络错误提示
     */
    msg.on('offline', function (type) {
        view.renderOffLineTip(type);
    });

    msg.on('tryLoadPrevReq', function () {
        view.renderLoadingTip(curCollectionTab);
        data.retry();
    });

    /**
     * 展示获取积分的链接
     */
    msg.on('showJifenGuide', function (link) {
        $('#jifenGuide').attr('href', link).show();
    });
    var jifenGuideNoCollection = false;
    msg.on('showNewUserGuide', function (link) {
        jifenGuideNoCollection = link;
    });

    /*
     * 设置数字
     */
    var placeholders = {
        // 降价提醒的数字
        depricedReminderNumber : {
            selector : '#depricedReminderNumber',
            pre : function (number) {
                return '(' + number + ')';
            },
            callback : function (number) {
                if (number > 0) {
                    $('#depriceIcon').show();
                }
            }
        },
        descendNum : {
            selector : '.descendNum',
            callback : function (number) {
                if (number <= 0) {
                    $('#reminderHasDepricedItem').hide();
                } else {
                    $('#depriceIcon').show();
                }
            }
        },
        reachExpectNum : {
            selector : '.reachExpectNum',
            callback : function (number) {
                if (number > 0) {
                    $('#hasReachedTargetItem').show();
                    $('#depriceIcon').show();
                }
            }
        },
        // 收藏夹类别上的数字
        depricedNumber : {
            selector : '.priceLowSize'
        },
        promotionNumber : {
            selector : '.promotionSize'
        }
    };
    msg.on('setTipNumber', function (type, number) {
        var ref = placeholders[type];
        var originalNumber = number;
        if (_.isFunction(ref.pre)) {
            number = ref.pre(number);
        }
        view.setNumber(ref.selector, number, originalNumber);
        if (_.isFunction(ref.callback)) {
            ref.callback(originalNumber);
        }
    });

    // -------------------------------------------------------------------------
    //  方法
    // -------------------------------------------------------------------------
    /**
     * 渲染新tab页面
     * @param  {[type]} type      [description]
     * @param  {[type]} pageIndex [description]
     * @return {[type]}           [description]
     */
    function newTab(type, pageIndex, maxPage) {

        view.renderLoadingTip(type);
        if (pageIndex === undefined) {
            pageIndex = 1; // 默认为当前页面
        }

        var startInx = (pageIndex - 1) * COUNTS_PER_PAGE;

        // 渲染清单
        data.getData(type, startInx, APPEND_COUNTS, function (res) {

            // 必须等数据更新后知道当前有多少页才能够去取最大页码
            // 因此必须放在数据更新完毕的回调中看数据
            if (maxPage === undefined) {
                maxPage = tabsStatus[type].maxPage;
            }

            view.hideLoadingTip(type);

            if (res === 'none') {
                // 无数据
                view.renderNoDataTip(type);
                if (jifenGuideNoCollection) {
                    $('#jifenGuideNoCollection').attr('href', jifenGuideNoCollection).show();
                }
                // 更新状态
                tabsStatus[type].counts = 0;
                tabsStatus[type].curPage = pageIndex; // 首页
            } else {
                view.renderNewTab(type, res, pageIndex, maxPage);
                // 更新状态
                tabsStatus[type].counts = APPEND_COUNTS;
                tabsStatus[type].curPage = pageIndex; // 首页
            }

            // 刷新导航部分的前后页切换状态
            view.refreshPageControl(type, pageIndex !== 1, pageIndex !== tabsStatus[type].maxPage && tabsStatus[type].maxPage !== 0);
            // maxpage为0意味着没有数据
            // // 若页面加载5条后过短未出现滚动条
            // // 则继续加载一屏，直到填满或者已经渲染整个tab完毕
            // if (window.innerHeight + $(document).scrollTop() <= $(document).height()) {
            //     // renderAppendCurTab();
            // }
        });

        // 回到页面顶部
        $(document).scrollTop(0);
    }


    /**
     * 加载当前tab下5条到列表末尾
     * 只供滚动下拉触发更多加载的时候使用
     * @return {[type]} [description]
     */
    function renderAppendCurTab() {
        var type = curCollectionTab;
        var ref = tabsStatus[type];

        if (ref.counts === 0) {
            // 本模块无数据
            return;
        }

        view.renderLoadingTip(type);

        var startInx = (ref.curPage - 1) * COUNTS_PER_PAGE + ref.counts;
        data.getData(type, startInx, APPEND_COUNTS, function (res) {
            view.hideLoadingTip(type);
            view.appendCurTab(type, res);
        });
        tabsStatus[type].counts += APPEND_COUNTS;
    }

    /**
     * 滚动到距离最底部还有200px时多加载5条
     */
    $(window).on('scroll', function (e) {

        if ($(window).scrollTop() > $(window).height()) {
            $('.go-top').show();
        } else {
            $('.go-top').hide();

        }

        if (($(window).height() + $(this).scrollTop()) + BOTTOM_MARGIN >= $(document).height()) {
            // 滚到了最底部
            var type = curCollectionTab;
            if (tabsStatus[type].counts < COUNTS_PER_PAGE) {
                // 当前不足20条的时候继续加载
                renderAppendCurTab();
            }
        }

    });


    //--------------------------------------------------------------------------
    // 启动
    //
    module.exports = function () {

        view.init();

        view.renderLoadingTip('all');
        data.init(function () {
            // 渲染收藏夹数据
            newTab('all', 1);
            sendLog('FAVOR_LIST');

            if (logFlag) {
                tabsInit();
            }

        });

    };
    //--------------------------------------------------------------------------

});

