/*
 * 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.beam.sdk.io.aws.sns;

import com.amazonaws.AmazonWebServiceRequest;
import com.amazonaws.ResponseMetadata;
import com.amazonaws.http.SdkHttpMetadata;
import com.amazonaws.regions.Region;
import com.amazonaws.services.sns.AmazonSNS;
import com.amazonaws.services.sns.model.AddPermissionRequest;
import com.amazonaws.services.sns.model.AddPermissionResult;
import com.amazonaws.services.sns.model.CheckIfPhoneNumberIsOptedOutRequest;
import com.amazonaws.services.sns.model.CheckIfPhoneNumberIsOptedOutResult;
import com.amazonaws.services.sns.model.ConfirmSubscriptionRequest;
import com.amazonaws.services.sns.model.ConfirmSubscriptionResult;
import com.amazonaws.services.sns.model.CreatePlatformApplicationRequest;
import com.amazonaws.services.sns.model.CreatePlatformApplicationResult;
import com.amazonaws.services.sns.model.CreatePlatformEndpointRequest;
import com.amazonaws.services.sns.model.CreatePlatformEndpointResult;
import com.amazonaws.services.sns.model.CreateTopicRequest;
import com.amazonaws.services.sns.model.CreateTopicResult;
import com.amazonaws.services.sns.model.DeleteEndpointRequest;
import com.amazonaws.services.sns.model.DeleteEndpointResult;
import com.amazonaws.services.sns.model.DeletePlatformApplicationRequest;
import com.amazonaws.services.sns.model.DeletePlatformApplicationResult;
import com.amazonaws.services.sns.model.DeleteTopicRequest;
import com.amazonaws.services.sns.model.DeleteTopicResult;
import com.amazonaws.services.sns.model.GetEndpointAttributesRequest;
import com.amazonaws.services.sns.model.GetEndpointAttributesResult;
import com.amazonaws.services.sns.model.GetPlatformApplicationAttributesRequest;
import com.amazonaws.services.sns.model.GetPlatformApplicationAttributesResult;
import com.amazonaws.services.sns.model.GetSMSAttributesRequest;
import com.amazonaws.services.sns.model.GetSMSAttributesResult;
import com.amazonaws.services.sns.model.GetSubscriptionAttributesRequest;
import com.amazonaws.services.sns.model.GetSubscriptionAttributesResult;
import com.amazonaws.services.sns.model.GetTopicAttributesRequest;
import com.amazonaws.services.sns.model.GetTopicAttributesResult;
import com.amazonaws.services.sns.model.ListEndpointsByPlatformApplicationRequest;
import com.amazonaws.services.sns.model.ListEndpointsByPlatformApplicationResult;
import com.amazonaws.services.sns.model.ListPhoneNumbersOptedOutRequest;
import com.amazonaws.services.sns.model.ListPhoneNumbersOptedOutResult;
import com.amazonaws.services.sns.model.ListPlatformApplicationsRequest;
import com.amazonaws.services.sns.model.ListPlatformApplicationsResult;
import com.amazonaws.services.sns.model.ListSubscriptionsByTopicRequest;
import com.amazonaws.services.sns.model.ListSubscriptionsByTopicResult;
import com.amazonaws.services.sns.model.ListSubscriptionsRequest;
import com.amazonaws.services.sns.model.ListSubscriptionsResult;
import com.amazonaws.services.sns.model.ListTopicsRequest;
import com.amazonaws.services.sns.model.ListTopicsResult;
import com.amazonaws.services.sns.model.OptInPhoneNumberRequest;
import com.amazonaws.services.sns.model.OptInPhoneNumberResult;
import com.amazonaws.services.sns.model.PublishResult;
import com.amazonaws.services.sns.model.RemovePermissionRequest;
import com.amazonaws.services.sns.model.RemovePermissionResult;
import com.amazonaws.services.sns.model.SetEndpointAttributesRequest;
import com.amazonaws.services.sns.model.SetEndpointAttributesResult;
import com.amazonaws.services.sns.model.SetPlatformApplicationAttributesRequest;
import com.amazonaws.services.sns.model.SetPlatformApplicationAttributesResult;
import com.amazonaws.services.sns.model.SetSMSAttributesRequest;
import com.amazonaws.services.sns.model.SetSMSAttributesResult;
import com.amazonaws.services.sns.model.SetSubscriptionAttributesRequest;
import com.amazonaws.services.sns.model.SetSubscriptionAttributesResult;
import com.amazonaws.services.sns.model.SetTopicAttributesRequest;
import com.amazonaws.services.sns.model.SetTopicAttributesResult;
import com.amazonaws.services.sns.model.SubscribeRequest;
import com.amazonaws.services.sns.model.SubscribeResult;
import com.amazonaws.services.sns.model.UnsubscribeRequest;
import com.amazonaws.services.sns.model.UnsubscribeResult;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import org.mockito.Mockito;

/** Mock class to test amazon sns service. */
public abstract class AmazonSNSMock implements AmazonSNS, Serializable {

  public AmazonSNSMock() {}

  @Override
  public void setEndpoint(String endpoint) {}

  @Override
  public void setRegion(Region region) {}

