
import List from "./List";
const { ccclass, property } = cc._decorator;

@ccclass
export default class NewClass extends cc.Component {
    @property(cc.Node)
    content: cc.Node = null;
    @property(cc.Prefab)
    itemPrefab: cc.Prefab = null;
    private rankList: any;
    private Player: cc.Node;
    private listData: any;
    private selfData: any;
    private rankNumber: number;
    private rankTotal: number;
    private selfNode: cc.Node;
    score: any;
    allInfoList: any[];
    //content: any;


    onLoad() {
        if (typeof wx === 'undefined') {
            return;
        }

        wx.onMessage(data => {
            console.log('子域接收到消息：', data);
            if (data.message) {
                console.log('成功接入开放域');
                //如果收到的消息是分数
                if (typeof (data.message) == 'number') {
                    //上传分数
                    console.log('收到的分数', data.message);
                    this.score = data.message;
                    this.compareOldNewScore();
                    this.allInfoList = [];
                    this.getPlayerInfo();
                }
                //如果收到的是要清空域的消息
                else if (data.message == 'clear') {
                    //清空排行榜
                    this.content.removeAllChildren();
                } else if (data.message == 'preload') {
                    console.log('子域收到预加载消息');
                    // 预加载排行榜item
                    if (this.itemPrefab) {
                        // 这里可以根据需要进行更复杂的预加载，例如加载图片等
                        console.log('预加载排行榜itemPrefab成功');
                    } else {
                        console.error('itemPrefab 未赋值');
                    }
                }
            }
        });
    }

    // 更新：请读者在主域中比较分数，并调用wx.setUserCloudStorage这个API来更新云托管分数(该API可以在主域中使用)，否则玩家只有在点击了排行榜按钮后才会将分数存入云托管。
    // 逻辑：将每局分数与存储在本地的最高分进行比较，如果超过历史最高分数则同时更新本地和云托管数据。不需要再将分数传到子域。
    compareOldNewScore() {
        // 将传过来的新分数和之前玩的分数进行比较
        wx.getUserCloudStorage({
            keyList: ['score'],
            success: (res) => {
                if (res.KVDataList.length) {
                    let KVData = res.KVDataList[0];
                    let storedScore = Number(KVData['value']);
                    if (this.score > storedScore) {
                        // 如果新分数大于存储分数，则将新分数存入云托管
                        let newKVData = { key: 'score', value: String(this.score) }
                        this.setNewCloudScore(newKVData);
                    }
                }
                else {
                    // 如果第一次玩，那么直接将传过来的分数设置到云托管
                    let newKVData = { key: 'score', value: String(this.score) }
                    this.setNewCloudScore(newKVData);
                }
            },

            fail: (res) => {
                console.log(res);
            }
        });
    }

    setNewCloudScore(newKVData) {
        // 设置新云托管分数(第一次游戏时，也调用该方法设置云托管分数)
        wx.setUserCloudStorage({
            KVDataList: [newKVData],
            success: (res) => {
                console.log('更新玩家分数成功！');
            },
            fail: (res) => {
                console.log(res);
            }
        });
    }

    getPlayerInfo() {
        // 获取当前玩家信息
        // 用于读者Demo测试，实际项目中获取排行榜只需要调用getFriendInfo方法
        wx.getUserInfo({
            openIdList: ['selfOpenId'],
            lang: 'zh_CN',
            success: (res) => {
                let userInfo = res.data[0];

                // 获取玩家微信名和头像url
                let nickName = userInfo.nickName;
                let avatarUrl = userInfo.avatarUrl;

                // 生成多个当前玩家的信息(分数不同)
                for (let i = 0; i < 40; i++) {
                    // 加入到数组中
                    this.allInfoList.push({
                        nickName: nickName,
                        avatarUrl: avatarUrl,
                        score: Math.round(Math.random() * 100)
                    });
                }

                // 开始排名
                this.makeRanks();
            },

            fail: (res) => {
                console.log(res);
            }
        });
    }

    getFriendInfo() {
        // 获取同城好友信息(包括自身)
        wx.getFriendCloudStorage({
            keyList: ['score'],
            success: (res) => {
                for (let i = 0; i < res.data.length; i++) {
                    // 获取玩家微信名，头像url和分数
                    let nickName = res.data[i].nickname;
                    let avatarUrl = res.data[i].avatarUrl;
                    let score = 0;
                    if (res.data[i].KVDataList.length)
                        score = res.data[i].KVDataList[0]['value'];

                    // 加入到数组中
                    this.allInfoList.push({
                        nickName: nickName,
                        avatarUrl: avatarUrl,
                        score: score
                    });
                }

                // 开始排名
                this.makeRanks();
            },

            fail: (res) => {
                console.log(res);
            }
        });
    }
    makeRanks() {
        // 首先将allInfoList内部元素进行排序，根据分数来降序排列
        this.allInfoList.sort((a, b) => {
            return b['score'] - a['score'];
        });

        // 根据各个玩家的分数制作排名
        for (let i = 0; i < this.allInfoList.length; i++) {
            let nickName = this.allInfoList[i]['nickName'];
            let avatarUrl = this.allInfoList[i]['avatarUrl'];
            let score = this.allInfoList[i]['score'];
            this.createItem(i + 1, nickName, avatarUrl, score);
        }
    }

    createItem(rank, nickName, avatarUrl, score) {
        // 生成item
        let item = cc.instantiate(this.itemPrefab);

        // 排名
        item.children[0].getComponent(cc.Label).string = String(rank);
        // 微信名
        item.children[4].getComponent(cc.Label).string = nickName;
        // 分数
        item.children[5].getComponent(cc.Label).string = score;
        // 头像
        cc.loader.load({ url: avatarUrl, type: 'png' }, (err, texture) => {
            if (err) console.error(err);
            item.children[1].getComponent(cc.Sprite).spriteFrame = new cc.SpriteFrame(texture);
        });

        // 添加到content中
        this.content.addChild(item);
    }
    start() {

    }

    // update (dt) {}
}
