
this.inherits(COMMAND);
this.command = "stats";
this.allow_busy = true;
this.allow_state = true;
this.allow_die = true;
this.allow_faint = true;
this.regex = /^(\w+)(?:\s+([a-z]+))?(?:\s+(\d+))?$/;
const STATS = WORLD.STATS;
this.enter = function (me, par, fam, index) {
  
    if (!par) {
        return;
    }
    if (par === "top") {
        if (index) {

            return render_top_item(me, fam, index);
        }
        return renderTops(me, fam);
    }
    if (par === "weapon") {
        if (index) {

            return render_eq(me,fam,index);
        }
        return renderWeapons(me, fam);
    }
    if (par === "score") {

        if (index)
            return render_score_item(me,fam, index);
        return renderScore(me, fam);
    }


    if (par === "exp") {
        if (index)
            return this.render_item(me,EXP_STATS, fam, index);

        this.renderExp(me, fam);
    }
    if (par === "mp") {
        if (index)
            return this.render_item(me,MP_STATS,fam, index);
        this.renderMP(me, fam);
    }
    if (par === "money") {
        if (index)
            return this.render_item(me, MONEY_STATS, fam, index);
        this.renderMoney(me, fam);
    }
  
}

this.render_item = function (me, cache, fam, index) { 
    if (!fam) fam = "all";
    let stats = cache[fam];
    
    if (!stats|| !stats.result) return me.send('你要看什么？');
    index = parseInt(index) - 1;
    if (!(index >= 0 && index < stats.result.length))
        return  me.send('你要看什么？');
    let item = stats.result[index];
    if (!item) return me.send('没有这个人。');
    let user = WORLD.getUser(item.id);
    if (!user) return me.send(item.name + "现在不在线。");
    if (user.query_desc) {
        me.notify(user.query_desc(me, "look1"));
    }
}
function render_top_item(me, fam, index) { 
    let tops = STATS.TOPS;
    if (fam) tops = STATS['tops_' + fam.toUpperCase()] ?? [];
    let item = tops[index - 1];
    if (!item) return me.send('你要看什么？');
    return me.notify(item.query_desc(item, 'look1'));
}

function render_score_item(me, fam, index) { 
    let tops = STATS.SCORE;
    if (fam) tops = STATS.SC_STATS[fam.toUpperCase()] ?? [];
    let item = tops[index-1];
    if (!item) return me.send('你要看什么？');
    let user = WORLD.getUser(item.id);
    if (!user) return me.send('对方不在线。');
    return me.notify(user.query_desc(me));
}
function renderScore(me, fam) {
    let tops = STATS.SCORE;
    if (fam) tops = STATS.SC_STATS[fam.toUpperCase()] ?? [];

    var str = ['{"type":"dialog","dialog":"stats","scores":['];
    for (var i = 0; i < tops.length; i++) {
        if (i > 19) break;
        var item = tops[i];
        if (i > 0) str.push(",");
        str.push('["');
        str.push(item.name);
        str.push('",');
        str.push(item.score);
        str.push(']');
    }
    str.push('],score:');
    str.push(me.score);
    str.push("}");
    me.send(str.join(""));
}
// this.query_scores = function () { 
//     return SCORE_STATS;
// }
// const SCORE_STATS = {};
// function renderScore(me, fam) { 
//     let stype = fam;
//     if (!stype) stype = "all";
//     let stats = SCORE_STATS[stype];
//     if (!stats) { 
//         stats = new UserStats(
//             (me, item) => {
//                 return me.score < item.value
//             },
//             me => {
//                 return {
//                     id: me.id,
//                     value: me.score,
//                     name: me.color_name
//                 };
//             });
//         stats.type = "score";
//         stats.fam = fam;
//         SCORE_STATS[stype] = stats;
//     }
//     if (stats.isExpire()) {
//         stats.order(',score:'+me.score);
//     }
//     me.send(stats.cache);
// }
function renderTops(me, stype) {
    let tops = STATS.TOPS;
    let famid = null;
    if (stype) { 
        famid = stype.toUpperCase();
        tops = STATS["tops_" + famid];
        if (!tops) return me.send('没有这个榜单。');
    }
    var str = ['{"type":"dialog","dialog":"stats","tops":['];
    
    for (var i = 0; i < tops.length; i++) {
        var item = tops[i];
        if (i > 0) str.push(",");
        str.push('["', item.long_name(),'",',item.score,']');
    }
    if (!stype || famid === me.family.id) {
        str.push('],top:', (me.query_temp(stype ? "top_fam" : "top", 0)));
        str.push(',sc:', me.query_temp(stype ? "top_fam_sc" : "top_sc", 0));
    } else { 
        str.push('],top:0');
        str.push(',sc:0');
    }
 
    str.push(',fam:"', stype,'"');
    str.push("}");
    me.send(str.join(""));
}
function render_eq(me, type,index) { 

    if (!type) type = 'weapon';
    let eqs = STATS.EQ_STATS[EQUIP_TYPE[type.toUpperCase()]] ?? [];
    let wea = eqs[index - 1];
    me.send(wea.desc);
}
function renderWeapons(me,type) {
    var str = ['{"type":"dialog","dialog":"stats","weapons":['];
    if (!type) type = 'weapon';
    
    let eqs = STATS.EQ_STATS[EQUIP_TYPE[type.toUpperCase()]]??[];
    for (var i = 0; i < eqs.length; i++) {
        if (i > 9) break;
        var item = eqs[i];
        if (i > 0) str.push(",");
        str.push('["');
        if (item.name) {
            str.push('<wht>');
            str.push(item.name);
            str.push('的</wht>');
            str.push(item.wname);
        } else { 
            str.push('无');
        }
        str.push('",',item.score,']');
    }
    str.push(']');
    str.push("}");
    me.send(str.join(""));
}





