/*
 * 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.domain;

import org.hibernate.validator.constraints.NotBlank;

import javax.annotation.Nullable;
import java.util.Objects;

/**
 * @author Myrle Krantz
 */
@SuppressWarnings("unused")
public class Authentication {
  @NotBlank
  private String tokenType;

  @NotBlank
  private String accessToken;

  @NotBlank
  private String accessTokenExpiration;

  @NotBlank
  private String refreshTokenExpiration;

  /**
   * If password expiration is in the past, then the tokens provided only allow the user to change his/her password.
   * If password expiration is null then password will never expire.
   */
  @Nullable
  private String passwordExpiration;

  public Authentication()
  {
  }

  public Authentication(
      final String accessToken,
      final String accessTokenExpiration,
      final String refreshTokenExpiration,
      final String passwordExpiration) {
    this.tokenType = "bearer";
    this.accessToken = accessToken;
    this.accessTokenExpiration = accessTokenExpiration;
    this.refreshTokenExpiration = refreshTokenExpiration;
    this.passwordExpiration = passwordExpiration;
  }

  public String getTokenType() {
    return tokenType;
  }

  public void setTokenType(String tokenType) {
    this.tokenType = tokenType;
  }

  public String getAccessToken() {
    return accessToken;
  }

  public void setAccessToken(String accessToken) {
    this.accessToken = accessToken;
  }

  public String getAccessTokenExpiration() {
    return accessTokenExpiration;
  }

  public void setAccessTokenExpiration(String accessTokenExpiration) {
    this.accessTokenExpiration = accessTokenExpiration;
  }

  public String getRefreshTokenExpiration() {
    return refreshTokenExpiration;
  }

  public void setRefreshTokenExpiration(String refreshTokenExpiration) {
    this.refreshTokenExpiration = refreshTokenExpiration;
  }

  public String getPasswordExpiration() {
    return passwordExpiration;
  }

  public void setPasswordExpiration(String passwordExpiration) {
    this.passwordExpiration = passwordExpiration;
  }

  @Override public boolean equals(Object o) {
    if (this == o)
      return true;
    if (!(o instanceof Authentication))
      return false;
    Authentication that = (Authentication) o;
    return Objects.equals(tokenType, that.tokenType) &&
        Objects.equals(accessToken, that.accessToken) &&
        Objects.equals(accessTokenExpiration, that.accessTokenExpiration) &&
        Objects.equals(refreshTokenExpiration, that.refreshTokenExpiration) &&
        Objects.equals(passwordExpiration, that.passwordExpiration);
  }

  @Override public int hashCode() {
    return Objects
        .hash(tokenType, accessToken, accessTokenExpiration, refreshTokenExpiration,
            passwordExpiration);
  }

  @Override public String toString() {
    return "Authentication{" +
        "tokenType='" + tokenType + '\'' +
        ", accessToken='" + accessToken + '\'' +
        ", accessTokenExpiration='" + accessTokenExpiration + '\'' +
        ", refreshTokenExpiration='" + refreshTokenExpiration + '\'' +
        ", passwordExpiration='" + passwordExpiration + '\'' +
        '}';
  }
}
