
<monthly >
    <style scoped>
    </style>

    <div class="Race_Infomation_Box" if={ !is_data }>投票履歴はございません。</div>

    <!--　月別表示　-->
    <div class="ResultSummary" >
        <dl class="{ edit_money_class(bet.total_diff) }" each={ bet, date in total_money } >
            <dt>{edit_date(date)}<span>{edit_week(date)}</span></dt>
            <dd class="ResultSummary_Inner">
                <a href="javascript:void(0);" onclick={ change_page.bind(this, 'daily', date, type) }>
                    <p>{ number_format(bet.total_diff) }<span>円</span></p>
                    <dl>
                        <dt>購入</dt>
                        <dd>{ number_format(bet.total_bet_money) }円</dd>
                        <dt>払戻</dt>
                        <dd>{ number_format(bet.total_pay) }円</dd>
                    </dl>
                    <span class="list_toggle">開く</span>
                </a>
            </dd>
        </dl>
    </div><!-- /.ResultSummary -->
    <!--　月別表示　-->

    <script>

    edit_date(date){
        var mm = String(date).substr(4,2);
        var dd = String(date).substr(6,2);
        return sprintf("%s/%s", mm, dd);
    }

    edit_money_class(money){
        console.log('money: %O', money);
        if(money <= 0){
            //console.log('m');
            return '';
        }else{
            return 'BalanceData';
        }
    }

    change_page( mode, date, type ){
        console.log(date);
        if(self.debug) console.log('self.change_page mode: %s',mode);
        var base_url = '?m=%s';
        var change_url = sprintf(base_url, mode);
        if(date){
            change_url += '&date=' + date;
        }
        if(self.jyo_cd){
            change_url += '&jyo=' + self.jyo_cd;
        }
        if(type){
            change_url += '&type=' + type;
        }
        route(change_url);
    }

    edit_week(date){
        var week_list = [ "日", "月", "火", "水", "木", "金", "土" ] ;
        var yyyy = String(date).substr(0,4);
        var mm = String(date).substr(4,2);
        var dd = String(date).substr(6,2);
        var date = new Date( yyyy, mm - 1 , dd );
        return sprintf("(%s)", week_list[date.getDay()]);
    }

    number_format(num){
        return num.toString().replace(/(\d+?)(?=(?:\d{3})+$)/g, function(x) {
            return x + ',';
        });
    }

    "use strict";

    var self = this;
    self.args = self.opts;
    self.debug = true;
    self.param = null;
    self.date_list = [];
    self.bet_list = {};
    self.target_date = '';
    self.jyo_cd = null;
    self.is_data = false;
    if (self.debug) console.log('sel.args: %O', self.args);

    self.on('update', function() {
        //	     console.error('self.update()');
    });
    self.on('updated', function() {
        //	     console.error('self.updated()');
    });

    /*
     * 画面初期化(mount)
     */
    self.on('mount', function() {
        if (self.debug)  console.log('mount %s', self.args.tag_name);
        self.args.obs.trigger('tag_mounted', {tag: self.args.tag_name});
    });

    /*
     * 画面表示(parent -> trigger -> render_xxxx)
     */
    self.args.obs.on('render_' + self.args.tag_name, function(p) {
        if (self.debug) console.log('render_%s start p: %O', self.args.tag_name, p);
        self.date_list = [];
        self.bet_list = {};
        self.target_date = '';
        self.jyo_cd = null;
        self.is_data = false;
        var now = new Date()
        self.year = p.date ? p.date.substr(0,4) : now.getFullYear();
        if(p.date && p.date.substr(4,2)){
            self.month = p.date.substr(4,2);
        }else{
            var month = "0" + String(now.getMonth()+1);
            self.month = month.substr(-2);
        }
        self.show_data(p);
    });


    /*
     * データ取得、編集
     */
    self.show_data = async function(p) {
        if (self.debug) console.log('self.show_data');
        if(p['jyo']){
            self.jyo_cd = p['jyo'];
        }
        self.type = '0'; // 0:すべての投票先 1:netkeirin 2:TIPSTAR
        if(p['type'] == '1'){
            self.type = '1';
        }else if(p['type'] == '2'){
            self.type = '2';
        }

        try {
            // netkeirin投票データ取得
            var netkeirinData = self.type != '2' ? await self.get_netkeirin_myshushi_sum_data() : {};
            console.log('netkeirinData: %O', netkeirinData);
            // TIPSTAR連携データ取得
            var myshushiData = self.type != '1' ? await self.get_myshushi_data() : {};
            console.log('myshushiData: %O', myshushiData);

            var myshushi_ary_sum = Object.keys(myshushiData).length > 0 ? myshushiData.ary_sum : {};
            var myshushi_jyo_sum = Object.keys(myshushiData).length > 0 ? myshushiData.jyo_sum : {};

            var netkeirin_data_list = netkeirinData;
            console.log('myshushi_ary_sum: %O', myshushi_ary_sum);
            console.log('netkeirin_data_list: %O', netkeirin_data_list);
            self.total_money = self.merge_shushi_data(myshushi_ary_sum, netkeirin_data_list, 'daily');
            if(Object.keys(self.total_money).length > 0){
                self.is_data = true;
                self.date_list = Object.keys(self.total_money);
                if(p['date']){
                    self.cur_date = p['date'];
                }else{
                    self.cur_date = String(Math.max(...self.date_list));
                }
                if (self.jyo_cd && self.jyo_cd != 1) {
                    var netkeirin_jyo_sum = self.type != '2' ? await self.get_netkeirin_myshushi_data() : {};
                    console.log('netkeirin_jyo_sum: %O', netkeirin_jyo_sum);
                    console.log('myshushi_jyo_sum: %O', myshushi_jyo_sum);
                    self.total_money = self.merge_shushi_data(myshushi_jyo_sum, netkeirin_jyo_sum, self.jyo_cd);
                    console.log('self.total_money: %O', self.total_money);
                    self.total_money = Object.keys(self.total_money)
                        .filter(key => key.includes(self.cur_date.substr(0, 6)) && key.length == 8)
                        .reduce((obj, key) => {
                            obj[key] = self.total_money[key];
                            return obj;
                        }, {});
                }else{
                    console.log('self.total_money: %O', self.total_money);
                    console.log('self.cur_date: %O', self.cur_date);
                    self.total_money = Object.keys(self.total_money)
                        .filter(key => key.includes(self.cur_date.substr(0, 6)))
                        .reduce((obj, key) => {
                            obj[key] = self.total_money[key];
                            return obj;
                        }, {});
                }

            }

            console.log('self.bet_list: %O', self.bet_list);
            console.log('self.date_list: %O', self.date_list);
            console.log('self.target_date: %O', self.target_date);
            self.update();
            self.event_register();
        } catch (error) {
            console.error('Error:', error);
        }

    }

    self.get_myshushi_data = function(){
        return new Promise(function(resolve, reject) {
            var add_param = {
                'compress': self.args.compress,
                'year' : self.year,
                'month' : self.month
            };
            var ndisam = new NDIsam();
            var key = sprintf("%s%s%s_%s", self.args.ls_key_myshushi, self.year, self.month, self.args.sns_user_id);
            var list = ndisam.list(key);
            var date = new Date() ;
            var now = date.getTime() ;
            now = Math.floor( now / 1000 ) ;
            if(list && now <= parseInt(list.shushi.date) + self.args.expire){
                console.log('get storege');
                var z_stream = ZLIB.inflateInit();
                var oj = z_stream.inflate( base64decode(list.shushi.ret) );
                resolve(JSON.parse(oj));
            }else{
                $.ajax({
                    type     : 'GET',
                    url: self.args.api_url,
                    data: add_param,
                    dataType: 'json',
                    timeout: self.args.timeout_sec,
                    success: function( data ){
                        console.log('get http');
                        if(self.args.compress){
                            ndisam.replace(key, 'shushi', data);
                            var z_stream = ZLIB.inflateInit();
                            var oj = z_stream.inflate( base64decode(data.ret) );
                            data.ret = JSON.parse(oj);
                        }
                        resolve(data.ret);
                    },
                    error: function(XMLHttpRequest, textStatus, errorThrown) {
                        console.error('XMLHttpRequest.status: ',XMLHttpRequest.status)
                        console.error('textStatus: ',textStatus);
                        console.error('errorThrown.message: ',errorThrown.message);
                        reject({});
                    }
                });
            }
        });
    }

    self.get_netkeirin_myshushi_sum_data = function(){
        return new Promise(function(resolve, reject) {
            var api_url = sprintf("%s/api/v1/analysis/balances", self.args.betapi_url);
            console.log('betapi_url: %s', api_url);
            var ndisam = new NDIsam();
            var key = sprintf("%s%s_%s_%s", self.args.ls_key_netkeirin, 'analysis', 'balances', self.args.sns_user_id);
            var list = ndisam.list(key);
            console.log('list: %O', list);
            var date = new Date() ;
            var now = date.getTime() ;
            now = Math.floor( now / 1000 ) ;
            if(list && now <= parseInt(list.shushi.date) + self.args.expire){
                console.log('get storege');
                resolve(list.shushi.data);
            }else{
                $.ajax({
                    type     : 'GET',
                    url: api_url,
                    dataType: 'json',
                    timeout: self.args.timeout_sec,
                    crossDomain: true, // 認証のためCookie設定
                    xhrFields: {
                        withCredentials: true // これを追加
                    },
                    success: function( result ){
                        result['date'] = now;
                        ndisam.replace(key, 'shushi', result);
                        resolve(result['data']);
                    },
                    error: function(XMLHttpRequest, textStatus, errorThrown) {
                        if(XMLHttpRequest.status == 404){
                            resolve({});
                        }
                        console.error('XMLHttpRequest.status: ',XMLHttpRequest.status)
                        console.error('textStatus: ',textStatus);
                        console.error('errorThrown.message: ',errorThrown.message);
                        reject({});
                    }
                });
            }
        });
    }

    self.get_netkeirin_myshushi_data = function(){
        var string_date = String(self.cur_date);
        var year = string_date.substr(0,4);
        var month = string_date.substr(4,2);
        return new Promise(function(resolve, reject) {
            var api_url = sprintf("%s/api/v1/analysis/balances/%s/%s/votes", self.args.betapi_url, year, month);
            console.log('betapi_url: %s', api_url);
            var ndisam = new NDIsam();
            var key = sprintf("%s%s%s_%s", self.args.ls_key_netkeirin, year, month, self.args.sns_user_id);
            console.log('key: %s', key);
            var list = ndisam.list(key);
            console.log('list: %O', list);
            var date = new Date() ;
            var now = date.getTime() ;
            now = Math.floor( now / 1000 ) ;
            if(list && now <= parseInt(list.shushi.date) + self.args.expire){
                console.log('get storege');
                resolve(list.shushi.data.jyo_summary);
            }else{
                $.ajax({
                    type     : 'GET',
                    url: api_url,
                    dataType: 'json',
                    timeout: self.args.timeout_sec,
                    crossDomain: true, // 認証のためCookie設定
                    xhrFields: {
                        withCredentials: true // これを追加
                    },
                    success: function( result ){
                        result['date'] = now;
                        ndisam.replace(key, 'shushi', result);
                        resolve(result['data']['jyo_summary']);
                    },
                    error: function(XMLHttpRequest, textStatus, errorThrown) {
                        if(XMLHttpRequest.status == 404){
                            resolve({});
                        }
                        console.error('XMLHttpRequest.status: ',XMLHttpRequest.status)
                        console.error('textStatus: ',textStatus);
                        console.error('errorThrown.message: ',errorThrown.message);
                        reject({});
                    }
                });
            }

        });
    }

    self.merge_shushi_data = function(myshushi_ary_sum, netkeirin_data_list, mode){
        console.log('myshushi_ary_sum: %O', myshushi_ary_sum);
        console.log('netkeirin_data_list: %O', netkeirin_data_list);
        var merge_data = {};
        if(myshushi_ary_sum[mode]){
            for(var date in myshushi_ary_sum[mode]){
                if(!merge_data[date]){
                    merge_data[date] = {};
                }
                merge_data[date] = myshushi_ary_sum[mode][date];
            }
        }
        if(netkeirin_data_list[mode]){
            for(var date in netkeirin_data_list[mode]){
                if(!merge_data[date]){
                    merge_data[date] = {};
                    merge_data[date]['total_bet_money'] = netkeirin_data_list[mode][date]['total_vote_money'];
                    merge_data[date]['total_pay'] = netkeirin_data_list[mode][date]['total_pay'];
                    merge_data[date]['total_diff'] = netkeirin_data_list[mode][date]['total_diff'];
                }else{
                    merge_data[date]['total_bet_money'] += netkeirin_data_list[mode][date]['total_vote_money'];
                    merge_data[date]['total_pay'] += netkeirin_data_list[mode][date]['total_pay'];
                    merge_data[date]['total_diff'] += netkeirin_data_list[mode][date]['total_diff'];
                }
            }
        }
        console.log('merge_data: %O', merge_data);
        return merge_data;
    }

    self.merge_shushi_data = function(myshushi_ary_sum, netkeirin_data_list, mode){
        console.log('myshushi_ary_sum: %O', myshushi_ary_sum);
        console.log('netkeirin_data_list: %O', netkeirin_data_list);
        var merge_data = {};
        if(myshushi_ary_sum[mode]){
            for(var date in myshushi_ary_sum[mode]){
                if(!merge_data[date]){
                    merge_data[date] = {};
                }
                merge_data[date] = myshushi_ary_sum[mode][date];
            }
        }
        if(netkeirin_data_list[mode]){
            for(var date in netkeirin_data_list[mode]){
                if(!merge_data[date]){
                    merge_data[date] = {};
                    merge_data[date]['total_bet_money'] = netkeirin_data_list[mode][date]['total_vote_money'];
                    merge_data[date]['total_pay'] = netkeirin_data_list[mode][date]['total_pay'];
                    merge_data[date]['total_diff'] = netkeirin_data_list[mode][date]['total_diff'];
                }else{
                    merge_data[date]['total_bet_money'] += netkeirin_data_list[mode][date]['total_vote_money'];
                    merge_data[date]['total_pay'] += netkeirin_data_list[mode][date]['total_pay'];
                    merge_data[date]['total_diff'] += netkeirin_data_list[mode][date]['total_diff'];
                }
            }
        }
        console.log('merge_data: %O', merge_data);
        return merge_data;
    }

    self.merge_jyo_sum_data = function(myshushi_jyo_sum, netkeirin_jyo_sum){
        var merge_data = {};
        // 場一覧取得
        var tmp_jyo_list = Object.keys(myshushi_jyo_sum);
        var tmp_jyo_list2 = Object.keys(netkeirin_jyo_sum);
        var jyo_list = tmp_jyo_list.concat(tmp_jyo_list2);
        // 重複削除
        jyo_list = [...new Set(jyo_list)];
        for(var jyo_cd of jyo_list){
            if(myshushi_jyo_sum[jyo_cd]){
                for(var date in myshushi_jyo_sum[jyo_cd]){
                    if(!merge_data[jyo_cd]){
                        merge_data[jyo_cd] = {};
                    }
                    if(!merge_data[jyo_cd][date]){
                        merge_data[jyo_cd][date] = {};
                    }
                    merge_data[jyo_cd][date] = myshushi_jyo_sum[jyo_cd][date];
                }
            }
            if(netkeirin_jyo_sum[jyo_cd]){
                for(var date in netkeirin_jyo_sum[jyo_cd]){
                    if(!merge_data[jyo_cd]){
                        merge_data[jyo_cd] = {};
                    }
                    if(!merge_data[jyo_cd][date]){
                        merge_data[jyo_cd][date] = {};
                        merge_data[jyo_cd][date]['total_bet_money'] = netkeirin_jyo_sum[jyo_cd][date]['total_vote_money'];
                        merge_data[jyo_cd][date]['total_pay'] = netkeirin_jyo_sum[jyo_cd][date]['total_pay'];
                        merge_data[jyo_cd][date]['total_diff'] = netkeirin_jyo_sum[jyo_cd][date]['total_diff'];
                    }else{
                        merge_data[jyo_cd][date]['total_bet_money'] += netkeirin_jyo_sum[jyo_cd][date]['total_vote_money'];
                        merge_data[jyo_cd][date]['total_pay'] += netkeirin_jyo_sum[jyo_cd][date]['total_pay'];
                        merge_data[jyo_cd][date]['total_diff'] += netkeirin_jyo_sum[jyo_cd][date]['total_diff'];
                    }
                }
            }
        }
        return merge_data;
    }

    //制作
    self.event_register = function(){
    }

    </script>

</monthly>
