package com.letv.core.parser;

import android.text.TextUtils;
import com.letv.core.network.volley.exception.DataIsErrException;
import com.letv.core.network.volley.exception.DataIsNullException;
import com.letv.core.network.volley.exception.DataNoUpdateException;
import com.letv.core.network.volley.exception.JsonCanNotParseException;
import com.letv.core.network.volley.exception.ParseException;
import com.letv.core.network.volley.exception.TokenLoseException;
import com.letv.core.utils.LogInfo;
import org.json.JSONException;
import org.json.JSONObject;

public abstract class LetvBaseParser<T, D> extends CommonParser {
    private static final String CHATROOM_TOKEN_INVALID_CODE = "403";
    private static final String CHATROOM_TOKEN_INVALID_RESULT_CODE = "1001";
    private static final String COMMENT_TOKEN_INVALID_RESULT = "notlogged";
    private static final String CREDIT_TOKEN_INVALID_CODE = "201";
    private static final String ERROR_CODE_1002 = "1002";
    private static final String ERROR_CODE_1014 = "1014";
    private static final String ERROR_CODE_1020 = "1020";
    private static final String HOT_POINT_TOKEN_INVALID_CODE = "403";
    private static final String PLAY_RECORD_TOKEN_INVALID_STATUS = "5";
    protected Class<T> mClz;
    private int mErrCode;
    private int mFrom;
    private String mMessage;
    private boolean mShouldCheckToken = false;

    protected abstract boolean canParse(String str);

    protected abstract D getData(String str) throws Exception;

    protected abstract T parse(D d) throws Exception;

    public LetvBaseParser(int from) {
        this.mFrom = from;
    }

    public boolean hasUpdate() {
        return true;
    }

    public void setShouldCheckToken(boolean shouldCheckToken) {
        this.mShouldCheckToken = shouldCheckToken;
    }

    public T doParse(String data) throws DataIsNullException, DataIsErrException, TokenLoseException, ParseException, JsonCanNotParseException, DataNoUpdateException {
        if (TextUtils.isEmpty(data)) {
            throw new DataIsNullException();
        }
        try {
            JSONObject object = new JSONObject(data);
            if (this.mShouldCheckToken && isTokenInvalid(object)) {
                LogInfo.log("ZSM 需要验证token");
                throw new TokenLoseException();
            } else if (canParse(data)) {
                try {
                    D d = getData(data);
                    if (d == null) {
                        throw new ParseException();
                    }
                    try {
                        return parse(d);
                    } catch (Exception e) {
                        e.printStackTrace();
                        throw new ParseException();
                    }
                } catch (Exception e2) {
                    throw new DataIsErrException();
                }
            } else if (hasUpdate()) {
                throw new JsonCanNotParseException();
            } else {
                throw new DataNoUpdateException();
            }
        } catch (JSONException e3) {
            throw new DataIsErrException();
        } catch (NumberFormatException e4) {
            throw new DataIsErrException();
        }
    }

    public boolean isTokenInvalid(JSONObject object) {
        if (isChatRoomTokenInvalid(object) || isHotPointTokenInvalid(object) || isPlayRecordTokenInvalid(object) || isCommentTokenInvalid(object) || isCreditTokenInvalid(object)) {
            return true;
        }
        String errorCode = object.optString("errorCode");
        if (TextUtils.isEmpty(errorCode)) {
            return false;
        }
        if (TextUtils.equals(errorCode, "1002") && object.has("action") && TextUtils.isEmpty(object.optString("action"))) {
            return true;
        }
        if (TextUtils.equals(errorCode, ERROR_CODE_1014) || TextUtils.equals(errorCode, ERROR_CODE_1020)) {
            return true;
        }
        return false;
    }

    private boolean isCommentTokenInvalid(JSONObject object) {
        boolean isInvalid = false;
        JSONObject body = object.optJSONObject("body");
        if (!isNull(body)) {
            if (TextUtils.equals(COMMENT_TOKEN_INVALID_RESULT, body.optString("result"))) {
                isInvalid = true;
            }
        }
        LogInfo.log("commentTokenInvalid", "isInvalid : " + isInvalid);
        return isInvalid;
    }

    private boolean isPlayRecordTokenInvalid(JSONObject object) {
        boolean isInvalid = false;
        JSONObject header = object.optJSONObject("header");
        if (!isNull(header) && TextUtils.equals(header.optString("status"), "5")) {
            isInvalid = true;
        }
        LogInfo.log("playRecordTokenInvalid", "isInvalid : " + isInvalid);
        return isInvalid;
    }

    private boolean isHotPointTokenInvalid(JSONObject object) {
        boolean isInvalid = false;
        JSONObject body = object.optJSONObject("body");
        if (!isNull(body) && TextUtils.equals(body.optString("code"), "403")) {
            isInvalid = true;
        }
        LogInfo.log("isHotPointTokenInvalid", "isInvalid : " + isInvalid);
        return isInvalid;
    }

    private boolean isCreditTokenInvalid(JSONObject object) {
        JSONObject body = object.optJSONObject("body");
        if (isNull(body) || !TextUtils.equals(body.optString("code"), "201")) {
            return false;
        }
        return true;
    }

    private boolean isChatRoomTokenInvalid(JSONObject object) {
        boolean isInvalid = false;
        JSONObject body = object.optJSONObject("body");
        if (isNull(body)) {
            return false;
        }
        JSONObject result = body.optJSONObject("result");
        if (isNull(result)) {
            return false;
        }
        if (TextUtils.equals(result.optString("code"), "1001")) {
            isInvalid = true;
        }
        if (TextUtils.equals(body.optString("code"), "403")) {
            return true;
        }
        return isInvalid;
    }

    public int getErrCode() {
        return this.mErrCode;
    }

    protected void setErrCode(int errCode) {
        this.mErrCode = errCode;
    }

    protected void setMessage(String message) {
        this.mMessage = message;
    }

    public String getMessage() {
        return this.mMessage;
    }

    public int getFrom() {
        return this.mFrom;
    }

    public void setClz(Class<T> clz) {
        this.mClz = clz;
    }
}