import { ActivityModelType } from '../../db/Activity';
import { ActivityBase } from './activityField';
import { TASK_TYPE } from '../../consts';
import { ActivityGrowthModelType } from '../../db/ActivityGrowth';
import { ActivityGrowthPointModelType } from '../../db/ActivityGrowthPoint';
import { parseNumberList, splitString } from '../../pubUtils/util';
import { ActivityDailyGiftsModelType } from '../../db/ActivityDailyGifts';
import { parseResStr } from '../../pubUtils/util';
import { ConsumeResParam } from '../activityField/consumeField';
import { ActivityDailyChallengesModelType } from '../../db/ActivityDailyChallenges';

// 今日挑战的每日配置数据
export class SevenDaysDailyItem {
    dayIndex: number;       // 第几天,从1开始
    cellIndex: number;      // 当天第几行，从1开始
    name: string;           // 任务名称
    taskType: number;       // 任务类型 dic_zyz_taskType.json
    taskParam: string;      //任务数据 dic_zyz_taskType.json
    taskParamArray: number[] = [];
    condition: number;      //任务数据条件 dic_zyz_taskType.jsonT
    reward: string;         // 任务奖励，格式:1&3&1(类型&id&数量) 类型定义:1.英雄，2.物品
    skip: string;           // 跳转

    totalCount: number = 0; //完成任务累计次数
    receiveRewardCount: number = 0;          //领取奖励次数

    constructor(data: any) {
        this.dayIndex = data.dayIndex;
        this.cellIndex = data.cellIndex;
        this.name = data.name;
        this.taskType = data.taskType;
        this.taskParam = data.taskParam;
        this.condition = data.condition;
        this.reward = data.reward;
        this.skip = data.skip;

        this.taskParamArray = parseNumberList(data.taskParam);
        this.totalCount = 0;
        this.receiveRewardCount = 0;
    }

    public canReceive(): boolean {
        return this.receiveRewardCount == 0;
    }

    public isComplete(): boolean {
        let complete = this.totalCount >= this.condition;
        return complete;
    }
}


// 今日挑战活动数据
export class SevenDaysDailyChallengesData {
    list: Array<SevenDaysDailyItem> = [];

    public findDailyChallengesItem(dayIndex: number, cellIndex: number, type: number) {
        let index = this.list.findIndex(obj => { return obj && obj.dayIndex == dayIndex && obj.cellIndex == cellIndex && obj.taskType == type })
        return (index != -1) ? this.list[index] : null;
    }

    public findTaskByType(type: TASK_TYPE) {
        return this.list.filter(obj => {
            return obj && obj.taskType == type;
        })
    }

    //解析玩家领取记录
    public setPlayerRecords(data: ActivityDailyChallengesModelType[]) {
        for (let obj of this.list) {
            let index = data.findIndex(record => { return obj.dayIndex == record.dayIndex && obj.cellIndex == record.cellIndex })
            if (index != -1) {
                obj.totalCount = data[index].totalCount ? data[index].totalCount : 0;
                obj.receiveRewardCount = data[index].receiveRewardCount ? data[index].receiveRewardCount : 0;
            }
        }
    }

    public initData(data: any) {
        for (let obj of data) {
            this.list.push(new SevenDaysDailyItem(obj))
        }
    }

    constructor(activityData: any) {
        this.initData(activityData)
    }
}

/****************************************************************/
// 每日礼包配置数据
export class SevenDaysDailyGiftItem {
    dayIndex: number;       // 第几天,从1开始
    cellIndex: number;      // 当天第几行，从1开始
    name: string;           // 名称
    consume: string;        // 购买的资源数据; 格式:type:id:count, type:ACTIVITY_RESOURCES_TYPE;RMB时id无效
    reward: string;         // 任务奖励，格式:1&3&1(类型&id&数量) 类型定义:1.英雄，2.物品
    maxCount: number = 1;   //最大可购买次数
    discount: number = 0;// 商品显示的折扣

    buyCount: number = 0;   //购买次数

    constructor(data: any) {
        this.dayIndex = data.dayIndex;
        this.cellIndex = data.cellIndex;
        this.name = data.name;
        this.consume = data.consume;
        this.reward = data.reward;
        this.maxCount = data.maxCount;
        this.discount = data.discount;
        this.buyCount = 0;
    }

    //消耗的资源
    public consumeRes(): ConsumeResParam {
        let consumeArray = parseResStr(this.consume);
        return consumeArray[0];
    }

    public canBuy(): boolean {
        return this.buyCount < this.maxCount;
    }

}


// 今日挑战活动数据
export class SevenDaysDailyGiftsData {
    list: Array<SevenDaysDailyGiftItem> = [];

    public findDailyGiftsItem(dayIndex: number, cellIndex: number) {
        let index = this.list.findIndex(obj => { return obj && obj.dayIndex == dayIndex && obj.cellIndex == cellIndex })
        return (index != -1) ? this.list[index] : null;
    }

    //解析玩家购买记录
    public setPlayerRecords(data: ActivityDailyGiftsModelType[]) {
        for (let obj of this.list) {
            let index = data.findIndex(record => { return obj.dayIndex == record.dayIndex && obj.cellIndex == record.cellIndex })
            if (index != -1) {
                obj.buyCount = data[index].buyCount ? data[index].buyCount : 0;
            } else {
                obj.buyCount = 0;
            }
        }
    }

