/*
 * 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.fineract.cn.identity.api.v1.events;

import java.util.Objects;

/**
 * @author Myrle Krantz
 */
@SuppressWarnings({"unused", "WeakerAccess"})
public class ApplicationPermissionUserEvent {
  private String applicationIdentifier;
  private String permittableGroupIdentifier;
  private String userIdentifier;

  public ApplicationPermissionUserEvent() {
  }

  public ApplicationPermissionUserEvent(String applicationIdentifier, String permittableGroupIdentifier, String userIdentifier) {
    this.applicationIdentifier = applicationIdentifier;
    this.permittableGroupIdentifier = permittableGroupIdentifier;
    this.userIdentifier = userIdentifier;
  }

  public String getApplicationIdentifier() {
    return applicationIdentifier;
  }

  public void setApplicationIdentifier(String applicationIdentifier) {
    this.applicationIdentifier = applicationIdentifier;
  }

  public String getPermittableGroupIdentifier() {
    return permittableGroupIdentifier;
  }

  public void setPermittableGroupIdentifier(String permittableGroupIdentifier) {
    this.permittableGroupIdentifier = permittableGroupIdentifier;
  }

  public String getUserIdentifier() {
    return userIdentifier;
  }

  public void setUserIdentifier(String userIdentifier) {
    this.userIdentifier = userIdentifier;
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    ApplicationPermissionUserEvent that = (ApplicationPermissionUserEvent) o;
    return Objects.equals(applicationIdentifier, that.applicationIdentifier) &&
            Objects.equals(permittableGroupIdentifier, that.permittableGroupIdentifier) &&
            Objects.equals(userIdentifier, that.userIdentifier);
  }

  @Override
  public int hashCode() {
    return Objects.hash(applicationIdentifier, permittableGroupIdentifier, userIdentifier);
  }

  @Override
  public String toString() {
    return "ApplicationPermissionUserEvent{" +
            "applicationIdentifier='" + applicationIdentifier + '\'' +
            ", permittableGroupIdentifier='" + permittableGroupIdentifier + '\'' +
            ", userIdentifier='" + userIdentifier + '\'' +
            '}';
  }
}
