package org.wordpress.android.models;

import android.support.annotation.Nullable;

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

public class Person {
    public enum PersonType { USER, FOLLOWER, EMAIL_FOLLOWER, VIEWER }

    private long personID;
    private int localTableBlogId;
    private String displayName;
    private String avatarUrl;
    private PersonType personType;

    // Only users have a role
    private Role role;

    // Users, followers & viewers has a username, email followers don't
    private String username;

    // Only followers & email followers have a subscribed date
    private String subscribed;

    public Person(long personID, int localTableBlogId) {
        this.personID = personID;
        this.localTableBlogId = localTableBlogId;
    }

    @Nullable
    public static Person userFromJSON(JSONObject json, int localTableBlogId) throws JSONException {
        if (json == null) {
            return null;
        }

        // Response parameters are in: https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/users/%24user_id/
        try {
            long personID = Long.parseLong(json.getString("ID"));
            Person person = new Person(personID, localTableBlogId);
            person.setUsername(json.optString("login"));
            person.setDisplayName(json.optString("name"));
            person.setAvatarUrl(json.optString("avatar_URL"));
            person.personType = PersonType.USER;
            // We don't support multiple roles, so the first role is picked just as it's in Calypso
            String role = json.getJSONArray("roles").optString(0);
            person.setRole(Role.fromString(role));

            return person;
        } catch (NumberFormatException e) {
            AppLog.e(AppLog.T.PEOPLE, "The ID parsed from the JSON couldn't be converted to long: " + e);
        }

        return null;
    }

    @Nullable
    public static Person followerFromJSON(JSONObject json, int localTableBlogId, boolean isEmailFollower)
            throws JSONException {
        if (json == null) {
            return null;
        }

        // Response parameters are in: https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/followers/
        try {
            long personID = Long.parseLong(json.getString("ID"));
            Person person = new Person(personID, localTableBlogId);
            person.setDisplayName(json.optString("label"));
            person.setUsername(json.optString("login"));
            person.setAvatarUrl(json.optString("avatar"));
            person.setSubscribed(json.optString("date_subscribed"));
            person.personType = isEmailFollower ? PersonType.EMAIL_FOLLOWER : PersonType.FOLLOWER;

            return person;
        } catch (NumberFormatException e) {
            AppLog.e(AppLog.T.PEOPLE, "The ID parsed from the JSON couldn't be converted to long: " + e);
        }

        return null;
    }

    @Nullable
    public static Person viewerFromJSON(JSONObject json, int localTableBlogId) throws JSONException {
        if (json == null) {
            return null;
        }

        // Similar response parameters in:
        // https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/users/%24user_id/
        try {
            long personID = Long.parseLong(json.getString("ID"));
            Person person = new Person(personID, localTableBlogId);
            person.setUsername(json.optString("login"));
            person.setDisplayName(json.optString("name"));
            person.setAvatarUrl(json.optString("avatar_URL"));
            person.setPersonType(PersonType.VIEWER);

            return person;
        } catch (NumberFormatException e) {
            AppLog.e(AppLog.T.PEOPLE, "The ID parsed from the JSON couldn't be converted to long: " + e);
        }

        return null;
    }

    public long getPersonID() {
        return personID;
    }

    public int getLocalTableBlogId() {
        return localTableBlogId;
    }

    public String getUsername() {
        return StringUtils.notNullStr(username);
    }

    public void setUsername(String username) {
        this.username = username;
    }

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

    public void setDisplayName(String displayName) {
        this.displayName = displayName;
    }

    public Role getRole() {
        return role;
    }

    public void setRole(Role role) {
        this.role = role;
    }

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

    public void setAvatarUrl(String avatarUrl) {
        this.avatarUrl = avatarUrl;
    }

    public String getSubscribed() {
        return StringUtils.notNullStr(subscribed);
    }

    public void setSubscribed(String subscribed) {
        this.subscribed = StringUtils.notNullStr(subscribed);
    }

    /*
     * converts iso8601 subscribed date to an actual java date
     */
    private transient java.util.Date dtSubscribed;
    public java.util.Date getDateSubscribed() {
        if (dtSubscribed == null)
            dtSubscribed = DateTimeUtils.dateFromIso8601(subscribed);
        return dtSubscribed;
    }

    public PersonType getPersonType() {
        return personType;
    }

    public void setPersonType(PersonType personType) {
        this.personType = personType;
    }
}
