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.
  //
  
  /**
   * VKAttachments.java
   * vk-android-sdk
   *
   * Created by Babichev Vitaly on 01.02.14.
   * Copyright (c) 2014 VK. All rights reserved.
   */
  package com.vk.sdk.api.model;
  
  import android.os.Parcel;
  
  import com.vk.sdk.util.VKStringJoiner;
  
  import org.json.JSONArray;
  import org.json.JSONObject;
  
  import java.util.ArrayList;
  import java.util.Arrays;
  import java.util.List;
  
  /**
   * A list of attachments in {@link VKApiComment}, {@link VKApiPost}, {@link VKApiMessage}
   */
  public class VKAttachments extends VKList<VKAttachments.VKApiAttachment> implements android.os.Parcelable {
  
      /**
       * Attachment is a photo.
       * @see {@link VKApiPhoto}
       */
      public static final String TYPE_PHOTO = "photo";
  
      /**
       * Attachment is a video.
       * @see {@link VKApiVideo}
       */
      public static final String TYPE_VIDEO = "video";
  
      /**
       * Attachment is an audio.
       * @see {@link VKApiAudio}
       */
      public static final String TYPE_AUDIO = "audio";
  
      /**
       * Attachment is a document.
       * @see {@link VKApiDocument}
       */
      public static final String TYPE_DOC = "doc";
  
      /**
       * Attachment is a wall post.
       * @see {@link VKApiPost}
       */
      public static final String TYPE_POST = "wall";
  
      /**
       * Attachment is a posted photo.
       * @see {@link VKApiPostedPhoto}
       */
      public static final String TYPE_POSTED_PHOTO = "posted_photo";
  
      /**
       * Attachment is a link
       * @see {@link VKApiLink}
       */
      public static final String TYPE_LINK = "link";
  
      /**
       * Attachment is a note
       * @see {@link VKApiNote}
       */
      public static final String TYPE_NOTE = "note";
  
      /**
       * Attachment is an application content
       * @see {@link VKApiApplicationContent}
       */
      public static final String TYPE_APP = "app";
  
      /**
       * Attachment is a poll
       * @see {@link VKApiPoll}
       */
      public static final String TYPE_POLL = "poll";
  
      /**
       * Attachment is a WikiPage
       * @see {@link VKApiWikiPage}
       */
      public static final String TYPE_WIKI_PAGE = "page";
  
      /**
       * Attachment is a PhotoAlbum
       * @see {@link VKApiPhotoAlbum}
       */
      public static final String TYPE_ALBUM = "album";
  
  
      public VKAttachments() {
          super();
      }
  
      public VKAttachments(VKApiAttachment... data) {
          super(Arrays.asList(data));
      }
  
      public VKAttachments(List<? extends VKApiAttachment> data) {
          super(data);
      }
  
      public VKAttachments(JSONObject from) {
          super();
          fill(from);
      }
  
      public VKAttachments(JSONArray from) {
          super();
          fill(from);
      }
  
      public void fill(JSONObject from) {
          super.fill(from, parser);
      }
  
      public void fill(JSONArray from) {
          super.fill(from, parser);
      }
  
      public String toAttachmentsString() {
          ArrayList<CharSequence> attachments = new ArrayList<CharSequence>();
          for (VKApiAttachment attach : this) {
              attachments.add(attach.toAttachmentString());
          }
          return VKStringJoiner.join(attachments, ",");
      }
      /**
       * Parser that's used for parsing photo sizes.
       */
      private final Parser<VKApiAttachment> parser = new Parser<VKApiAttachment>() {
          @Override
          public VKApiAttachment parseObject(JSONObject attachment) throws Exception {
              String type = attachment.optString("type");
              if(TYPE_PHOTO.equals(type)) {
                  return new VKApiPhoto().parse(attachment.getJSONObject(TYPE_PHOTO));
              } else if(TYPE_VIDEO.equals(type)) {
                  return new VKApiVideo().parse(attachment.getJSONObject(TYPE_VIDEO));
              } else if(TYPE_AUDIO.equals(type)) {
                  return new VKApiAudio().parse(attachment.getJSONObject(TYPE_AUDIO));
              } else if(TYPE_DOC.equals(type)) {
                  return new VKApiDocument().parse(attachment.getJSONObject(TYPE_DOC));
              } else if(TYPE_POST.equals(type)) {
                  return new VKApiPost().parse(attachment.getJSONObject(TYPE_POST));
              } else if(TYPE_POSTED_PHOTO.equals(type)) {
                  return new VKApiPostedPhoto().parse(attachment.getJSONObject(TYPE_POSTED_PHOTO));
              } else if(TYPE_LINK.equals(type)) {
                  return new VKApiLink().parse(attachment.getJSONObject(TYPE_LINK));
              } else if(TYPE_NOTE.equals(type)) {
                  return new VKApiNote().parse(attachment.getJSONObject(TYPE_NOTE));
              } else if(TYPE_APP.equals(type)) {
                  return new VKApiApplicationContent().parse(attachment.getJSONObject(TYPE_APP));
              } else if(TYPE_POLL.equals(type)) {
                  return new VKApiPoll().parse(attachment.getJSONObject(TYPE_POLL));
              } else if(TYPE_WIKI_PAGE.equals(type)) {
                  return new VKApiWikiPage().parse(attachment.getJSONObject(TYPE_WIKI_PAGE));
              } else if(TYPE_ALBUM.equals(type)) {
                  return new VKApiPhotoAlbum().parse(attachment.getJSONObject(TYPE_ALBUM));
              }
              return null;
          }
      };
  
  
      @Override
      public int describeContents() {
          return 0;
      }
  
      @Override
      public void writeToParcel(Parcel dest, int flags) {
          dest.writeInt(size());
          for(VKApiAttachment attachment: this) {
              dest.writeString(attachment.getType());
              dest.writeParcelable(attachment, 0);
          }
      }
  
      public VKAttachments(Parcel parcel) {
          int size = parcel.readInt();
          for(int i = 0; i < size; i++) {
              String type = parcel.readString();
              if(TYPE_PHOTO.equals(type)) {
                  add((VKApiAttachment) parcel.readParcelable(VKApiPhoto.class.getClassLoader()));
              } else if(TYPE_VIDEO.equals(type)) {
                  add((VKApiAttachment) parcel.readParcelable(VKApiVideo.class.getClassLoader()));
              } else if(TYPE_AUDIO.equals(type)) {
                  add((VKApiAttachment) parcel.readParcelable(VKApiAudio.class.getClassLoader()));
              } else if(TYPE_DOC.equals(type)) {
                  add((VKApiAttachment) parcel.readParcelable(VKApiDocument.class.getClassLoader()));
              } else if(TYPE_POST.equals(type)) {
                  add((VKApiAttachment) parcel.readParcelable(VKApiPost.class.getClassLoader()));
              } else if(TYPE_POSTED_PHOTO.equals(type)) {
                  add((VKApiAttachment) parcel.readParcelable(VKApiPostedPhoto.class.getClassLoader()));
              } else if(TYPE_LINK.equals(type)) {
                  add((VKApiAttachment) parcel.readParcelable(VKApiLink.class.getClassLoader()));
              } else if(TYPE_NOTE.equals(type)) {
                  add((VKApiAttachment) parcel.readParcelable(VKApiNote.class.getClassLoader()));
              } else if(TYPE_APP.equals(type)) {
                  add((VKApiAttachment) parcel.readParcelable(VKApiApplicationContent.class.getClassLoader()));
              } else if(TYPE_POLL.equals(type)) {
                  add((VKApiAttachment) parcel.readParcelable(VKApiPoll.class.getClassLoader()));
              } else if(TYPE_WIKI_PAGE.equals(type)) {
                  add((VKApiAttachment) parcel.readParcelable(VKApiWikiPage.class.getClassLoader()));
              } else if(TYPE_ALBUM.equals(type)) {
                  add((VKApiAttachment)  parcel.readParcelable(VKApiPhotoAlbum.class.getClassLoader()));
              }
          }
      }
  
      public static Creator<VKAttachments> CREATOR = new Creator<VKAttachments>() {
          public VKAttachments createFromParcel(Parcel source) {
              return new VKAttachments(source);
          }
  
          public VKAttachments[] newArray(int size) {
              return new VKAttachments[size];
          }
      };
  
      /**
       * An abstract class for all attachments
       */
      @SuppressWarnings("unused")
      public abstract static class VKApiAttachment extends VKApiModel implements Identifiable {
  
          /**
           * Convert attachment to special string to attach it to the post, message or comment.
           */
          public abstract CharSequence toAttachmentString();
  
          /**
           * @return type of this attachment
           */
          public abstract String getType();
      }
  }
  