/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with this
 * work for additional information regarding copyright ownership.  The ASF
 * licenses this file to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.apache.hadoop.ozone.om.helpers;

import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationFactor;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationType;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.MultipartKeyInfo;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.PartKeyInfo;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.FileHandle;

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

/**
 * This class represents multipart upload information for a key, which holds
 * upload part information of the key.
 */
public class OmMultipartKeyInfo extends WithObjectID {
  private final String uploadID;
  private final long creationTime;
  private final ReplicationType replicationType;
  private final ReplicationFactor replicationFactor;
  private TreeMap<Integer, PartKeyInfo> partKeyInfoList;
  private long fileHandleInfo;

  /**
   * Construct OmMultipartKeyInfo object which holds multipart upload
   * information for a key.
   */
  @SuppressWarnings("parameternumber")
  public OmMultipartKeyInfo(String id, long creationTime,
      ReplicationType replicationType, ReplicationFactor replicationFactor,
      Map<Integer, PartKeyInfo> list, long objectID, long updateID,
                            long fileHandleInfo) {
    this.uploadID = id;
    this.creationTime = creationTime;
    this.replicationType = replicationType;
    this.replicationFactor = replicationFactor;
    this.partKeyInfoList = new TreeMap<>(list);
    this.objectID = objectID;
    this.updateID = updateID;
    if (fileHandleInfo != 0) {
      this.fileHandleInfo = fileHandleInfo;
    } else {
      this.fileHandleInfo = objectID;
    }
  }

  public long getFileHandleInfo() {
    return fileHandleInfo;
  }

  public void setFileHandleInfo(long fileHandleInfo) {
    this.fileHandleInfo = fileHandleInfo;
  }

  /**
   * Returns the uploadID for this multi part upload of a key.
   * @return uploadID
   */
  public String getUploadID() {
    return uploadID;
  }

  public long getCreationTime() {
    return creationTime;
  }

  public TreeMap<Integer, PartKeyInfo> getPartKeyInfoMap() {
    return partKeyInfoList;
  }

  public void addPartKeyInfo(int partNumber, PartKeyInfo partKeyInfo) {
    this.partKeyInfoList.put(partNumber, partKeyInfo);
  }

  public PartKeyInfo getPartKeyInfo(int partNumber) {
    return partKeyInfoList.get(partNumber);
  }

  public ReplicationType getReplicationType() {
    return replicationType;
  }

  public ReplicationFactor getReplicationFactor() {
    return replicationFactor;
  }

  /**
   * Builder of OmMultipartKeyInfo.
   */
  public static class Builder {
    private String uploadID;
    private long creationTime;
    private ReplicationType replicationType;
    private ReplicationFactor replicationFactor;
    private TreeMap<Integer, PartKeyInfo> partKeyInfoList;
    private long objectID;
    private long updateID;
    private long fileHandleInfo;

    public Builder() {
      this.partKeyInfoList = new TreeMap<>();
    }

    public Builder setUploadID(String uploadId) {
      this.uploadID = uploadId;
      return this;
    }

    public Builder setCreationTime(long crTime) {
      this.creationTime = crTime;
      return this;
    }

    public Builder setReplicationType(ReplicationType replType) {
      this.replicationType = replType;
      return this;
    }

    public Builder setReplicationFactor(ReplicationFactor replFactor) {
      this.replicationFactor = replFactor;
      return this;
    }

    public Builder setPartKeyInfoList(Map<Integer, PartKeyInfo> partKeyInfos) {
      if (partKeyInfos != null) {
        this.partKeyInfoList.putAll(partKeyInfos);
      }
      return this;
    }

    public Builder addPartKeyInfoList(int partNum, PartKeyInfo partKeyInfo) {
      if (partKeyInfo != null) {
        partKeyInfoList.put(partNum, partKeyInfo);
      }
      return this;
    }

    public Builder setObjectID(long obId) {
      this.objectID = obId;
      return this;
    }

    public Builder setFileHandleInfo(long fh) {
      this.fileHandleInfo = fh;
      return this;
    }

    public Builder setUpdateID(long id) {
      this.updateID = id;
      return this;
    }

    public OmMultipartKeyInfo build() {
      return new OmMultipartKeyInfo(uploadID, creationTime, replicationType,
          replicationFactor, partKeyInfoList, objectID, updateID,
          fileHandleInfo);
    }
  }

  /**
   * Construct OmMultipartInfo from MultipartKeyInfo proto object.
   * @param multipartKeyInfo
   * @return OmMultipartKeyInfo
   */
  public static OmMultipartKeyInfo getFromProto(
      MultipartKeyInfo multipartKeyInfo) {
    Map<Integer, PartKeyInfo> list = new HashMap<>();
    multipartKeyInfo.getPartKeyInfoListList().forEach(partKeyInfo ->
        list.put(partKeyInfo.getPartNumber(), partKeyInfo));
    long fhid = 0;
    if (multipartKeyInfo.hasFileHandleInfo()) {
      FileHandle fh = multipartKeyInfo.getFileHandleInfo();
      if (fh.hasFhObjectID()) { 
        fhid = fh.getFhObjectID();
      }
    }
    return new OmMultipartKeyInfo(multipartKeyInfo.getUploadID(),
        multipartKeyInfo.getCreationTime(), multipartKeyInfo.getType(),
        multipartKeyInfo.getFactor(), list, multipartKeyInfo.getObjectID(),
        multipartKeyInfo.getUpdateID(), fhid);
  }

  /**
   * Construct MultipartKeyInfo from this object.
   * @return MultipartKeyInfo
   */
  public MultipartKeyInfo getProto() {
    FileHandle.Builder fb = FileHandle.newBuilder()
        .setFhObjectID(fileHandleInfo);
    MultipartKeyInfo.Builder builder = MultipartKeyInfo.newBuilder()
        .setUploadID(uploadID)
        .setCreationTime(creationTime)
        .setType(replicationType)
        .setFactor(replicationFactor)
        .setObjectID(objectID)
        .setUpdateID(updateID)
        .setFileHandleInfo(fb.build());
    partKeyInfoList.forEach((key, value) -> builder.addPartKeyInfoList(value));
    return builder.build();
  }

  @Override
  public String getObjectInfo() {
    return getProto().toString();
  }

  @Override
  public boolean equals(Object other) {
    if (this == other) {
      return true;
    }
    return other instanceof OmMultipartKeyInfo && uploadID.equals(
        ((OmMultipartKeyInfo)other).getUploadID());
  }

  @Override
  public int hashCode() {
    return uploadID.hashCode();
  }

  public OmMultipartKeyInfo copyObject() {
    // For partKeyInfoList we can do shallow copy here, as the PartKeyInfo is
    // immutable here.
    return new OmMultipartKeyInfo(uploadID, creationTime, replicationType,
        replicationFactor, new TreeMap<>(partKeyInfoList), objectID, updateID,
        fileHandleInfo);
  }

}
