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 android.os.Parcelable;
  import android.text.TextUtils;
  import org.json.JSONObject;
  
  /**
   * Represents full community profile.
   */
  @SuppressWarnings("unused")
  public class VKApiCommunityFull extends VKApiCommunity implements Parcelable {
  
      /**
       * Filed city from VK fields set
       */
      public final static String CITY = "city";
  
      /**
       * Filed country from VK fields set
       */
      public final static String COUNTRY = "country";
  
      /**
       * Filed place from VK fields set
       */
      public final static String PLACE = "place";
  
      /**
       * Filed description from VK fields set
       */
      public final static String DESCRIPTION = "description";
  
      /**
       * Filed wiki_page from VK fields set
       */
      public final static String WIKI_PAGE = "wiki_page";
  
      /**
       * Filed members_count from VK fields set
       */
      public final static String MEMBERS_COUNT = "members_count";
  
      /**
       * Filed counters from VK fields set
       */
      public final static String COUNTERS = "counters";
  
      /**
       * Filed start_date from VK fields set
       */
      public final static String START_DATE = "start_date";
  
      /**
       * Filed end_date from VK fields set
       */
      public final static String END_DATE = "end_date";
  
      /**
       * Filed can_post from VK fields set
       */
      public final static String CAN_POST = "can_post";
  
      /**
       * Filed can_see_all_posts from VK fields set
       */
      public final static String CAN_SEE_ALL_POSTS = "can_see_all_posts";
  
      /**
       * Filed status from VK fields set
       */
      public final static String STATUS = "status";
  
      /**
       * Filed contacts from VK fields set
       */
      public final static String CONTACTS = "contacts";
  
      /**
       * Filed links from VK fields set
       */
      public final static String LINKS = "links";
  
      /**
       * Filed fixed_post from VK fields set
       */
      public final static String FIXED_POST = "fixed_post";
  
      /**
       * Filed verified from VK fields set
       */
      public final static String VERIFIED = "verified";
  
      /**
       * Filed blacklisted from VK fields set
       */
      public final static String BLACKLISTED = "blacklisted";
  
      /**
       * Filed site from VK fields set
       */
      public final static String SITE = "site";
  
      /**
       * Filed activity from VK fields set
       */
      public final static String ACTIVITY = "activity";
  
      /**
       * City specified in information about community.
       */
      public VKApiCity city;
  
      /**
       * Country specified in information about community.
       */
      public VKApiCountry country;
  
      /**
       * Audio which broadcasting to status.
       */
      public VKApiAudio status_audio;
  
      /**
       * The location which specified in information about community
       */
      public VKApiPlace place;
  
      /**
       * Community description text.
       */
      public String description;
  
      /**
       * Name of the home wiki-page of the community.
       */
      public String wiki_page;
  
      /**
       * Number of community members.
       */
      public int members_count;
  
      /**
       * Counters object with community counters.
       */
      public Counters counters;
  
      /**
       * Returned only for meeting and contain start time of the meeting as unixtime.
       */
      public long start_date;
  
      /**
       * Returned only for meeting and contain end time of the meeting as unixtime.
       */
      public long end_date;
  
      /**
       * Whether the current user can post on the community's wall
       */
      public boolean can_post;
  
      /**
       * Whether others' posts on the community's wall can be viewed
       */
      public boolean can_see_all_posts;
  
      /**
       * Group status.
       */
      public String status;
  
      /**
       * Information from public page contact module.
       */
      public VKList<Contact> contacts;
  
      /**
       * Information from public page links module.
       */
      public VKList<Link> links;
  
      /**
       * ID of fixed post of this community.
       */
      public int fixed_post;
  
      /**
       * Information whether the community has a verified page in VK
       */
      public boolean verified;
  
      /**
       * URL of community site
       */
      public String site;
  
      /**
       * Information whether the current community has add current user to the blacklist.
       */
      public boolean blacklisted;
  
      public VKApiCommunityFull() {
          super();
      }
  
      public VKApiCommunityFull parse(JSONObject jo) {
          super.parse(jo);
  
          JSONObject city = jo.optJSONObject(CITY);
          if(city != null) {
              this.city = new VKApiCity().parse(city);
          }
          JSONObject country = jo.optJSONObject(COUNTRY);
          if(country != null) {
              this.country = new VKApiCountry().parse(country);
          }
  
          JSONObject place = jo.optJSONObject(PLACE);
          if(place != null) this.place = new VKApiPlace().parse(place);
  
          description = jo.optString(DESCRIPTION);
          wiki_page = jo.optString(WIKI_PAGE);
          members_count = jo.optInt(MEMBERS_COUNT);
  
          JSONObject counters = jo.optJSONObject(COUNTERS);
          if(counters != null) this.counters = new Counters(place);
  
          start_date = jo.optLong(START_DATE);
          end_date = jo.optLong(END_DATE);
          can_post = ParseUtils.parseBoolean(jo, CAN_POST);
          can_see_all_posts = ParseUtils.parseBoolean(jo, CAN_SEE_ALL_POSTS);
          status = jo.optString(STATUS);
  
          JSONObject status_audio = jo.optJSONObject("status_audio");
          if(status_audio != null) this.status_audio = new VKApiAudio().parse(status_audio);
  
          contacts = new VKList<Contact>(jo.optJSONArray(CONTACTS), Contact.class);
          links = new VKList<Link>(jo.optJSONArray(LINKS), Link.class);
          fixed_post = jo.optInt(FIXED_POST);
          verified = ParseUtils.parseBoolean(jo, VERIFIED);
          blacklisted = ParseUtils.parseBoolean(jo, VERIFIED);
          site = jo.optString(SITE);
          return this;
      }
  
  
  
      public static class Counters implements Parcelable {
  
          /**
           * Значение в том случае, если счетчик не был явно указан.
           */
          public final static int NO_COUNTER = -1;
  
          public int photos = NO_COUNTER;
          public int albums = NO_COUNTER;
          public int audios = NO_COUNTER;
          public int videos = NO_COUNTER;
          public int topics = NO_COUNTER;
          public int docs = NO_COUNTER;
  
          public Counters(JSONObject from) {
              photos = from.optInt("photos", photos);
              albums = from.optInt("albums", albums);
              audios = from.optInt("audios", audios);
              videos = from.optInt("videos", videos);
              topics = from.optInt("topics", topics);
              docs = from.optInt("docs", docs);
          }
  
  
          @Override
          public int describeContents() {
              return 0;
          }
  
          @Override
          public void writeToParcel(Parcel dest, int flags) {
              dest.writeInt(this.photos);
              dest.writeInt(this.albums);
              dest.writeInt(this.audios);
              dest.writeInt(this.videos);
              dest.writeInt(this.topics);
              dest.writeInt(this.docs);
          }
  
          private Counters(Parcel in) {
              this.photos = in.readInt();
              this.albums = in.readInt();
              this.audios = in.readInt();
              this.videos = in.readInt();
              this.topics = in.readInt();
              this.docs = 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 Contact extends VKApiModel implements Parcelable, Identifiable {
          public int user_id;
          public VKApiUser user;
          public String email;
          public String desc;
  
          public Contact(JSONObject from) {
              parse(from);
          }
  
  	    public Contact parse(JSONObject from) {
  		    user_id = from.optInt("user_id");
  		    desc = from.optString("desc");
  		    email = from.optString("email");
  		    return this;
  	    }
  
          @Override
          public int describeContents() {
              return 0;
          }
  
          @Override
          public void writeToParcel(Parcel dest, int flags) {
              dest.writeInt(this.user_id);
              dest.writeString(this.desc);
  
          }
  
          private Contact(Parcel in) {
              this.user_id = in.readInt();
              this.desc = in.readString();
          }
  
          public static Creator<Contact> CREATOR = new Creator<Contact>() {
              public Contact createFromParcel(Parcel source) {
                  return new Contact(source);
              }
  
              public Contact[] newArray(int size) {
                  return new Contact[size];
              }
          };
  
          @Override
          public int getId() {
              return user_id;
          }
  
          @Override
          public String toString() {
              if(user != null) {
                  return user.toString();
              } else if(email != null) {
                  return email;
              }
              return null;
          }
      }
  
      public static class Link extends VKApiModel implements Parcelable, Identifiable {
  
          public String url;
          public String name;
          public String desc;
          public VKPhotoSizes photo = new VKPhotoSizes();
  
          public Link(JSONObject from) {
              parse(from);
          }
  	    public Link parse(JSONObject from) {
  		    url = from.optString("url");
  		    name = from.optString("name");
  		    desc = from.optString("desc");
  
  		    String photo_50 = from.optString("photo_50");
  		    if(!TextUtils.isEmpty(photo_50)) {
  			    photo.add(VKApiPhotoSize.create(photo_50, 50));
  		    }
  		    String photo_100 = from.optString("photo_100");
  		    if(!TextUtils.isEmpty(photo_100)) {
  			    photo.add(VKApiPhotoSize.create(photo_100, 100));
  		    }
  		    photo.sort();
  		    return this;
  	    }
  
          @Override
          public int describeContents() {
              return 0;
          }
  
          @Override
          public void writeToParcel(Parcel dest, int flags) {
              dest.writeString(this.url);
              dest.writeString(this.name);
              dest.writeString(this.desc);
              dest.writeParcelable(this.photo, flags);
          }
  
          public Link(Parcel in) {
              this.url = in.readString();
              this.name = in.readString();
              this.desc = in.readString();
              this.photo = in.readParcelable(null);
          }
  
          public static Creator<Link> CREATOR = new Creator<Link>() {
              public Link createFromParcel(Parcel source) {
                  return new Link(source);
              }
  
              public Link[] newArray(int size) {
                  return new Link[size];
              }
          };
  
          @Override
          public int getId() {
              return 0;
          }
      }
  
      @Override
      public int describeContents() {
          return 0;
      }
  
      @Override
      public void writeToParcel(Parcel dest, int flags) {
          super.writeToParcel(dest, flags);
          dest.writeParcelable(this.city, flags);
          dest.writeParcelable(this.country, flags);
          dest.writeParcelable(this.status_audio, flags);
          dest.writeParcelable(this.place, flags);
          dest.writeString(this.description);
          dest.writeString(this.wiki_page);
          dest.writeInt(this.members_count);
          dest.writeParcelable(this.counters, flags);
          dest.writeLong(this.start_date);
          dest.writeLong(this.end_date);
          dest.writeByte(can_post ? (byte) 1 : (byte) 0);
          dest.writeByte(can_see_all_posts ? (byte) 1 : (byte) 0);
          dest.writeString(this.status);
          dest.writeParcelable(this.contacts, flags);
          dest.writeParcelable(this.links, flags);
          dest.writeInt(this.fixed_post);
          dest.writeByte(verified ? (byte) 1 : (byte) 0);
          dest.writeString(this.site);
          dest.writeByte(blacklisted ? (byte) 1 : (byte) 0);
      }
  
      public VKApiCommunityFull(Parcel in) {
          super(in);
          this.city = in.readParcelable(VKApiCity.class.getClassLoader());
          this.country = in.readParcelable(VKApiCountry.class.getClassLoader());
          this.status_audio = in.readParcelable(VKApiAudio.class.getClassLoader());
          this.place = in.readParcelable(VKApiPlace.class.getClassLoader());
          this.description = in.readString();
          this.wiki_page = in.readString();
          this.members_count = in.readInt();
          this.counters = in.readParcelable(Counters.class.getClassLoader());
          this.start_date = in.readLong();
          this.end_date = in.readLong();
          this.can_post = in.readByte() != 0;
          this.can_see_all_posts = in.readByte() != 0;
          this.status = in.readString();
          this.contacts = in.readParcelable(VKList.class.getClassLoader());
          this.links = in.readParcelable(VKList.class.getClassLoader());
          this.fixed_post = in.readInt();
          this.verified = in.readByte() != 0;
          this.site = in.readString();
          this.blacklisted = in.readByte() != 0;
      }
  
      public static Creator<VKApiCommunityFull> CREATOR = new Creator<VKApiCommunityFull>() {
          public VKApiCommunityFull createFromParcel(Parcel source) {
              return new VKApiCommunityFull(source);
          }
  
          public VKApiCommunityFull[] newArray(int size) {
              return new VKApiCommunityFull[size];
          }
      };
  }
  