  @Override
  public AddPermissionResult addPermission(AddPermissionRequest addPermissionRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public AddPermissionResult addPermission(
      String topicArn, String label, List<String> aWSAccountIds, List<String> actionNames) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public CheckIfPhoneNumberIsOptedOutResult checkIfPhoneNumberIsOptedOut(
      CheckIfPhoneNumberIsOptedOutRequest checkIfPhoneNumberIsOptedOutRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public ConfirmSubscriptionResult confirmSubscription(
      ConfirmSubscriptionRequest confirmSubscriptionRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public ConfirmSubscriptionResult confirmSubscription(
      String topicArn, String token, String authenticateOnUnsubscribe) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public ConfirmSubscriptionResult confirmSubscription(String topicArn, String token) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public CreatePlatformApplicationResult createPlatformApplication(
      CreatePlatformApplicationRequest createPlatformApplicationRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public CreatePlatformEndpointResult createPlatformEndpoint(
      CreatePlatformEndpointRequest createPlatformEndpointRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public CreateTopicResult createTopic(CreateTopicRequest createTopicRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public CreateTopicResult createTopic(String name) {
    return new CreateTopicResult().withTopicArn(name);
  }

  @Override
  public DeleteEndpointResult deleteEndpoint(DeleteEndpointRequest deleteEndpointRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public DeletePlatformApplicationResult deletePlatformApplication(
      DeletePlatformApplicationRequest deletePlatformApplicationRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public DeleteTopicResult deleteTopic(DeleteTopicRequest deleteTopicRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public DeleteTopicResult deleteTopic(String topicArn) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public GetEndpointAttributesResult getEndpointAttributes(
      GetEndpointAttributesRequest getEndpointAttributesRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public GetPlatformApplicationAttributesResult getPlatformApplicationAttributes(
      GetPlatformApplicationAttributesRequest getPlatformApplicationAttributesRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public GetSMSAttributesResult getSMSAttributes(GetSMSAttributesRequest getSMSAttributesRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public GetSubscriptionAttributesResult getSubscriptionAttributes(
      GetSubscriptionAttributesRequest getSubscriptionAttributesRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public GetSubscriptionAttributesResult getSubscriptionAttributes(String subscriptionArn) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public GetTopicAttributesResult getTopicAttributes(
      GetTopicAttributesRequest getTopicAttributesRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public GetTopicAttributesResult getTopicAttributes(String topicArn) {
    GetTopicAttributesResult result = Mockito.mock(GetTopicAttributesResult.class);
    SdkHttpMetadata metadata = Mockito.mock(SdkHttpMetadata.class);
    Mockito.when(metadata.getHttpHeaders()).thenReturn(new HashMap<>());
    Mockito.when(metadata.getHttpStatusCode()).thenReturn(200);
    Mockito.when(result.getSdkHttpMetadata()).thenReturn(metadata);
    return result;
  }

  @Override
  public ListEndpointsByPlatformApplicationResult listEndpointsByPlatformApplication(
      ListEndpointsByPlatformApplicationRequest listEndpointsByPlatformApplicationRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public ListPhoneNumbersOptedOutResult listPhoneNumbersOptedOut(
      ListPhoneNumbersOptedOutRequest listPhoneNumbersOptedOutRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public ListPlatformApplicationsResult listPlatformApplications(
      ListPlatformApplicationsRequest listPlatformApplicationsRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public ListPlatformApplicationsResult listPlatformApplications() {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public ListSubscriptionsResult listSubscriptions(
      ListSubscriptionsRequest listSubscriptionsRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public ListSubscriptionsResult listSubscriptions() {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public ListSubscriptionsResult listSubscriptions(String nextToken) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public ListSubscriptionsByTopicResult listSubscriptionsByTopic(
      ListSubscriptionsByTopicRequest listSubscriptionsByTopicRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public ListSubscriptionsByTopicResult listSubscriptionsByTopic(String topicArn) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public ListSubscriptionsByTopicResult listSubscriptionsByTopic(
      String topicArn, String nextToken) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public ListTopicsResult listTopics(ListTopicsRequest listTopicsRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public ListTopicsResult listTopics() {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public ListTopicsResult listTopics(String nextToken) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public OptInPhoneNumberResult optInPhoneNumber(OptInPhoneNumberRequest optInPhoneNumberRequest) {
    return null;
  }

  @Override
  public PublishResult publish(String topicArn, String message) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public PublishResult publish(String topicArn, String message, String subject) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public RemovePermissionResult removePermission(RemovePermissionRequest removePermissionRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public RemovePermissionResult removePermission(String topicArn, String label) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public SetEndpointAttributesResult setEndpointAttributes(
      SetEndpointAttributesRequest setEndpointAttributesRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public SetPlatformApplicationAttributesResult setPlatformApplicationAttributes(
      SetPlatformApplicationAttributesRequest setPlatformApplicationAttributesRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public SetSMSAttributesResult setSMSAttributes(SetSMSAttributesRequest setSMSAttributesRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public SetSubscriptionAttributesResult setSubscriptionAttributes(
      SetSubscriptionAttributesRequest setSubscriptionAttributesRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public SetSubscriptionAttributesResult setSubscriptionAttributes(
      String subscriptionArn, String attributeName, String attributeValue) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public SetTopicAttributesResult setTopicAttributes(
      SetTopicAttributesRequest setTopicAttributesRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public SetTopicAttributesResult setTopicAttributes(
      String topicArn, String attributeName, String attributeValue) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public SubscribeResult subscribe(SubscribeRequest subscribeRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public SubscribeResult subscribe(String topicArn, String protocol, String endpoint) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public UnsubscribeResult unsubscribe(UnsubscribeRequest unsubscribeRequest) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public UnsubscribeResult unsubscribe(String subscriptionArn) {
    throw new RuntimeException("Not implemented");
  }

  @Override
  public void shutdown() {}

  @Override
  public ResponseMetadata getCachedResponseMetadata(AmazonWebServiceRequest request) {
    throw new RuntimeException("Not implemented");
  }
}
