content: //
  //  Copyright (c) 2014 VK.com
  //
  //  Permission is hereby granted, free of charge, to any person obtaining a copy of
  //  this software and associated documentation files (the "Software"), to deal in
  //  the Software without restriction, including without limitation the rights to
  //  use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
  //  the Software, and to permit persons to whom the Software is furnished to do so,
  //  subject to the following conditions:
  //
  //  The above copyright notice and this permission notice shall be included in all
  //  copies or substantial portions of the Software.
  //
  //  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  //  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  //  FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  //  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  //  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  //  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  //
  
  package com.vk.sdk.api.model;
  
  import android.os.Parcel;
  import org.json.JSONArray;
  import org.json.JSONException;
  import org.json.JSONObject;
  
  import static com.vk.sdk.api.model.ParseUtils.parseBoolean;
  import static com.vk.sdk.api.model.ParseUtils.parseLong;
  
  /**
   * Represents full user profile.
   */
  @SuppressWarnings("unused")
  public class VKApiUserFull extends VKApiUser implements android.os.Parcelable {
  
      /**
       * Filed last_seen from VK fields set
       */
      public static final String LAST_SEEN = "last_seen";
  
      /**
       * Filed bdate from VK fields set
       */
      public static final String BDATE = "bdate";
  
      /**
       * Filed city from VK fields set
       */
      public static final String CITY = "city";
  
      /**
       * Filed country from VK fields set
       */
      public static final String COUNTRY = "country";
  
      /**
       * Filed universities from VK fields set
       */
      public static final String UNIVERSITIES = "universities";
  
      /**
       * Filed schools from VK fields set
       */
      public static final String SCHOOLS = "schools";
  
      /**
       * Filed activity from VK fields set
       */
      public static final String ACTIVITY = "activity";
  
      /**
       * Filed personal from VK fields set
       */
      public static final String PERSONAL = "personal";
  
      /**
       * Filed sex from VK fields set
       */
      public static final String SEX = "sex";
  
      /**
       * Filed site from VK fields set
       */
      public static final String SITE = "site";
  
      /**
       * Filed contacts from VK fields set
       */
      public static final String CONTACTS = "contacts";
  
      /**
       * Filed can_post from VK fields set
       */
      public static final String CAN_POST = "can_post";
  
      /**
       * Filed can_see_all_posts from VK fields set
       */
      public static final String CAN_SEE_ALL_POSTS = "can_see_all_posts";
  
      /**
       * Filed can_write_private_message from VK fields set
       */
      public static final String CAN_WRITE_PRIVATE_MESSAGE = "can_write_private_message";
  
      /**
       * Filed relation from VK fields set
       */
      public static final String RELATION = "relation";
  
      /**
       * Filed counters from VK fields set
       */
      public static final String COUNTERS = "counters";
  
      /**
       * Filed activities from VK fields set
       */
      public static final String ACTIVITIES = "activities";
  
      /**
       * Filed interests from VK fields set
       */
      public static final String INTERESTS = "interests";
  
      /**
       * Filed movies from VK fields set
       */
      public static final String MOVIES = "movies";
  
      /**
       * Filed tv from VK fields set
       */
      public static final String TV = "tv";
  
      /**
       * Filed books from VK fields set
       */
      public static final String BOOKS = "books";
  
      /**
       * Filed games from VK fields set
       */
      public static final String GAMES = "games";
  
      /**
       * Filed about from VK fields set
       */
      public static final String ABOUT = "about";
  
      /**
       * Filed quotes from VK fields set
       */
      public static final String QUOTES = "quotes";
  
      /**
       * Filed connections from VK fields set
       */
      public static final String CONNECTIONS = "connections";
  
      /**
       * Filed relatives from VK fields set
       */
      public static final String RELATIVES = "relatives";
  
      /**
       * Filed wall_default from VK fields set
       */
      public static final String WALL_DEFAULT = "wall_default";
  
      /**
       * Filed verified from VK fields set
       */
      public static final String VERIFIED = "verified";
  
      /**
       * Filed screen_name from VK fields set
       */
      public static final String SCREEN_NAME = "screen_name";
  
      /**
       * Filed blacklisted_by_me from VK fields set
       */
      public static final String BLACKLISTED_BY_ME = "blacklisted_by_me";
  
      /**
       * Text of user status.
       */
      public String activity;
  
      /**
       * Audio which broadcasting to status.
       */
      public VKApiAudio status_audio;
  
      /**
       * User's date of birth.  Returned as DD.MM.YYYY or DD.MM (if birth year is hidden).
       */
      public String bdate;
  
      /**
       * City specified on user's page in "Contacts" section.
       */
      public VKApiCity city;
  
      /**
       * Country specified on user's page in "Contacts" section.
       */
      public VKApiCountry country;
  
      /**
       * Last visit date(in Unix time).
       */
      public long last_seen;
  
      /**
       * List of user's universities
       */
      public VKList<VKApiUniversity> universities;
  
      /**
       * List of user's schools
       */
      public VKList<VKApiSchool> schools;
  
      /**
       * Views on smoking.
       * @see {@link Attitude}
       */
      public int smoking;
  
      /**
       * Views on alcohol.
       * @see {@link Attitude}
       */
      public int alcohol;
  
      /**
       * Views on policy.
       * @see {@link com.vk.sdk.api.model.VKApiUserFull.Political}
       */
      public int political;
  
      /**
       * Life main stuffs.
       * @see {@link com.vk.sdk.api.model.VKApiUserFull.LifeMain}
       */
      public int life_main;
  
      /**
       * People main stuffs.
       * @see {@link com.vk.sdk.api.model.VKApiUserFull.PeopleMain}
       */
      public int people_main;
  
      /**
       * Stuffs that inspire the user.
       */
      public String inspired_by;
  
      /**
       * List of user's languages
       */
      public String[] langs;
  
      /**
       * Religion of user
       */
      public String religion;
  
      /**
       * Name of user's account in Facebook
       */
      public String facebook;
  
      /**
       * ID of user's facebook
       */
      public String facebook_name;
  
      /**
       * Name of user's account in LiveJournal
       */
      public String livejournal;
  
      /**
       * Name of user's account in Skype
       */
      public String skype;
  
      /**
       * URL of user's site
       */
      public String site;
  
      /**
       * Name of user's account in Twitter
       */
      public String twitter;
  
      /**
       * Name of user's account in Instagram
       */
      public String instagram;
  
      /**
       * User's mobile phone number
       */
      public String mobile_phone;
  
      /**
       * User's home phone number
       */
      public String home_phone;
  
      /**
       * Page screen name.
       */
      public String screen_name;
  
      /**
       * Nickname of user.
       */
      public String nickname;
  
      /**
       * User's activities
       */
      public String activities;
  
      /**
       * User's interests
       */
      public String interests;
  
      /**
       * User's favorite movies
       */
      public String movies;
  
      /**
       * User's favorite TV Shows
       */
      public String tv;
  
      /**
       * User's favorite books
       */
      public String books;
  
      /**
       * User's favorite games
       */
      public String games;
  
      /**
       * User's about information
       */
      public String about;
  
      /**
       * User's favorite quotes
       */
      public String quotes;
  
      /**
       * Information whether others can posts on user's wall.
       */
      public boolean can_post;
  
      /**
       * Information whether others' posts on user's wall can be viewed
       */
      public boolean can_see_all_posts;
  
      /**
       * Information whether private messages can be sent to this user.
       */
      public boolean can_write_private_message;
  
      /**
       * Information whether user can comment wall posts.
       */
      public boolean wall_comments;
  
      /**
       * Information whether the user is banned in VK.
       */
      public boolean is_banned;
  
      /**
       * Information whether the user is deleted in VK.
       */
      public boolean is_deleted;
  
      /**
       * Information whether the user's post of wall shows by default.
       */
      public boolean wall_default_owner;
  
      /**
       * Information whether the user has a verified page in VK
       */
      public boolean verified;
  
      /**
       * User sex.
       * @see {@link com.vk.sdk.api.model.VKApiUserFull.Sex}
       */
      public int sex;
  
      /**
       * Set of user's counters.
       */
      public Counters counters;
  
      /**
       * Relationship status.
       * @see {@link com.vk.sdk.api.model.VKApiUserFull.Relation}
       */
      public int relation;
  
      /**
       * List of user's relatives
       */
      public VKList<Relative> relatives;
  
      /**
       * Information whether the current user has add this user to the blacklist.
       */
      public boolean blacklisted_by_me;
  
  	public VKApiUserFull(JSONObject from) throws JSONException
  	{
  		parse(from);
  	}
      public VKApiUserFull parse(JSONObject user) {
          super.parse(user);
  
          // general
          last_seen = parseLong(user.optJSONObject(LAST_SEEN), "time");
          bdate = user.optString(BDATE);
  
          JSONObject city = user.optJSONObject(CITY);
          if(city != null) {
              this.city = new VKApiCity().parse(city);
          }
          JSONObject country = user.optJSONObject(COUNTRY);
          if(country != null) {
              this.country = new VKApiCountry().parse(country);
          }
  
          // education
          universities = new VKList<VKApiUniversity>(user.optJSONArray(UNIVERSITIES), VKApiUniversity.class);
          schools = new VKList<VKApiSchool>(user.optJSONArray(SCHOOLS), VKApiSchool.class);
  
          // status
          activity = user.optString(ACTIVITY);
  
          JSONObject status_audio = user.optJSONObject("status_audio");
          if(status_audio != null) this.status_audio = new VKApiAudio().parse(status_audio);
  
          // personal views
          JSONObject personal = user.optJSONObject(PERSONAL);
          if (personal != null) {
              smoking = personal.optInt("smoking");
              alcohol = personal.optInt("alcohol");
              political = personal.optInt("political");
              life_main = personal.optInt("life_main");
              people_main = personal.optInt("people_main");
              inspired_by = personal.optString("inspired_by");
              religion = personal.optString("religion");
              if (personal.has("langs")) {
                  JSONArray langs = personal.optJSONArray("langs");
                  if (langs != null) {
                      this.langs = new String[langs.length()];
                      for (int i = 0; i < langs.length(); i++) {
                          this.langs[i] = langs.optString(i);
                      }
                  }
              }
          }
  
          // contacts
          facebook = user.optString("facebook");
          facebook_name = user.optString("facebook_name");
          livejournal = user.optString("livejournal");
          site = user.optString(SITE);
          screen_name = user.optString("screen_name", "id" + id);
          skype = user.optString("skype");
          mobile_phone = user.optString("mobile_phone");
          home_phone = user.optString("home_phone");
          twitter = user.optString("twitter");
          instagram = user.optString("instagram");
  
          // personal info
          about = user.optString(ABOUT);
          activities = user.optString(ACTIVITIES);
          books = user.optString(BOOKS);
          games = user.optString(GAMES);
          interests = user.optString(INTERESTS);
          movies = user.optString(MOVIES);
          quotes = user.optString(QUOTES);
          tv = user.optString(TV);
  
          // settings
          nickname = user.optString("nickname", null);
          can_post = parseBoolean(user, CAN_POST);
          can_see_all_posts = parseBoolean(user, CAN_SEE_ALL_POSTS);
          blacklisted_by_me = parseBoolean(user, BLACKLISTED_BY_ME);
          can_write_private_message = parseBoolean(user, CAN_WRITE_PRIVATE_MESSAGE);
          wall_comments = parseBoolean(user, WALL_DEFAULT);
          String deactivated = user.optString("deactivated");
          is_deleted = "deleted".equals(deactivated);
          is_banned = "banned".equals(deactivated);
          wall_default_owner = "owner".equals(user.optString(WALL_DEFAULT));
          verified = parseBoolean(user, VERIFIED);
  
          // other
          sex = user.optInt(SEX);
          JSONObject counters = user.optJSONObject(COUNTERS);
          if (counters != null) this.counters = new Counters(counters);
  
          relation = user.optInt(RELATION);
  
          if (user.has(RELATIVES)) {
              if (relatives == null) {
                  relatives = new VKList<Relative>();
              }
              relatives.fill(user.optJSONArray(RELATIVES), Relative.class);
          }
          return this;
      }
  
      public static class Relative extends VKApiModel implements android.os.Parcelable, Identifiable {
  
          public int id;
          public String name;
  
          @Override
          public int getId() {
              return id;
          }
  
          @Override
          public Relative parse(JSONObject response) {
              id = response.optInt("id");
              name = response.optString("name");
              return this;
          }
  
  
          @Override
          public int describeContents() {
              return 0;
          }
  
          @Override
          public void writeToParcel(Parcel dest, int flags) {
              dest.writeInt(this.id);
              dest.writeString(this.name);
          }
  
          private Relative(Parcel in) {
              this.id = in.readInt();
              this.name = in.readString();
          }
  
          public static Creator<Relative> CREATOR = new Creator<Relative>() {
              public Relative createFromParcel(Parcel source) {
                  return new Relative(source);
              }
  
              public Relative[] newArray(int size) {
                  return new Relative[size];
              }
          };
      }
  
      public static class Counters implements android.os.Parcelable {
          /**
           * Count was not in server response.
           */
          public final static int NO_COUNTER = -1;
  
          public int albums = NO_COUNTER;
          public int videos = NO_COUNTER;
          public int audios = NO_COUNTER;
          public int notes = NO_COUNTER;
          public int friends = NO_COUNTER;
          public int photos = NO_COUNTER;
          public int groups = NO_COUNTER;
          public int online_friends = NO_COUNTER;
          public int mutual_friends = NO_COUNTER;
          public int user_videos = NO_COUNTER;
          public int followers = NO_COUNTER;
          public int subscriptions = NO_COUNTER;
          public int pages = NO_COUNTER;
  
          Counters(JSONObject counters) {
              albums = counters.optInt("albums", albums);
              audios = counters.optInt("audios", audios);
              followers = counters.optInt("followers", followers);
              photos = counters.optInt("photos", photos);
              friends = counters.optInt("friends", friends);
              groups = counters.optInt("groups", groups);
              mutual_friends = counters.optInt("mutual_friends", mutual_friends);
              notes = counters.optInt("notes", notes);
              online_friends = counters.optInt("online_friends", online_friends);
              user_videos = counters.optInt("user_videos", user_videos);
              videos = counters.optInt("videos", videos);
              subscriptions = counters.optInt("subscriptions", subscriptions);
              pages = counters.optInt("pages", pages);
          }
  
  
          @Override
          public int describeContents() {
              return 0;
          }
  
          @Override
          public void writeToParcel(Parcel dest, int flags) {
              dest.writeInt(this.albums);
              dest.writeInt(this.videos);
              dest.writeInt(this.audios);
              dest.writeInt(this.notes);
              dest.writeInt(this.friends);
              dest.writeInt(this.photos);
              dest.writeInt(this.groups);
              dest.writeInt(this.online_friends);
              dest.writeInt(this.mutual_friends);
              dest.writeInt(this.user_videos);
              dest.writeInt(this.followers);
              dest.writeInt(this.subscriptions);
              dest.writeInt(this.pages);
          }
  
          private Counters(Parcel in) {
              this.albums = in.readInt();
              this.videos = in.readInt();
              this.audios = in.readInt();
              this.notes = in.readInt();
              this.friends = in.readInt();
              this.photos = in.readInt();
              this.groups = in.readInt();
              this.online_friends = in.readInt();
              this.mutual_friends = in.readInt();
              this.user_videos = in.readInt();
              this.followers = in.readInt();
              this.subscriptions = in.readInt();
              this.pages = in.readInt();
          }
  
          public static Creator<Counters> CREATOR = new Creator<Counters>() {
              public Counters createFromParcel(Parcel source) {
                  return new Counters(source);
              }
  
              public Counters[] newArray(int size) {
                  return new Counters[size];
              }
          };
      }
  
      public static class Sex {
          private Sex() {
          }
  
          public static final int FEMALE = 1;
          public static final int MALE = 2;
      }
  
      public static class Relation {
          private Relation() {
          }
  
          public static final int SINGLE = 1;
          public static final int RELATIONSHIP = 2;
          public static final int ENGAGED = 3;
          public static final int MARRIED = 4;
          public static final int COMPLICATED = 5;
          public static final int SEARCHING = 6;
          public static final int IN_LOVE = 7;
      }
  
      public static class Attitude {
          private Attitude() {
          }
  
          public static final int VERY_NEGATIVE = 1;
          public static final int NEGATIVE = 2;
          public static final int COMPROMISABLE = 3;
          public static final int NEUTRAL = 4;
          public static final int POSITIVE = 5;
      }
  
      public static class Political {
          private Political() {
          }
  
          public static final int COMMUNNIST = 1;
          public static final int SOCIALIST = 2;
          public static final int CENTRIST = 3;
          public static final int LIBERAL = 4;
          public static final int CONSERVATIVE = 5;
          public static final int MONARCHIST = 6;
          public static final int ULTRACONSERVATIVE = 7;
          public static final int LIBERTARIAN = 8;
          public static final int APATHETIC = 9;
      }
  
      public static class LifeMain {
          private LifeMain() {
          }
  
          public static final int FAMILY_AND_CHILDREN = 1;
          public static final int CAREER_AND_MONEY = 2;
          public static final int ENTERTAINMENT_AND_LEISURE = 3;
          public static final int SCIENCE_AND_RESEARCH = 4;
          public static final int IMPROOVING_THE_WORLD = 5;
          public static final int PERSONAL_DEVELOPMENT = 6;
          public static final int BEAUTY_AND_ART = 7;
          public static final int FAME_AND_INFLUENCE = 8;
      }
  
      public static class PeopleMain {
          private PeopleMain() {
          }
  
          public static final int INTELLECT_AND_CREATIVITY = 1;
          public static final int KINDNESS_AND_HONESTLY = 2;
          public static final int HEALTH_AND_BEAUTY = 3;
          public static final int WEALTH_AND_POWER = 4;
          public static final int COURAGE_AND_PERSISTENCE = 5;
          public static final int HUMOR_AND_LOVE_FOR_LIFE = 6;
      }
  
      public static class RelativeType {
          private RelativeType() {
          }
  
          public static final String PARTNER = "partner";
          public static final String GRANDCHILD = "grandchild";
          public static final String GRANDPARENT = "grandparent";
          public static final String CHILD = "child";
          public static final String SUBLING = "sibling";
          public static final String PARENT = "parent";
      }
  
      @Override
      public int describeContents() {
          return 0;
      }
  
      @Override
      public void writeToParcel(Parcel dest, int flags) {
          super.writeToParcel(dest, flags);
          dest.writeString(this.activity);
          dest.writeParcelable(this.status_audio, flags);
          dest.writeString(this.bdate);
          dest.writeParcelable(this.city, flags);
          dest.writeParcelable(this.country, flags);
          dest.writeLong(this.last_seen);
          dest.writeParcelable(this.universities, flags);
          dest.writeParcelable(this.schools, flags);
          dest.writeInt(this.smoking);
          dest.writeInt(this.alcohol);
          dest.writeInt(this.political);
          dest.writeInt(this.life_main);
          dest.writeInt(this.people_main);
          dest.writeString(this.inspired_by);
          dest.writeStringArray(this.langs);
          dest.writeString(this.religion);
          dest.writeString(this.facebook);
          dest.writeString(this.facebook_name);
          dest.writeString(this.livejournal);
          dest.writeString(this.skype);
          dest.writeString(this.site);
          dest.writeString(this.twitter);
          dest.writeString(this.instagram);
          dest.writeString(this.mobile_phone);
          dest.writeString(this.home_phone);
          dest.writeString(this.screen_name);
          dest.writeString(this.activities);
          dest.writeString(this.interests);
          dest.writeString(this.movies);
          dest.writeString(this.tv);
          dest.writeString(this.books);
          dest.writeString(this.games);
          dest.writeString(this.about);
          dest.writeString(this.quotes);
          dest.writeByte(can_post ? (byte) 1 : (byte) 0);
          dest.writeByte(can_see_all_posts ? (byte) 1 : (byte) 0);
          dest.writeByte(can_write_private_message ? (byte) 1 : (byte) 0);
          dest.writeByte(wall_comments ? (byte) 1 : (byte) 0);
          dest.writeByte(is_banned ? (byte) 1 : (byte) 0);
          dest.writeByte(is_deleted ? (byte) 1 : (byte) 0);
          dest.writeByte(wall_default_owner ? (byte) 1 : (byte) 0);
          dest.writeByte(verified ? (byte) 1 : (byte) 0);
          dest.writeInt(this.sex);
          dest.writeParcelable(this.counters, flags);
          dest.writeInt(this.relation);
          dest.writeParcelable(this.relatives, flags);
          dest.writeByte(blacklisted_by_me ? (byte) 1 : (byte) 0);
      }
      public VKApiUserFull() {}
      public VKApiUserFull(Parcel in) {
          super(in);
          this.activity = in.readString();
          this.status_audio = in.readParcelable(VKApiAudio.class.getClassLoader());
          this.bdate = in.readString();
          this.city = in.readParcelable(VKApiCity.class.getClassLoader());
          this.country = in.readParcelable(VKApiCountry.class.getClassLoader());
          this.last_seen = in.readLong();
          this.universities = in.readParcelable(VKList.class.getClassLoader());
          this.schools = in.readParcelable(VKList.class.getClassLoader());
          this.smoking = in.readInt();
          this.alcohol = in.readInt();
          this.political = in.readInt();
          this.life_main = in.readInt();
          this.people_main = in.readInt();
          this.inspired_by = in.readString();
          this.langs = in.createStringArray();
          this.religion = in.readString();
          this.facebook = in.readString();
          this.facebook_name = in.readString();
          this.livejournal = in.readString();
          this.skype = in.readString();
          this.site = in.readString();
          this.twitter = in.readString();
          this.instagram = in.readString();
          this.mobile_phone = in.readString();
          this.home_phone = in.readString();
          this.screen_name = in.readString();
          this.activities = in.readString();
          this.interests = in.readString();
          this.movies = in.readString();
          this.tv = in.readString();
          this.books = in.readString();
          this.games = in.readString();
          this.about = in.readString();
          this.quotes = in.readString();
          this.can_post = in.readByte() != 0;
          this.can_see_all_posts = in.readByte() != 0;
          this.can_write_private_message = in.readByte() != 0;
          this.wall_comments = in.readByte() != 0;
          this.is_banned = in.readByte() != 0;
          this.is_deleted = in.readByte() != 0;
          this.wall_default_owner = in.readByte() != 0;
          this.verified = in.readByte() != 0;
          this.sex = in.readInt();
          this.counters = in.readParcelable(Counters.class.getClassLoader());
          this.relation = in.readInt();
          this.relatives = in.readParcelable(VKList.class.getClassLoader());
          this.blacklisted_by_me = in.readByte() != 0;
      }
  
      public static Creator<VKApiUserFull> CREATOR = new Creator<VKApiUserFull>() {
          public VKApiUserFull createFromParcel(Parcel source) {
              return new VKApiUserFull(source);
          }
  
          public VKApiUserFull[] newArray(int size) {
              return new VKApiUserFull[size];
          }
      };
  }
  