package com.sheep.gamegroup.model.entity;

import android.text.TextUtils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.sheep.gamegroup.model.api.IDownload;
import com.sheep.gamegroup.util.ListUtil;

import java.io.Serializable;
import java.util.List;

import static com.sheep.gamegroup.model.entity.TaskChild.STATUS_CAN_RECEIVE;
import static com.sheep.gamegroup.model.entity.TaskChild.STATUS_FAIL;
import static com.sheep.gamegroup.model.entity.TaskChild.STATUS_RUNNING;

/**
 * 任务
 * Created by ljy on 2018/3/20.
 */

public class TaskEty implements Serializable, IDownload {
    private String boot_address;//private String string",
    private String create_time;// 0,
    private String download_link;//private String string",
    private int id;// 0,
    private int inspect_type = INSPECT_TYPE_PERSION;// 1自动审核　2手动审核 3,应用自动审核
    private String package_names;//private String string",
    private String remarks;//private String string",
    private String task_name;//private String string",
    private String screenshots;//private String string",
    private int task_type = TASK_TYPE_TIME;// 1时间试玩任务 2 信用卡任务 3应用下载 4h5业务 1001畅思 1000连续任务， 1002 1003游戏任务 1002平台游戏，1003 腾讯游戏，1004 小米游戏,1006 小程序(关联字段-qr_code)
    private int open_mode;//连续任务的打开方式 1:打开应用 2:H5内部 3:H5外部
    private String update_time;// 0
    private String icon;
    private String package_size;
    private int release_task_id;
    private String third_task_id;//第三方任务id
    private int acceptedTaskId;//接受任务id
    private String bonus;// 0,
    private String desc;// 任务详情介绍
    private String ext;// 对应的信用卡配置的id
    private List<TaskChild> child;
    private boolean can_download;//是否可以下载
    private int appointment_time;//预约时间
    private String qr_code;//二维码地址
    //用于自定义字段，如自定义手机号
    private String unique_identification;//UniqueIdentification string       `orm:"column(unique_identification);null" description:"唯一标识" json:"unique_identification"`

    public String getQr_code() {
        return qr_code;
    }

    public void setQr_code(String qr_code) {
        this.qr_code = qr_code;
    }

    public int getOpen_mode() {
        return open_mode;
    }

    public void setOpen_mode(int open_mode) {
        this.open_mode = open_mode;
    }

    /**
     * desc 另外的可能情况
     */
    private List<TaskDescEntity> descEntityList;

    private TaskDescEntity descEntity;

    /**
     * 截图地址
     */
    private List<ScreenshotsEntity> screenshotsList;

    /**
     * 能否领取了账号 true能领取了
     */
    private boolean can_receive_account;
    /**
     * 是否预约任务 0不是 1是
     */
    private int is_reservation;

    public boolean isCan_receive_account() {
        return can_receive_account;
    }

    public void setCan_receive_account(boolean can_receive_account) {
        this.can_receive_account = can_receive_account;
    }

    public String getScreenshots() {
        return screenshots;
    }

    public void setScreenshots(String screenshots) {
        regroupScreenshots(screenshots);
        this.screenshots = screenshots;
    }

    public List<ScreenshotsEntity> getScreenshotsList() {
        return screenshotsList;
    }

    public void setScreenshotsList(List<ScreenshotsEntity> screenshotsList) {
        List<ScreenshotsEntity> removeList = ListUtil.emptyList();
        for (ScreenshotsEntity screenshotsEntity : screenshotsList) {
            if(TextUtils.isEmpty(screenshotsEntity.getImg()))
                removeList.add(screenshotsEntity);
        }
        screenshotsList.removeAll(removeList);
        this.screenshotsList = screenshotsList;
    }

    public List<TaskDescEntity> getDescEntityList() {
        return descEntityList;
    }

    public void setDescEntityList(List<TaskDescEntity> descEntityList) {
        this.descEntityList = descEntityList;
    }

