/*
 * 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
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * 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.geode.internal.admin;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

import org.apache.geode.DataSerializer;
import org.apache.geode.admin.internal.AdminDistributedSystemImpl;
import org.apache.geode.distributed.internal.ClusterDistributionManager;
import org.apache.geode.distributed.internal.PooledDistributionMessage;
import org.apache.geode.distributed.internal.membership.InternalDistributedMember;

/**
 * A PooledDistributionMessage for notifying admin members about changes in Client Membership
 * received through BridgeMembership
 *
 */
public class ClientMembershipMessage extends PooledDistributionMessage {
  public static final int JOINED = 0;
  public static final int LEFT = 1;
  public static final int CRASHED = 2;


  private String clientId;
  private String clientHost;
  private int eventType;

  /**
   * Default constructor(for serialization)
   */
  public ClientMembershipMessage() {}

  /**
   * Parameterized constructor
   *
   * @param clientId Id of the client
   * @param clientHost host the client was running on (could be null)
   * @param eventType whether client joined, left or crashed. Should be one of
   *        ClientMembershipMessage.JOINED, ClientMembershipMessage.LEFT,
   *        ClientMembershipMessage.CRASHED
   */
  public ClientMembershipMessage(String clientId, String clientHost, int eventType) {
    this.clientId = clientId;
    this.clientHost = clientHost;
    this.eventType = eventType;
  }

  /**
   *
   * @see org.apache.geode.distributed.internal.DistributionMessage#process(ClusterDistributionManager)
   */
  @Override
  protected void process(ClusterDistributionManager dm) {
    AdminDistributedSystemImpl adminDs = AdminDistributedSystemImpl.getConnectedInstance();

    /*
     * Disconnect can be called on AdminDistributedSystem from Agent and it is not synchronous with
     * processing of this message. Null check added to avoid null if disconnect has been called on
     * AdminDistributedSystem
     */
    if (adminDs != null) {
      String senderId = null;
      InternalDistributedMember msgSender = this.getSender();
      if (msgSender != null) {
        senderId = msgSender.getId();
      }

      adminDs.processClientMembership(senderId, clientId, clientHost, eventType);
    }
  }

  /**
   *
   * @see org.apache.geode.internal.DataSerializableFixedID#getDSFID()
   */
  @Override
  public int getDSFID() {
    return CLIENT_MEMBERSHIP_MESSAGE;
  }

  @Override
  public void toData(DataOutput out) throws IOException {
    super.toData(out);
    DataSerializer.writeString(this.clientId, out);
    DataSerializer.writeString(this.clientHost, out);
    out.writeInt(this.eventType);
  }

  @Override
  public void fromData(DataInput in) throws IOException, ClassNotFoundException {
    super.fromData(in);

    this.clientId = DataSerializer.readString(in);
    this.clientHost = DataSerializer.readString(in);
    this.eventType = in.readInt();
  }

  /**
   * @return the clientId
   */
  public String getClientId() {
    return clientId;
  }

  /**
   * @return the clientHost
   */
  public String getClientHost() {
    return clientHost;
  }

  /**
   * @return the eventType
   */
  public int getEventType() {
    return eventType;
  }

  /**
   * @param eventType the eventType integer
   * @return String format of eventType
   */
  public static String getEventTypeString(int eventType) {
    switch (eventType) {
      case JOINED:
        return "Member JOINED";
      case LEFT:
        return "Member LEFT";
      case CRASHED:
        return "Member CRASHED";
      default:
        return "UNKNOWN";
    }
  }

  /**
   * String representation of this message.
   *
   * @return String representation of this message.
   */
  @Override
  public String toString() {
    String clientMembership = "JOINED";

    switch (this.eventType) {
      case LEFT:
        clientMembership = "LEFT";
        break;

      case CRASHED:
        clientMembership = "CRASHED and left";
        break;

      default:
        break;
    }

    return "Client with Id: " + this.clientId + " running on host: " + this.clientHost + " "
        + clientMembership + " the server: " + this.getSender();
  }

}
