/*
 * Copyright 2016 Google LLC
 *
 * Licensed 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 com.google.cloud.dns;

import com.google.cloud.BaseSerializationTest;
import com.google.cloud.NoCredentials;
import com.google.cloud.Restorable;
import com.google.cloud.ServiceOptions;
import com.google.common.collect.ImmutableList;

import java.io.Serializable;
import java.math.BigInteger;
import java.util.concurrent.TimeUnit;

public class SerializationTest extends BaseSerializationTest {

  private static final ZoneInfo FULL_ZONE_INFO = Zone.of("some zone name", "www.example.com",
      "some descriptions").toBuilder()
      .setCreationTimeMillis(132L)
      .setGeneratedId("123333")
      .setNameServers(ImmutableList.of("server 1", "server 2"))
      .setNameServerSet("specificationstring")
      .build();
  private static final ZoneInfo PARTIAL_ZONE_INFO = Zone.of("some zone name", "www.example.com",
      "some descriptions").toBuilder().build();
  private static final ProjectInfo PARTIAL_PROJECT_INFO =
      ProjectInfo.newBuilder().setId("13").build();
  private static final ProjectInfo FULL_PROJECT_INFO = ProjectInfo.newBuilder()
      .setId("342")
      .setNumber(new BigInteger("2343245"))
      .setQuota(new ProjectInfo.Quota(12, 13, 14, 15, 16, 17))
      .build();
  private static final Dns.ZoneListOption ZONE_LIST_OPTION =
      Dns.ZoneListOption.dnsName("www.example.com.");
  private static final Dns.RecordSetListOption RECORD_SET_LIST_OPTION =
      Dns.RecordSetListOption.fields(Dns.RecordSetField.TTL);
  private static final Dns.ChangeRequestListOption CHANGE_REQUEST_LIST_OPTION =
      Dns.ChangeRequestListOption.fields(Dns.ChangeRequestField.STATUS);
  private static final Dns.ZoneOption ZONE_OPTION =
      Dns.ZoneOption.fields(Dns.ZoneField.CREATION_TIME);
  private static final Dns.ChangeRequestOption CHANGE_REQUEST_OPTION =
      Dns.ChangeRequestOption.fields(Dns.ChangeRequestField.STATUS);
  private static final Dns.ProjectOption PROJECT_OPTION =
      Dns.ProjectOption.fields(Dns.ProjectField.QUOTA);
  private static final DnsOptions OPTIONS = DnsOptions.newBuilder()
      .setProjectId("some-unnecessary-project-ID")
      .setRetrySettings(ServiceOptions.getDefaultRetrySettings())
      .build();
  private static final Dns DNS = OPTIONS.getService();
  private static final Zone FULL_ZONE = new Zone(DNS, new ZoneInfo.BuilderImpl(FULL_ZONE_INFO));
  private static final Zone PARTIAL_ZONE =
      new Zone(DNS, new ZoneInfo.BuilderImpl(PARTIAL_ZONE_INFO));
  private static final ChangeRequestInfo CHANGE_REQUEST_INFO_PARTIAL =
      ChangeRequest.newBuilder().build();
  private static final ChangeRequest CHANGE_REQUEST_PARTIAL = new ChangeRequest(DNS, "name",
      new ChangeRequestInfo.BuilderImpl(CHANGE_REQUEST_INFO_PARTIAL));
  private static final RecordSet RECORD_SET_PARTIAL =
      RecordSet.newBuilder("www.www.com", RecordSet.Type.AAAA).build();
  private static final RecordSet RECORD_SET_COMPLETE =
      RecordSet.newBuilder("www.sadfa.com", RecordSet.Type.A)
          .setTtl(12, TimeUnit.HOURS)
          .addRecord("record")
          .build();
  private static final ChangeRequestInfo CHANGE_REQUEST_INFO_COMPLETE =
      ChangeRequestInfo.newBuilder()
          .add(RECORD_SET_COMPLETE)
          .delete(RECORD_SET_PARTIAL)
          .setStatus(ChangeRequest.Status.PENDING)
          .setGeneratedId("some id")
          .setStartTime(132L)
          .build();
  private static final ChangeRequest CHANGE_REQUEST_COMPLETE = new ChangeRequest(DNS, "name",
      new ChangeRequestInfo.BuilderImpl(CHANGE_REQUEST_INFO_COMPLETE));

  @Override
  protected Serializable[] serializableObjects() {
    DnsOptions options = DnsOptions.newBuilder()
        .setCredentials(NoCredentials.getInstance())
        .setProjectId("id1")
        .build();
    DnsOptions otherOptions = options.toBuilder().build();
    return new Serializable[]{FULL_ZONE_INFO, PARTIAL_ZONE_INFO, ZONE_LIST_OPTION,
        RECORD_SET_LIST_OPTION, CHANGE_REQUEST_LIST_OPTION, ZONE_OPTION, CHANGE_REQUEST_OPTION,
        PROJECT_OPTION, PARTIAL_PROJECT_INFO, FULL_PROJECT_INFO, OPTIONS, FULL_ZONE, PARTIAL_ZONE,
        OPTIONS, CHANGE_REQUEST_INFO_PARTIAL, CHANGE_REQUEST_PARTIAL, RECORD_SET_PARTIAL,
        RECORD_SET_COMPLETE, CHANGE_REQUEST_INFO_COMPLETE, CHANGE_REQUEST_COMPLETE, options,
        otherOptions};
  }

  @Override
  protected Restorable<?>[] restorableObjects() {
    return new Restorable<?>[0];
  }
}
