/*
 * Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 */

package io.airbyte.integrations.destination.kinesis;

import com.fasterxml.jackson.databind.JsonNode;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Objects;

/*
 * KinesisConfig class for storing immutable configuration for Kinesis.
 */
public class KinesisConfig {

  private final URI endpoint;

  private final String region;

  private final int shardCount;

  private final String accessKey;

  private final String privateKey;

  private final int bufferSize;

  public KinesisConfig(URI endpoint,
                       String region,
                       int shardCount,
                       String accessKey,
                       String privateKey,
                       int bufferSize) {
    this.endpoint = endpoint;
    this.region = region;
    this.shardCount = shardCount;
    this.accessKey = accessKey;
    this.privateKey = privateKey;
    this.bufferSize = bufferSize;
  }

  public KinesisConfig(JsonNode jsonNode) {
    String strend = jsonNode.get("endpoint").asText();
    try {
      this.endpoint = strend != null && !strend.isBlank() ? new URI(strend) : null;
    } catch (URISyntaxException e) {
      throw new UncheckedURISyntaxException(e);
    }
    this.region = jsonNode.get("region").asText();
    this.shardCount = jsonNode.get("shardCount").asInt(5);
    this.accessKey = jsonNode.get("accessKey").asText();
    this.privateKey = jsonNode.get("privateKey").asText();
    this.bufferSize = jsonNode.get("bufferSize").asInt(100);
  }

  public URI getEndpoint() {
    return endpoint;
  }

  public String getRegion() {
    return region;
  }

  public int getShardCount() {
    return shardCount;
  }

  public String getAccessKey() {
    return accessKey;
  }

  public String getPrivateKey() {
    return privateKey;
  }

  public int getBufferSize() {
    return bufferSize;
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    KinesisConfig that = (KinesisConfig) o;
    return Objects.equals(endpoint, that.endpoint) && Objects.equals(region, that.region) &&
        accessKey.equals(that.accessKey) && privateKey.equals(that.privateKey);
  }

  @Override
  public int hashCode() {
    return Objects.hash(endpoint, region, accessKey, privateKey);
  }

  static class UncheckedURISyntaxException extends RuntimeException {

    public UncheckedURISyntaxException(Throwable cause) {
      super(cause);
    }

  }

}
