import { ActivityModelType } from '../../db/Activity';
import { ActivityBase } from './activityField';
import { prop } from '@typegoose/typegoose';
import { getTimeFunM } from '../../pubUtils/timeUtil';
import { UserGachaType } from '../../db/UserGacha';
import { GUIDE_GACHA_STAGE } from '../../consts';
import { RECRUIT } from '../../pubUtils/dicParam';



export class SimpleResult {
    @prop({ required: true })
    planId: number;
    @prop({ required: true })
    hid: number;
    @prop({ required: true })
    isTransfer: boolean;
}

/**
* @description 特殊引导候选列表
* @memberof UserGacha
*/
export class Candidate {
    @prop({ required: true })
    id: number;        // 列表id
    @prop({ required: true })
    isChosen: boolean;        // 是否被选中
    @prop({ required: true })
    pullCnt: number;        // 引导第几次保存的
    @prop({ required: true, type: () => SimpleResult, _id: false })
    list: SimpleResult[];       // 列表

    constructor(id: number, pullCnt: number, result: SimpleResult[]) {
        this.id = id;
        this.isChosen = false;
        this.pullCnt = pullCnt;
        this.list = result;
    }
}

interface GuideGachaDataInDb {
    gachaId: number;     // 抽卡卡池id
    chooseTime: number;  // 开始后几天内可以选卡
}

// 抽卡数据
export class GuideGachaData extends ActivityBase {
    gachaId: number = 0;
    stage: GUIDE_GACHA_STAGE = GUIDE_GACHA_STAGE.PULL;
    chooseTime: number = 0;
    pullCnt: number = 0;
    hasChoosen: boolean = false;
    latest: SimpleResult[] = [];
    candidates: Candidate[] = [];

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

    public initData(data: string) {
        let obj: GuideGachaDataInDb = JSON.parse(data);
        this.gachaId = obj.gachaId;
        this.chooseTime = <number>getTimeFunM(this.beginTime).getAfterDayWithHour(obj.chooseTime);
        this.stage = Date.now() < this.chooseTime? GUIDE_GACHA_STAGE.PULL: GUIDE_GACHA_STAGE.DECIDE;
    }

    public setPlayerData(userGacha: UserGachaType) {
        if(userGacha) {
            this.pullCnt = userGacha.pullCnt;
            this.candidates = userGacha.candidates;
            this.hasChoosen = userGacha.candidates.findIndex(cur => cur.isChosen) != -1;
            this.latest = userGacha.guideResultList;
        }
    }

    public canPull() {
        return this.stage == GUIDE_GACHA_STAGE.PULL && this.pullCnt < RECRUIT.RECRUIT_FIRST_RECRUIT;
    }

    public canDecide() {
        return this.stage == GUIDE_GACHA_STAGE.DECIDE && !this.hasChoosen;
    }

    public chooseCandidate(id: number) {
        let candidate = this.candidates.find(cur => cur.id == id);
        if(!candidate) return false;
        candidate.isChosen = true;
        return candidate;
    }

    public setCandidate(id: number) {
        if(!this.latest || this.latest.length == 0) return false;
        let newObj = new Candidate(id, this.pullCnt, this.latest);
        let index = this.candidates.findIndex(cur => cur.id == id);
        if(index == -1) {
            this.candidates.push(newObj);
        } else {
            this.candidates[index] = newObj;
        }
        return true
    }

    public autoSave() {
        if(this.pullCnt - this.candidates.length + RECRUIT.RECRUIT_FIRST_RECRUIT_SAVE > RECRUIT.RECRUIT_FIRST_RECRUIT) {
            for(let i = 1; i <= RECRUIT.RECRUIT_FIRST_RECRUIT_SAVE; i++) {
                let candidate = this.candidates.find(cur => cur.id == i);
                if(!candidate) {
                    this.candidates.push(new Candidate(i, this.pullCnt, this.latest));
                    return true;
                }
            }
        }
        return false;
    }

    public neverChoose() {
        return this.stage == GUIDE_GACHA_STAGE.DECIDE && this.candidates.length <= 0;
    }
}
