(function (window, $, undefined) {
    let module = {}, diff = 0, d = '', baseTime, config = {
        powerball: {diffSec: 0, returnMinute: 5, countDownDiff: (1000 * 60 * 0) + (1000 * 0)},
        metanine: {diffSec: 0, returnMinute: 3, countDownDiff: (1000 * 60 * 0) + (1000 * 0)},
        nine: {diffSec: 0, returnMinute: 3, countDownDiff: (1000 * 60 * 0) + (1000 * 0)},
        rdombox_powerball: {diffSec: 0, returnMinute: 5, countDownDiff: (1000 * 60 * 0) + (1000 * 5)},
        rdombox_powerball_1: {diffSec: 0, returnMinute: 1, countDownDiff: 1000 * 5},
        rdombox_powerball_2: {diffSec: 0, returnMinute: 2, countDownDiff: 1000 * 5},
        rdombox_powerball_3: {diffSec: 0, returnMinute: 3, countDownDiff: 1000 * 5},
        rdombox_powerball_4: {diffSec: 0, returnMinute: 4, countDownDiff: 1000 * 5},
        rdombox_powerball_5: {diffSec: 0, returnMinute: 5, countDownDiff: 1000 * 5},
        rdomboxladder_3: {diffSec: 0, returnMinute: 3, countDownDiff: 1000 * 5},
        rdomboxladder_5: {diffSec: 0, returnMinute: 5, countDownDiff: 1000 * 5},
        power_ladder: {diffSec: 0, returnMinute: 5, countDownDiff: (1000 * 60 * 3) - (10 * 1000)},
        pbaccarat: {diffSec: 0, returnMinute: 5, countDownDiff: (1000 * 60 * 3) - (10 * 1000)},
        bogle_powerball: {diffSec: 0, returnMinute: 2, countDownDiff: (1000 * -5)},
        bogle_ladder: {diffSec: 0, returnMinute: 3, countDownDiff: (1000 * 60 * 0) + (1000 * 0)},
        powerkeno_ladder: {diffSec: 0, returnMinute: 3, countDownDiff: (1000 * -5)},
        speedkeno: {diffSec: 0, returnMinute: 5, countDownDiff: (1000 * 60 * 3) - (5 * 1000)},
        keno_ladder: {diffSec: 0, returnMinute: 5, countDownDiff: (1000 * 60 * 3) - (1000 * 2)},
        pkeno_ladder: {diffSec: 0, returnMinute: 5, countDownDiff: 1000 * 25},
        fx_game_1: {diffSec: 0, returnMinute: 1, countDownDiff: 0},
        fx_game_2: {diffSec: 0, returnMinute: 2, countDownDiff: 0},
        fx_game_3: {diffSec: 0, returnMinute: 3, countDownDiff: 0},
        fx_game_4: {diffSec: 0, returnMinute: 4, countDownDiff: 0},
        fx_game_5: {diffSec: 0, returnMinute: 5, countDownDiff: 0},
        fx_ladder_1: {diffSec: 0, returnMinute: 1, countDownDiff: -1000 * 5},
        fx_ladder_2: {diffSec: 0, returnMinute: 2, countDownDiff: -1000 * 5},
        fx_ladder_3: {diffSec: 0, returnMinute: 3, countDownDiff: -1000 * 5},
        fx_ladder_4: {diffSec: 0, returnMinute: 4, countDownDiff: -1000 * 5},
        fx_ladder_5: {diffSec: 0, returnMinute: 5, countDownDiff: -1000 * 5},
        eos_powerball: {diffSec: 0, returnMinute: 1, countDownDiff: 1000 * 0},
        eos_powerball_1: {diffSec: 0, returnMinute: 1, countDownDiff: 1000 * 0},
        eos_powerball_2: {diffSec: 0, returnMinute: 2, countDownDiff: 1000 * 0},
        eos_powerball_3: {diffSec: 0, returnMinute: 3, countDownDiff: 1000 * 0},
        eos_powerball_4: {diffSec: 0, returnMinute: 4, countDownDiff: 1000 * 0},
        eos_powerball_5: {diffSec: 0, returnMinute: 5, countDownDiff: 1000 * 0},
        eos_speedkeno: {diffSec: 0, returnMinute: 5, countDownDiff: 1000 * 5},
        eos_speedkeno_1: {diffSec: 0, returnMinute: 1, countDownDiff: 1000 * 5},
        eos_speedkeno_2: {diffSec: 0, returnMinute: 2, countDownDiff: 1000 * 5},
        eos_speedkeno_3: {diffSec: 0, returnMinute: 3, countDownDiff: 1000 * 5},
        eos_speedkeno_4: {diffSec: 0, returnMinute: 4, countDownDiff: 1000 * 5},
        eos_speedkeno_5: {diffSec: 0, returnMinute: 5, countDownDiff: 1000 * 5},
        ntry_powerball: {diffSec: 0, returnMinute: 5, countDownDiff: 1000 * 25},
        dh_powerball: {diffSec: 0, returnMinute: 5, countDownDiff: 1000 * 25},
        dh_rdm_powerball: {diffSec: 0, returnMinute: 5, countDownDiff: 1000 * 25},
        dh_powerball_ladder: {diffSec: 0, returnMinute: 5, countDownDiff: 1000 * 25},
        livescore_powerball: {diffSec: 0, returnMinute: 5, countDownDiff: -1000 * 62},
        evo_powerball: {diffSec: 0, returnMinute: 1, countDownDiff: 1000 * 0},
    }, breakTimes = {
        // speedkeno: ['00:00:00', '05:59:59'],
    };
    let get_powerkeno_round_type = function () {
        let round_type, ii = d.getMinutes(), ss = d.getSeconds(), curr_seconds = ((ii * 60) + ss + 5) % 300;
        // if (curr_seconds <= 180 && curr_seconds !== 0) {
        //     round_type = 'power_ladder';
        // } else {
        //     round_type = 'keno_ladder';
        // }
        return round_type;
    };
    let countdown = {
        seconds: function (game) {
            if (game.indexOf("fx_") === -1) game = game.replace("_game", "");
            let returnMinute = config[game].returnMinute, countDownDiff = config[game].countDownDiff,
                pass_seconds = (baseTime + (config[game].diffSec * 1000) + countDownDiff) % (60 * returnMinute * 1000),
                countdown_seconds = Math.ceil(((60 * returnMinute * 1000) - pass_seconds) / 1000);
            countdown_seconds = (countdown_seconds >= (60 * returnMinute)) ? 0 : countdown_seconds;
            return countdown_seconds;
        }, basic: function (game) {
            return countdown.seconds(game);
        // }, speedkeno_game: function (game) {
        //     let curTimer= module.get_timer(game);
        //     let curDate = curTimer.yyyy + '-' + curTimer.mm + '-' + curTimer.dd; 
        //     let curTime = curTimer.hh + '-' + curTimer.ii + '-' + curTimer.ss;
        //     const todayBreakTimeStart = new Date(curDate + ' ' + breakTimes[game][0]);
        //     const todayBreakTimeEnd = new Date(curDate + ' ' + breakTimes[game][1]);

        //     let returnMinute = config[game].returnMinute, countDownDiff = config[game].countDownDiff,
        //         round = Number(((d.getHours() * 3600) + (d.getMinutes() * 60) + d.getSeconds() + (countDownDiff / 1000)) / (60 * returnMinute));
        //     round = Math.floor(round) + 1;

        //     if (d.getTime() >= todayBreakTimeStart.getTime()  && d.getTime() <= todayBreakTimeEnd.getTime())    {
        //         countdown_seconds =  Math.floor((todayBreakTimeEnd.getTime() - d.getTime()) / 1000) + (returnMinute * 60);

        //         return countdown_seconds;
        //     }
        //     else if (round === 289)    {
        //             let todayBreakTimeEnd = new Date(curDate + ' ' + breakTimes[game][1]);
        //         // 86400000 : 24 * 60 * 60 * 1000  (1일)
        //         countdown_seconds =  Math.floor(((todayBreakTimeEnd.getTime() + 86400000) - d.getTime()) / 1000) + (returnMinute * 60);
        //         return countdown_seconds;
        //     }
        //     else{
        //         return countdown.seconds(game);
        //     }
        }
    };
    let gauge = {
        basic: function (game, seconds) {
            let returnMinute = config[game].returnMinute;
            return seconds / (returnMinute * 60) * 100;
        // }, powerkeno: function (game, seconds) {
        //     let returnMinute = 0, round_type = get_powerkeno_round_type();
        //     switch (round_type) {
        //         case 'power_ladder':
        //             returnMinute = 3;
        //             break;
        //         case 'keno_ladder':
        //             returnMinute = 2;
        //             break;
        //     }
        //     return seconds / (returnMinute * 60) * 100;
        }
    };
    let date_round = {
        basic: function (game) {
            let returnMinute = config[game].returnMinute, countDownDiff = config[game].countDownDiff,
                round = Number(((d.getHours() * 3600) + (d.getMinutes() * 60) + d.getSeconds() + (countDownDiff / 1000)) / (60 * returnMinute));
            round = Math.floor(round) + 1;
            // if ((game === 'speedkeno' ) && round > 288)    round = 73;
            return round;
        // }, powerkeno: function () {
        //     let curr_seconds = Number((d.getHours() * 3600) + (d.getMinutes() * 60) + d.getSeconds() + 5),
        //         round = Math.floor(curr_seconds / 300) * 2, remain_seconds = curr_seconds % 300;
        //     if (remain_seconds <= 180 && remain_seconds !== 0) {
        //         round = round + 1;
        //     } else {
        //         round = round + 2;
        //     }
        //     return round;
        }, fx_game: function (min) {
            const number_of_day = d.getDay();
            if (number_of_day === 0) {
                return false;
            }
            const start_5 = (3600 * 5);
            const start_6_20 = (3600 * 6) + 20;
            const end_7_20 = (3600 * 7) + 20;
            let hh = parseInt(d.getHours());
            const ii = parseInt(d.getMinutes());
            const remain = parseInt(min) - Math.round(ii % parseInt(min));
            let minute = ii + remain + min;
            if (minute > 59) {
                minute = minute % 60;
                hh++;
                if (hh > 23) {
                    hh = 0;
                }
            }
            const compare_minute = hh * 3600 + minute;
            if (start_6_20 < compare_minute && end_7_20 > compare_minute) {
                return false;
            } else if (number_of_day === 6 && start_5 < compare_minute) {
                return false;
            } else if (number_of_day === 1 && end_7_20 > compare_minute) {
                return false;
            }
            hh = hh.toString().length >= 2 ? hh : '0' + hh;
            minute = minute.toString().length >= 2 ? minute : '0' + minute;
            return hh + ':' + minute;
        }, eos_game: function (min) {
            const min_sec = min * 60;
            let curr_seconds = Number((d.getHours() * 3600) + (d.getMinutes() * 60) + d.getSeconds() + 5),
                round = Math.floor(curr_seconds / min_sec), remain_seconds = curr_seconds % min_sec;
            if (remain_seconds <= 60*min && remain_seconds !== 0) {
                round = round + 1;
            } else {
                round = round + 2;
            }
            return round;
        }, rdombox_game: function (min) {
            const min_sec = min * 60;
            let curr_seconds = Number((d.getHours() * 3600) + (d.getMinutes() * 60) + d.getSeconds() + 5),
                round = Math.floor(curr_seconds / min_sec), remain_seconds = curr_seconds % min_sec;
            if (remain_seconds <= 300 && remain_seconds !== 0) {
                round = round + 1;
            } else {
                round = round + 2;
            }
            return round;
        // }, speedkeno_game: function (game) {
        //     let curTimer= module.get_timer(game);
        //     let curDate = curTimer.yyyy + '-' + curTimer.mm + '-' + curTimer.dd; 
        //     let curTime = curTimer.hh + '-' + curTimer.ii + '-' + curTimer.ss;
        //     const todayBreakTimeStart = new Date(curDate + ' ' + breakTimes[game][0]);
        //     const todayBreakTimeEnd = new Date(curDate + ' ' + breakTimes[game][1]);

        //     if (d.getTime() >= todayBreakTimeStart.getTime()  && d.getTime() <= todayBreakTimeEnd.getTime())    {
        //         let returnMinute = config[game].returnMinute, countDownDiff = config[game].countDownDiff;
        //         let round = Number(((todayBreakTimeEnd.getHours() * 3600) + (todayBreakTimeEnd.getMinutes() * 60) + todayBreakTimeEnd.getSeconds() + (countDownDiff / 1000)) / (60 * returnMinute));
        //         round = Math.floor(round) + 1;
        //         return round;
        //     }
        //     else{
        //         return date_round.basic(game);
        //     }
        }
    };
    module.update = function () {
        d = new Date();
        //  baseTime = d.getTime() + diff;

        // 어느 국가에서든 한국 시간으로 
        // 2. UTC 시간 계산
        const utc = d.getTime() + (d.getTimezoneOffset() * 60 * 1000);
        // 3. UTC to KST (UTC + 9시간)
        const KR_TIME_DIFF = 9 * 60 * 60 * 1000;
        // baseTime = new Date(utc + (KR_TIME_DIFF) + diff);
        baseTime = utc + (KR_TIME_DIFF) + diff;

        d.setTime(baseTime);

        return diff;
    };
    module.get_timer = function (game) {
        let d2 = d;
        if (typeof game !== "undefined") {
            // if (game === "powerkeno_ladder") {
            //     game = get_powerkeno_round_type();
            // }
            let time = d.getTime() + (config[game].diffSec * 1000);
            d2.setTime(time);
        }
        let yyyy = d2.getFullYear();
        let mm = d2.getMonth() + 1;
        let dd = d2.getDate();
        let hh = d2.getHours();
        let ii = d2.getMinutes();
        let ss = d2.getSeconds();
        mm = (mm < 10) ? "0" + mm : mm;
        dd = (dd < 10) ? "0" + dd : dd;
        hh = (hh < 10) ? "0" + hh : hh;
        ii = (ii < 10) ? "0" + ii : ii;
        ss = (ss < 10) ? "0" + ss : ss;
        return {date: d2, yyyy: yyyy, mm: mm, dd: dd, hh: hh, ii: ii, ss: ss};
    };
    module.get_countdown_seconds = function (game) {
        switch (game) {
            // case 'speedkeno':
            //     return countdown.speedkeno_game(game);
            //     break;
            default:
                return countdown.basic(game);
                break;
        }
    };
    module.get_gauge = function (game, seconds) {
        switch (game) {
            // case 'powerkeno_ladder':
            //     return gauge.powerkeno(game, seconds);
            //     break;
            default:
                return gauge.basic(game, seconds);
                break;
        }
    };
    module.get_round = function (game) {
        var ga = game.substr(0,5);
        if (game.substr(0, 2) === 'fx') {
            return date_round.fx_game(parseInt(game.substr(game.length - 1)));
        } else if (game.substr(0, 13) === 'eos_speedkeno') {
            return date_round.basic(game);
        } else if (game.substr(0, 3) === 'eos') {
            const min = game.substr(-1);
            return date_round.eos_game(parseInt(min));
        // } else if (game.substr(0, 5) === 'alpha') { // rdombox
        } else if (game.substr(0, 7) === 'rdombox') { // rdombox
            const min = game.substr(-1);
            return date_round.rdombox_game(parseInt(min));
        // } else if (game === 'speedkeno') {
        //     return date_round.speedkeno_game(game);
        } else {
            return date_round.basic(game);
        }
    };
    module.now_clock = function (t) {
        return t.yyyy + "." + t.mm + "." + t.dd + " " + t.hh + ":" + t.ii + ":" + t.ss;
    };
    module.convert_countdown_clock = function (seconds) {
        let ii = Math.floor(seconds / 60), ss = Math.floor(seconds % 60);
        return ii + "분 " + ss + "초";
    };
    module.convert_countdown_time = function (seconds) {
        let ii = Math.floor(seconds / 60), ss = Math.floor(seconds % 60);
        ss = ss <= 9 ? '0' + ss : ss;
        return ii + ":" + ss;
    };
    module.set_diff = function (str) {
        diff = new Date(str).getTime() - new Date().getTime();
        // console.log(diff)

    };
    module.sync_clock = function () {
        $.ajax({
            type: "get",
            url: "/games/get_time",
            dataType: "json",
            cache: false,
            success: function (res, textStatus, request) {
                let response_time = new Date(request.getResponseHeader("Date")).getTime();
                module.set_diff(response_time);
            },
            complete: function () {
                setTimeout(function () {
                    module.sync_clock();
                }, 10000);
            }
        });
    };
    module.isRunningTime = function (game) {
        return true;
    }
    window.game_clock = module;
}(window, jQuery));