    public initData(dataObj: any) {

        let arr = dataObj;

        for (let obj of arr) {
            this.list.push(new SevenDaysDailyGiftItem(obj))
        }
    }

    constructor(activityData: any) {
        this.initData(activityData)
    }
}

/****************************************************************/

// 积分兑换奖励数据
export class SevenDaysPointRewardItem {
    id: number;       // 第几天,从1开始
    reward: string;         // 任务奖励，格式:1&3&1(类型&id&数量) 类型定义:1.英雄，2.物品
    progress: number;       // 需要的奖章数量
    quality: string;      //
    star: number;      //

    getPointReward: boolean = false;       // 是否兑换领取奖章奖励

    constructor(data: any) {
        this.id = data.id;
        this.reward = data.reward;
        this.progress = data.progress;
        this.quality = data.quality;
        this.star = data.star;
        this.getPointReward = false;
    }
}

// 每日配置数据
export class SevenDaysGrowthItem {
    id: number;
    dayIndex: number;       // 第几天,从1开始
    cellIndex: number;      // 当天第几行，从1开始
    name: string;           // 任务名称
    taskType: number;       // 任务类型 dic_zyz_taskType.json
    taskParam: string;      //任务数据 dic_zyz_taskType.jsonT
    condition: number;      //任务数据条件 dic_zyz_taskType.jsonT
    point: number;          // 任务达成获得的奖章数量，只在当前活动中有用，虚拟
    reward: string;         // 任务奖励，格式:1&3&1(类型&id&数量) 类型定义:1.英雄，2.物品
    taskParamArray: number[];
    skip: string;           // 跳转

    totalCount: number = 0; //完成任务累计次数
    receiveRewardCount: number = 0;          //领取奖励次数

    constructor(data: any) {
        this.dayIndex = data.dayIndex;
        this.cellIndex = data.cellIndex;
        this.name = data.name;
        this.taskType = data.taskType;
        this.taskParam = data.taskParam;
        this.condition = data.condition;
        this.point = data.point;
        this.reward = data.reward;
        this.skip = data.skip;
        this.totalCount = 0;
        this.receiveRewardCount = 0;
        this.taskParamArray = splitString(data.taskParam, '&')

    }

    public canReceive(): boolean {
        return this.receiveRewardCount == 0;
    }

    public isComplete(): boolean {
        let complete = this.totalCount >= this.condition;
        return complete;
    }
}


// 成长活动数据
export class SevenDaysGrowthData {
    list: Array<SevenDaysGrowthItem> = [];
    pointRewardList: Array<SevenDaysPointRewardItem> = [];

    public getTotalPoint() {
        let total = 0;
        for (let obj of this.list) {
            if (obj.receiveRewardCount) {
                total += obj.point;
            }
        }
        return total;
    }

    //第几天的奖章兑换
    public findPointItem(id: number) {
        let index = this.pointRewardList.findIndex(obj => { return obj && obj.id === id })
        return (index != -1) ? this.pointRewardList[index] : null;
    }

    public findGrowthItem(dayIndex: number, cellIndex: number, type: number) {
        let index = this.list.findIndex(obj => { return obj && obj.dayIndex == dayIndex && obj.cellIndex == cellIndex && obj.taskType == type })
        return (index != -1) ? this.list[index] : null;
    }

    public findTaskByType(type: TASK_TYPE) {
        return this.list.filter(obj => {
            return obj && obj.taskType == type;
        })
    }

    //解析玩家积分兑换记录
    public setPlayerPointRecord(data: ActivityGrowthPointModelType) {
        if (!data) {
            return;
        }
        for (let obj of this.pointRewardList) {
            let index = data.ids.findIndex(id => { return id === obj.id })
            if (index != -1) {
                obj.getPointReward = true;
            }
        }
    }

    //解析玩家领取记录
    public setPlayerRecords(data: ActivityGrowthModelType[]) {
        for (let obj of this.list) {
            let index = data.findIndex(record => { return obj.dayIndex == record.dayIndex && obj.cellIndex == record.cellIndex })
            if (index != -1) {
                obj.totalCount = data[index].totalCount ? data[index].totalCount : 0;
                obj.receiveRewardCount = data[index].receiveRewardCount ? data[index].receiveRewardCount : 0;
            }
        }
    }

    public initData(objData: any) {
        // let objData = JSON.parse(data);

        let arr = objData.data;
        for (let obj of arr) {
            this.list.push(new SevenDaysGrowthItem(obj))
        }
        let pointRewardArray = objData.pointReward;
        for (let obj of pointRewardArray) {
            this.pointRewardList.push(new SevenDaysPointRewardItem(obj))
        }
    }

    constructor(activityData: any) {
        this.initData(activityData)
    }
}

/****************************************************************/
// 七天乐活动数据
export class SevenDaysData extends ActivityBase {
    hid: number;
    growth: SevenDaysGrowthData = null;
    dailyGift: SevenDaysDailyGiftsData = null;
    dailyChallenge: SevenDaysDailyChallengesData = null;

    public initData(data: string) {
        let objData = JSON.parse(data);
        this.hid = objData.hid;
        this.growth = new SevenDaysGrowthData(objData.growth)
        this.dailyGift = new SevenDaysDailyGiftsData(objData.dailyGift)
        this.dailyChallenge = new SevenDaysDailyChallengesData(objData.dailyChallenge)
    }

    constructor(activityData: ActivityModelType, createTime: number, serverCreateTime: number) {
        super(activityData, createTime, serverCreateTime)
        this.initData(activityData.data)
    }
}