    public TaskDescEntity getDescEntity() {
        return descEntity;
    }

    public void setDescEntity(TaskDescEntity descEntity) {
        this.descEntity = descEntity;
    }

    public List<TaskChild> getChild() {
        return child;
    }

    public void setChild(List<TaskChild> child) {
        this.child = child;
    }

    public int getAcceptedTaskId() {
        return acceptedTaskId;
    }

    public void setAcceptedTaskId(int acceptedTaskId) {
        this.acceptedTaskId = acceptedTaskId;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        regroupDesc(desc);
        this.desc = desc+"";
    }

    public String getBonus() {
        return TextUtils.isEmpty(bonus)?"0":bonus;
    }

    public void setBonus(String bonus) {
        this.bonus = bonus;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private String name;

    public int getRelease_task_id() {
        return release_task_id;
    }

    public void setRelease_task_id(int release_task_id) {
        this.release_task_id = release_task_id;
    }

    private int runTask;//0,开始任务 1,开始试玩

    public int getRunTask() {
        return runTask;
    }

    public void setRunTask(int runTask) {
        this.runTask = runTask;
    }

    public String getPackage_size() {
        return package_size;
    }

    public void setPackage_size(String package_size) {
        this.package_size = package_size;
    }

    public String getIcon() {
        return icon;
    }

    public void setIcon(String icon) {
        this.icon = icon;
    }

    public String getBoot_address() {
        return boot_address;
    }

    public void setBoot_address(String boot_address) {
        this.boot_address = boot_address;
    }

    public String getCreate_time() {
        return create_time;
    }

    public void setCreate_time(String create_time) {
        this.create_time = create_time;
    }

    public String getDownload_link() {
        return download_link != null ? download_link.trim() : download_link;
    }

    public void setDownload_link(String download_link) {
        this.download_link = download_link;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getInspect_type() {
        return inspect_type;
    }

    public void setInspect_type(int inspect_type) {
        this.inspect_type = inspect_type;
    }

    public String getPackage_names() {
        return package_names;
    }

    public void setPackage_names(String package_names) {
        this.package_names = package_names;
    }

    public String getRemarks() {
        return remarks;
    }

    public void setRemarks(String remarks) {
        this.remarks = remarks;
    }


    public String getTask_name() {
        return task_name;
    }

    public void setTask_name(String task_name) {
        this.task_name = task_name;
    }

    public int getTask_type() {
        return task_type;
    }

    public void setTask_type(int task_type) {
        this.task_type = task_type;
    }

    public String getUpdate_time() {
        return update_time;
    }

    public void setUpdate_time(String update_time) {
        this.update_time = update_time;
    }

    public String getExt() {
        return ext;
    }

    public void setExt(String ext) {
        this.ext = ext;
    }

    public String getThird_task_id() {
        return third_task_id;
    }

    public void setThird_task_id(String third_task_id) {
        this.third_task_id = third_task_id;
    }

    public int getIs_reservation() {
        return is_reservation;
    }

    public void setIs_reservation(int is_reservation) {
        this.is_reservation = is_reservation;
    }

    public int getAppointment_time() {
        return appointment_time;
    }

    public void setAppointment_time(int appointment_time) {
        this.appointment_time = appointment_time;
    }

    public boolean isCan_download() {
        return can_download;
    }

    public void setCan_download(boolean can_download) {
        this.can_download = can_download;
    }

    public String getUnique_identification() {
        return unique_identification;
    }

    public void setUnique_identification(String unique_identification) {
        this.unique_identification = unique_identification;
    }













    /**
     * 是否是应用自动审核完成的任务
     * @return
     */
    public boolean isAppAutoCommitTask(){
        return inspect_type == INSPECT_TYPE_SHEEP;
    }

    //判断任务是否需要下载app
    public boolean needDownloadApp() {
        if(TextUtils.isEmpty(package_names)){//无包名情况下不能下载
            return false;
        }
        if(TextUtils.isEmpty(download_link)){//无下载连接的任务不能下载
            return false;
        }
        switch (task_type){//1时间试玩任务 2 信用卡任务 3应用下载 4h5业务 1001畅思 1000连续任务， 1002 1003游戏任务 1002平台游戏，1003 腾讯游戏，1004 小米游戏
            case TASK_TYPE_CREDIT_CARD:
            case TASK_TYPE_H5:
            case TASK_TYPE_APPLET:
                return false;
            case TASK_TYPE_SUCCESSION:
                return open_mode == OPEN_MODE_TYPE_APP;// 1:打开应用 2:H5内部 3:H5外部
            case TASK_TYPE_TIME:
            case TASK_TYPE_APP:
            case TASK_TYPE_CHANG_SI:
            case TASK_TYPE_GAME_SHEEP:
            case TASK_TYPE_GAME_TECENT:
            case TASK_TYPE_GAME_XIAO_MI:
            default:
                return true;
        }
//        return task_type != TASK_TYPE_CREDIT_CARD && task_type != TASK_TYPE_H5;//// 1时间试玩任务 2 信用卡任务 3应用下载 4h5业务 1001畅思
    }

    /**
     * 重组desc字段
     * @param desc
     */
    public Object regroupDesc(String desc){
        if(TextUtils.isEmpty(desc)){
            return desc;
        }
        if(desc.startsWith("[")){
            List<TaskDescEntity> taskDescEntityList = JSONArray.parseArray(desc, TaskDescEntity.class);
            setDescEntityList(taskDescEntityList);
            return taskDescEntityList;
        }else if (desc.startsWith("{")){
            TaskDescEntity taskDescEntity = JSONObject.parseObject(desc, TaskDescEntity.class);
            setDescEntity(taskDescEntity);
            return taskDescEntity;
        }else {
            return desc;
        }
    }
    private Object regroupScreenshots(String desc){
        if(TextUtils.isEmpty(desc)){
            return desc;
        }
        if(desc.startsWith("[")){
            List<ScreenshotsEntity> taskDescEntityList = JSONArray.parseArray(desc, ScreenshotsEntity.class);
            setScreenshotsList(taskDescEntityList);
            return taskDescEntityList;
        }else {
            return desc;
        }
    }

    /**
     * 是否是老任务--任务详情中显示不一样
     * @return
     */
    public boolean isOldTask(){
        if(task_type == TASK_TYPE_SUCCESSION){
            if(!ListUtil.isEmpty(child)){
                return child.get(0).isOldTask();
            }
        }
        if(descEntity == null && descEntityList == null){
            return true;
        }
        return false;
    }

    /**
     * 是否是游戏任务
     * @return
     */
    public boolean isGameTask() {
        return task_type == TASK_TYPE_GAME_SHEEP || task_type == TASK_TYPE_GAME_TECENT || task_type == TASK_TYPE_GAME_XIAO_MI;
    }





    /**
     * 是否是游戏任务中的预约任务
     * @return
     */
    public boolean isGameReservation() {
        return is_reservation == 1;//是否预约任务 0不是 1是
    }
    /**
     * 是否游戏任务中的预约任务还不可以下载
     * @return
     */
    public boolean isGameReservationCantDownload() {
        return isGameTask() && isGameReservation() && !can_download;
    }


    /**
     * 游戏详情，title显示
     */
    public String getDetailShow(){
        switch (task_type){
            case TASK_TYPE_GAME_SHEEP:
            default:
                return "平台游戏";
            case TASK_TYPE_GAME_TECENT:
                return "腾讯游戏";
            case TASK_TYPE_GAME_XIAO_MI:
                return "小米游戏";
        }
    }

    /**
     * 获取当前可领取子任务的id
     *
     1、 任务未开启时——即将开启
     2、 任务未领取时——可领取
     3、 任务已领取待完成时——进行中
     4、 任务已提交待审核——待审核
     5、 任务审核通过——已完成
     6、 任务审核失败——审核失败
     7、任务已过期未完成——已过期
     * @return
     */
    public int getCanAcceptedChildId() {
        if(!ListUtil.isEmpty(child)){
            for (TaskChild taskChild : child) {
                switch (taskChild.getStatus()) {
                    case STATUS_CAN_RECEIVE:
                        return taskChild.getId();
                }
            }
        }
        return -1;
    }
    /**
     * 获取正在进行中的子任务的id
     *
     1、 任务未开启时——即将开启
     2、 任务未领取时——可领取
     3、 任务已领取待完成时——进行中
     4、 任务已提交待审核——待审核
     5、 任务审核通过——已完成
     6、 任务审核失败——审核失败
     7、任务已过期未完成——已过期
     * @return
     */
    public int getRunningChildId() {
        if(!ListUtil.isEmpty(child)){
            for (TaskChild taskChild : child) {
                switch (taskChild.getStatus()) {
                    case STATUS_RUNNING:
                        return taskChild.getId();
                }
            }
        }
        return -1;
    }
    /**
     * 获取正在进行中的子任务的id
     *
     1、 任务未开启时——即将开启
     2、 任务未领取时——可领取
     3、 任务已领取待完成时——进行中
     4、 任务已提交待审核——待审核
     5、 任务审核通过——已完成
     6、 任务审核失败——审核失败
     7、任务已过期未完成——已过期
     * @return
     */
    public int getFailChildPosition() {
        if(!ListUtil.isEmpty(child)){
            int i = 0;
            for (TaskChild taskChild : child) {
                switch (taskChild.getStatus()) {
                    case STATUS_FAIL:
                        return i;
                }
                i++;
            }
        }
        return -1;
    }
    /**
     * 根据状态获取当前第一个子任务
     *
     1、 任务未开启时——即将开启
     2、 任务未领取时——可领取
     3、 任务已领取待完成时——进行中
     4、 任务已提交待审核——待审核
     5、 任务审核通过——已完成
     6、 任务审核失败——审核失败
     7、任务已过期未完成——已过期
     * @return
     */
    public TaskChild getCanCommitChild(@TaskChild.STATUS int status) {
        if(!ListUtil.isEmpty(child)){
            for (TaskChild taskChild : child) {
                if(status == taskChild.getStatus()){
                    return taskChild;
                }
            }
        }
        return null;
    }
    /**
     * 获取当前第一个可提交子任务的already_accepted_task_id
     *
     1、 任务未开启时——即将开启
     2、 任务未领取时——可领取
     3、 任务已领取待完成时——进行中
     4、 任务已提交待审核——待审核
     5、 任务审核通过——已完成
     6、 任务审核失败——审核失败
     7、任务已过期未完成——已过期
     * @return
     */
    public int getCanCommitChildRelease_task_id() {
        //先找审核失败的子任务
        TaskChild commitScreenShotTask = getCanCommitChild(STATUS_FAIL);
        if(commitScreenShotTask == null){
            //再找进行中的子任务
            commitScreenShotTask = getCanCommitChild(STATUS_RUNNING);
        }
        return commitScreenShotTask == null ? -1 : commitScreenShotTask.getAlready_accepted_task_id();
    }

    /**
     * 有子任务可以接受
     * @return
     */
    public boolean hasChildCanAccepted() {
        return getCanAcceptedChildId() > 0;
    }
    /**
     * 有子任务正在进行中
     * @return
     */
    public boolean hasChildRunning() {
        return getRunningChildId() > 0;
    }

    /**
     * 传入的上一次提交的id是最后一个子任务的already_accepted_task_id
     * 或者传入的是一个普通任务的id
     * @param lastCommitId
     * @return
     */
    public boolean hasCommitLast(int lastCommitId) {
        TaskChild taskChild = ListUtil.getLast(child);
        return taskChild == null || taskChild.getAlready_accepted_task_id() == lastCommitId;
    }


    /**
     * 不是连续任务返回true
     * 是连续任务时，子任务中第一个处理接受任务状态时返回true
     * @return
     */
    public boolean canCancelTask() {
        switch (task_type){
            case TASK_TYPE_SUCCESSION:
                TaskChild taskChild = ListUtil.getItem(child, 0);
                return taskChild == null || taskChild.getStatus() == STATUS_RUNNING;
            default:
                return true;
        }
    }
    /**
     * 是否连续任务
     * @return
     */
    public boolean isSuccession() {
        return task_type == TASK_TYPE_SUCCESSION;
    }

    /**
     * 小绵羊截屏方案下该任务是否需要小绵羊来截屏
     * @return
     */
    public boolean needShotScreen() {
        if(inspect_type != INSPECT_TYPE_PERSION){//非手动审核任务不需要上传截图
            return false;
        }
        if(TextUtils.isEmpty(package_names)){//无包名情况下也不能截屏
            return false;
        }
        if(TextUtils.isEmpty(download_link)){//无下载连接的任务也无需截屏
            return false;
        }
        switch (task_type){//1时间试玩任务 2 信用卡任务 3应用下载 4h5业务 1001畅思 1000连续任务， 1002 1003游戏任务 1002平台游戏，1003 腾讯游戏，1004 小米游戏
            case TASK_TYPE_CREDIT_CARD:
            case TASK_TYPE_H5:
            case TASK_TYPE_APPLET:
            case TASK_TYPE_CHANG_SI:
            case TASK_TYPE_GAME_SHEEP:
            case TASK_TYPE_GAME_TECENT:
            case TASK_TYPE_GAME_XIAO_MI:
                return false;
            case TASK_TYPE_SUCCESSION:
                return open_mode == OPEN_MODE_TYPE_APP;// 1:打开应用 2:H5内部 3:H5外部
            case TASK_TYPE_TIME:
            case TASK_TYPE_APP:
            default:
                return true;
        }
    }

    /**
     * 是否是小程序 1007
     */
    public boolean isApplet(){
        return task_type == TASK_TYPE_APPLET;
    }
    /**
     * 是否是现金任务 1008
     */
    public boolean isXianJinTask(){
        return task_type == TASK_TYPE_XIAN_JIN;
    }
    //task_type 非连续任务类型 1时间试玩任务 2 信用卡任务 3应用下载 4h5业务 1001畅思 1000连续任务， 1002 1003游戏任务 1002平台游戏，1003 腾讯游戏，1004 小米游戏 1008 现金任务
    public static final int TASK_TYPE_TIME = 1;
    public static final int TASK_TYPE_CREDIT_CARD = 2;
    public static final int TASK_TYPE_APP = 3;
    public static final int TASK_TYPE_H5 = 4;
    public static final int TASK_TYPE_SUCCESSION = 1000;
    public static final int TASK_TYPE_CHANG_SI = 1001;
    public static final int TASK_TYPE_GAME_SHEEP = 1002;
    public static final int TASK_TYPE_GAME_TECENT = 1003;
    public static final int TASK_TYPE_GAME_XIAO_MI = 1004;
    public static final int TASK_TYPE_APPLET = 1007;//小程序任务
    public static final int TASK_TYPE_XIAN_JIN = 1008;//现金任务
    public static final int TASK_TYPE_GAME_OTHER = 1099;
    //open_mode 连续任务类型
    public static final int OPEN_MODE_TYPE_APP = 1;
    public static final int OPEN_MODE_TYPE_H5_IN = 2;
    public static final int OPEN_MODE_TYPE_H5_OUT = 3;

    //inspect_type = 1; 审核类型// 1游戏sdk自动审核　2手动审核 3,小绵羊自动审核
    public static final int INSPECT_TYPE_SDK = 1;
    public static final int INSPECT_TYPE_PERSION = 2;
    public static final int INSPECT_TYPE_SHEEP = 3;

}