const EXP_STATS = {};

this.renderExp = function (me, fam) {
    let stype = fam;
    if (!stype) stype = "all";
    let stats = EXP_STATS[stype];

    if (!stats) {
        stats = new UserStats(
            (me, item) => { return me.exp < item.value },
            me => {
                return {
                    id: me.id,
                    value: me.exp,
                    name: me.color_name
                };
            });
        stats.type = "exp";
        stats.fam = fam;
        EXP_STATS[stype] = stats;
    }
    if (stats.isExpire()) {
        stats.order();
    }
    me.send(stats.cache);
}
const MONEY_STATS = {};
this.renderMoney = function (me, fam) {
    let stype = fam;
    if (!stype) stype = "all";
    let stats = MONEY_STATS[stype];

    if (!stats) {
        stats = new UserStats(
            (me, item) => { return me.money < item.value },
            me => {
                return {
                    id: me.id,
                    value: me.money,
                    name: me.color_name
                };
            });
        stats.type = "money";
        stats.formatter = value => {
            if (value >= 10000) {
                return '"' + Math.floor(value / 10000) + "两黄金" + '"';
            }
            if (value > 100) {
                return '"' + Math.floor(value / 100) + "两白银" + '"';
            }
            if (value > 0) {
                return '"' + Math.floor(value / 100) + "个铜板" + '"';
            }
            return '""';
        };
        stats.fam = fam;
        MONEY_STATS[stype] = stats;
    }
    if (stats.isExpire()) {
        stats.order();
    }
    me.send(stats.cache);
}

const MP_STATS = {};
this.renderMP = function (me, fam) {
    let stype = fam;
    if (!stype) stype = "all";
    let stats = MP_STATS[stype];

    if (!stats) {
        stats = new UserStats(
            (me, item) => { return me.max_mp < item.value },
            me => {
                return {
                    id: me.id,
                    value: me.max_mp,
                    name: me.color_name
                };
            });
        stats.type = "mp";
        stats.fam = fam;
        MP_STATS[stype] = stats;
    }
    if (stats.isExpire()) {
        stats.order();
    }
    me.send(stats.cache);
}





function UserStats(order,added) {
    this.result = null;
    this.cache = null;
    this.time = 0;
    this.lessThan = order;
    this.addItem = added;
    this.maxCount = 20;
    this.type = null;
}
UserStats.prototype.formatter = function (val) {
    return val;
}
UserStats.prototype.isExpire = function () {
    return Date.now() - this.time > 0;
}
UserStats.prototype.order = function (append) {
    this.result = [];
    this.time = Date.now() + 60000;
    let fam = this.fam;
    if (fam) fam = fam.toUpperCase();
    for (let i = 0; i < WORLD.USERS.length; i++) {
        let user = WORLD.USERS[i];
        if (user.user_level > 4) continue;
        if (fam && user.family.id !== fam)
            continue;
        this.queue(user);
    }
    let str = ['{"type":"dialog","dialog":"stats","items":['];
    for (let i = 0; i < this.result.length; i++) {
        let user = this.result[i];
        if (i > 0) str.push(",");
        str.push('["', user.name, '",', this.formatter(user.value),']');
    }
    str.push(']');
    str.push(',"time":', Date.now(), '');
    str.push(',"st":"', this.type, '"', append ?? "");
    str.push(',"fam":"', this.fam,'"');
    
    str.push("}");
    this.cache= str.join("");
}
UserStats.prototype.queue = function (me) {
    let index = this.result.length - 1;
    if (index < 0) {
        this.result.push(this.addItem(me));
        return;
    }
    let user = this.result[index];
    if (this.result.length >= this.maxCount && this.lessThan(me,user)) {
        return;
    }
    while (index >= 0) {
        user = this.result[index];
        if (this.lessThan(me, user)) {
            this.result.splice(index + 1, 0, this.addItem(me));
            break;
        }
        index--;
    }
    if (index < 0) {
        this.result.splice(0, 0, this.addItem(me));
    }
    if (this.result.length >= this.maxCount) {
        this.result.length = this.maxCount;
    }
} 

//this.expStats = [];
//this.expStatsCache = null;
//this.expStatsTime = 0;

//this.maxCount = 50;
//this.orderExpBy = function (me, user) {
//    return me.exp > user.exp;
//}

//this.addExpItem = function (me) {
//    return {
//        id: me.id,
//        value: me.exp,
//        name: me.color_name
//    };
//}

//this.reStats = function (result,func) {
//    for (let i = 0; i < WORLD.USERS.length; i++) {
//        this.addToExpQueue(WORLD.USERS[i], result, func);
//    }
//    let str = [];
//    for (let i = 0; i < result.length; i++) {
//        let user = result[i];
//        str.push(i + 1, "、\t", user.name, '\t', user.value, '\r\n');
//    }
//    let time = new Date();
//    str.push("最后更新时间", time.getHours() + ":" + time.getMinutes());
//    return str.join("");
//}

//this.addToExpQueue = function (me, result, func) {
    
//    let index = result.length - 1;
//    if (index < 0) {
//        result.push(func(me));
//        return;
//    }
//    let user = result[index];
//    if (result.length >= this.maxCount && user.exp > me.exp) {
//        return;
//    }
//    while (index >= 0) {
//        user = result[index];
//        if (user.exp > me.exp) {
//            result.splice(index + 1, 0, func(me));
//            break;
//        }
//        index--;
//    }
//    if (index < 0) {
//        result.splice(0, 0, func(me));
//    }
//    if (result.length >= this.maxCount) {
//        result.length = this.maxCount;
//    }
//}