package org.wordpress.android.models;

import android.text.TextUtils;

import org.json.JSONObject;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.DateTimeUtils;
import org.wordpress.android.util.StringUtils;

import java.util.Date;

public class AccountModel {
    // WordPress.com only - data fetched from the REST API endpoint
    private String mUserName;
    private long mUserId;
    private String mDisplayName;
    private String mProfileUrl;
    private String mAvatarUrl;
    private long mPrimaryBlogId;
    private int mSiteCount;
    private int mVisibleSiteCount;
    private String mAccessToken;
    private String mEmail;
    private String mFirstName;
    private String mLastName;
    private String mAboutMe;
    private Date mDateCreated;
    private String mNewEmail;
    private boolean mPendingEmailChange;
    private String mWebAddress;

    public AccountModel() {
        init();
    }

    public void init() {
        mUserName = "";
        mUserId = 0;
        mDisplayName = "";
        mProfileUrl = "";
        mAvatarUrl = "";
        mPrimaryBlogId = 0;
        mSiteCount = 0;
        mVisibleSiteCount = 0;
        mAccessToken = "";
        mEmail = "";
        mFirstName = "";
        mLastName = "";
        mAboutMe = "";
        mDateCreated = new Date();
        mNewEmail = "";
        mPendingEmailChange = false;
        mWebAddress = "";
    }

    public void updateFromRestResponse(JSONObject json) {
        mUserId = json.optLong("ID");
        mUserName = json.optString("username");
        mDisplayName = json.optString("display_name");
        mProfileUrl = json.optString("profile_URL");
        mAvatarUrl = json.optString("avatar_URL");
        mPrimaryBlogId = json.optLong("primary_blog");
        mSiteCount = json.optInt("site_count");
        mVisibleSiteCount = json.optInt("visible_site_count");
        mEmail = json.optString("email");

        Date date = DateTimeUtils.dateFromIso8601(json.optString("date"));
        if (date != null) {
            mDateCreated = date;
        } else {
            AppLog.e(AppLog.T.API, "Date could not be found from Account JSON response");
        }
    }

    public void updateAccountSettingsFromRestResponse(JSONObject json) {
        if (json.has(RestParam.FIRST_NAME.getDescription())) mFirstName = json.optString(RestParam.FIRST_NAME.getDescription());
        if (json.has(RestParam.LAST_NAME.getDescription())) mLastName = json.optString(RestParam.LAST_NAME.getDescription());
        if (json.has(RestParam.DISPLAY_NAME.getDescription())) mDisplayName = json.optString(RestParam.DISPLAY_NAME.getDescription());
        if (json.has(RestParam.ABOUT_ME.getDescription())) mAboutMe = json.optString(RestParam.ABOUT_ME.getDescription());
        if (json.has(RestParam.EMAIL.getDescription())) mEmail = json.optString(RestParam.EMAIL.getDescription());
        if (json.has(RestParam.NEW_EMAIL.getDescription())) mNewEmail = json.optString(RestParam.NEW_EMAIL.getDescription());
        if (json.has(RestParam.EMAIL_CHANGE_PENDING.getDescription())) mPendingEmailChange = json.optBoolean(RestParam.EMAIL_CHANGE_PENDING.getDescription());
        if (json.has(RestParam.PRIMARY_BLOG.getDescription())) mPrimaryBlogId = json.optLong(RestParam.PRIMARY_BLOG.getDescription());
        if (json.has(RestParam.WEB_ADDRESS.getDescription())) mWebAddress = json.optString(RestParam.WEB_ADDRESS.getDescription());
    }

    public long getUserId() {
        return mUserId;
    }

    public void setUserId(long userId) {
        mUserId = userId;
    }

    public void setPrimaryBlogId(long primaryBlogId) {
        mPrimaryBlogId = primaryBlogId;
    }

    public long getPrimaryBlogId() {
        return mPrimaryBlogId;
    }

    public String getUserName() {
        return StringUtils.notNullStr(mUserName);
    }

    public void setUserName(String userName) {
        mUserName = userName;
    }

    public String getAccessToken() {
        return mAccessToken;
    }

    public void setAccessToken(String accessToken) {
        mAccessToken = accessToken;
    }

    boolean hasAccessToken() {
        return !TextUtils.isEmpty(getAccessToken());
    }

    public String getDisplayName() {
        return StringUtils.notNullStr(mDisplayName);
    }

    public void setDisplayName(String displayName) {
        mDisplayName = displayName;
    }

    public String getProfileUrl() {
        return StringUtils.notNullStr(mProfileUrl);
    }

    public void setProfileUrl(String profileUrl) {
        mProfileUrl = profileUrl;
    }

    public String getAvatarUrl() {
        return StringUtils.notNullStr(mAvatarUrl);
    }

    public void setAvatarUrl(String avatarUrl) {
        mAvatarUrl = avatarUrl;
    }

    public int getSiteCount() {
        return mSiteCount;
    }

    public void setSiteCount(int siteCount) {
        mSiteCount = siteCount;
    }

    public int getVisibleSiteCount() {
        return mVisibleSiteCount;
    }

    public void setVisibleSiteCount(int visibleSiteCount) {
        mVisibleSiteCount = visibleSiteCount;
    }

    public void setEmail(String email) {
        mEmail = email;
    }

    public String getEmail() {
        return StringUtils.notNullStr(mEmail);
    }

    public String getFirstName() {
        return StringUtils.notNullStr(mFirstName);
    }

    public void setFirstName(String firstName) {
        mFirstName = firstName;
    }

    public String getLastName() {
        return StringUtils.notNullStr(mLastName);
    }

    public void setLastName(String lastName) {
        mLastName = lastName;
    }

    public String getAboutMe() {
        return StringUtils.notNullStr(mAboutMe);
    }

    public void setAboutMe(String aboutMe) {
        mAboutMe = aboutMe;
    }

    public Date getDateCreated() {
        return mDateCreated;
    }

    public void setDateCreated(Date date) {
        mDateCreated = date;
    }

    public String getNewEmail() {
        return StringUtils.notNullStr(mNewEmail);
    }

    public void setNewEmail(String newEmail) {
        mNewEmail = newEmail;
    }

    public boolean getPendingEmailChange() {
        return mPendingEmailChange;
    }

    public void setPendingEmailChange(boolean pendingEmailChange) {
        mPendingEmailChange = pendingEmailChange;
    }

    public String getWebAddress() {
        return mWebAddress;
    }

    public void setWebAddress(String webAddress) {
        mWebAddress = webAddress;
    }

    public enum RestParam {
        FIRST_NAME("first_name"),
        LAST_NAME("last_name"),
        DISPLAY_NAME("display_name"),
        ABOUT_ME("description"),
        EMAIL("user_email"),
        NEW_EMAIL("new_user_email"),
        EMAIL_CHANGE_PENDING("user_email_change_pending"),
        PRIMARY_BLOG("primary_site_ID"),
        WEB_ADDRESS("user_URL");

        private String description;

        RestParam(String description) {
            this.description = description;
        }

        public String getDescription() {
            return description;
        }
    }
}
