/*
 * 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.jclouds.oneandone.rest.compute.function;

import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.name.Names;
import okhttp3.mockwebserver.MockResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.jclouds.oneandone.rest.OneAndOneApi;
import org.apache.jclouds.oneandone.rest.OneAndOneApiMetadata;
import org.apache.jclouds.oneandone.rest.domain.DataCenter;
import org.apache.jclouds.oneandone.rest.domain.HardwareFlavour;
import org.apache.jclouds.oneandone.rest.domain.Server;
import org.apache.jclouds.oneandone.rest.domain.ServerAppliance;
import org.apache.jclouds.oneandone.rest.domain.Types;
import org.apache.jclouds.oneandone.rest.domain.options.GenericQueryOptions;
import org.apache.jclouds.oneandone.rest.features.DataCenterApi;
import org.apache.jclouds.oneandone.rest.features.ServerApi;
import org.apache.jclouds.oneandone.rest.features.ServerApplianceApi;
import org.apache.jclouds.oneandone.rest.internal.BaseOneAndOneApiMockTest;
import org.easymock.EasyMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import org.jclouds.compute.domain.Hardware;
import org.jclouds.compute.domain.HardwareBuilder;
import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.ImageBuilder;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.NodeMetadataBuilder;
import org.jclouds.compute.domain.OperatingSystem;
import org.jclouds.compute.domain.OsFamily;
import org.jclouds.compute.domain.Processor;
import org.jclouds.compute.domain.Volume;
import org.jclouds.compute.domain.VolumeBuilder;
import org.jclouds.compute.functions.GroupNamingConvention;
import org.jclouds.domain.Location;
import org.jclouds.domain.LocationBuilder;
import org.jclouds.domain.LocationScope;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

@Test(groups = "unit", testName = "ServerToNodeMetadataTest", singleThreaded = true)
public class ServerToNodeMetadataTest extends BaseOneAndOneApiMockTest {

   private ServerToNodeMetadata fnNodeMetadata;
   private DataCenterApi dataCenterApi;
   private ServerApplianceApi serverApplianceApi;
   private ServerApi serverApi;

   @BeforeTest
   public void setup() {
      Supplier<Set<? extends Location>> locationsSupply = new Supplier<Set<? extends Location>>() {

         @Override
         public Set<? extends Location> get() {
            return ImmutableSet.of(
                    new LocationBuilder()
                    .id("908DC2072407C94C8054610AD5A53B8C")
                    .description("us")
                    .scope(LocationScope.REGION)
                    .metadata(ImmutableMap.<String, Object>of(
                            "version", "10",
                            "state", "AVAILABLE"))
                    .parent(new LocationBuilder()
                            .id("de")
                            .description("Germany")
                            .scope(LocationScope.PROVIDER)
                            .build())
                    .build());
         }
      };
      Supplier<Map<String, ? extends Hardware>> hardwareFlavours = Suppliers.<Map<String, ? extends Hardware>>ofInstance(ImmutableMap
              .<String, Hardware>of("65929629F35BBFBA63022008F773F3EB", new HardwareBuilder().id("65929629F35BBFBA63022008F773F3EB").build()));

      Supplier<Map<String, ? extends Image>> images = Suppliers.<Map<String, ? extends Image>>ofInstance(ImmutableMap
              .<String, Image>of("B5F778B85C041347BCDCFC3172AB3F3C", new ImageBuilder().id("B5F778B85C041347BCDCFC3172AB3F3C")
                      .operatingSystem(OperatingSystem.builder().description("").is64Bit(true).build()).status(Image.Status.AVAILABLE).build()));

      GroupNamingConvention.Factory namingConvention = Guice.createInjector(new AbstractModule() {
         @Override
         protected void configure() {
            Names.bindProperties(binder(), new OneAndOneApiMetadata().getDefaultProperties());
         }
      }).getInstance(GroupNamingConvention.Factory.class);

      api = EasyMock.createMock(OneAndOneApi.class);
      dataCenterApi = EasyMock.createMock(DataCenterApi.class);
      serverApi = EasyMock.createMock(ServerApi.class);
      serverApplianceApi = EasyMock.createMock(ServerApplianceApi.class);

      expect(dataCenterApi.get("908DC2072407C94C8054610AD5A53B8C")).andReturn(
              DataCenter.create("908DC2072407C94C8054610AD5A53B8C", "usa", "US"));
      GenericQueryOptions options = new GenericQueryOptions();
      options.options(0, 0, null, "B5F778B85C041347BCDCFC3172AB3F3C", null);
      List<ServerAppliance> appliances = new ArrayList<ServerAppliance>();
      ServerAppliance appliance = ServerAppliance.create("B5F778B85C041347BCDCFC3172AB3F3C", "name", null, "empty", Types.OSFamliyType.Linux, "ubuntu",
              "Ubuntu14.04", 64, Types.OSImageType.Minimal, 20, Types.ApplianceType.IMAGE, null, null, null, null);
      appliances.add(appliance);
      List<HardwareFlavour.Hardware.Hdd> hdds = new ArrayList<HardwareFlavour.Hardware.Hdd>();
      HardwareFlavour.Hardware.Hdd hdd = HardwareFlavour.Hardware.Hdd.create("GB", 30, true);
      hdds.add(hdd);
      expect(serverApi.getHardwareFlavour("3D4C49EAEDD42FBC23DB58FE3DEF464F")).andReturn(
              HardwareFlavour.create("3D4C49EAEDD42FBC23DB58FE3DEF464F", "mock",
                      HardwareFlavour.Hardware.create("3D4C49EAEDD42FBC23DB58FE3DEF464F", 1, 1, 0.5, hdds)));

      expect(serverApplianceApi.list(options)).andReturn(appliances);

      expect(api.dataCenterApi()).andReturn(dataCenterApi);
      expect(api.serverApi()).andReturn(serverApi);
      expect(api.serverApplianceApi()).andReturn(serverApplianceApi);

      replay(serverApplianceApi, dataCenterApi, serverApi, api);

      this.fnNodeMetadata = new ServerToNodeMetadata(new HddToVolume(), locationsSupply, hardwareFlavours, images, api, namingConvention);
   }

   @Test
   public void testServerToNodeMetadata() {

      server.enqueue(
              new MockResponse().setBody(stringFromResource("/compute/server.json"))
      );
      Server serverObject = api.serverApi().get("mock");

      NodeMetadata expected = fnNodeMetadata.apply(serverObject);
      assertNotNull(expected);

      NodeMetadata actual = new NodeMetadataBuilder()
              .group("docker001")
              .ids(serverObject.id())
              .name(serverObject.name())
              .backendStatus("AVAILABLE")
              .status(NodeMetadata.Status.RUNNING)
              .hardware(new HardwareBuilder()
                      .ids("cpu=4,ram=4096,disk=40")
                      .name("cpu=4,ram=4096,disk=40")
                      .ram((int) serverObject.hardware().ram())
                      .processor(new Processor(serverObject.hardware().coresPerProcessor(), 1d))
                      .hypervisor("kvm")
                      .volume(new VolumeBuilder()
                              .bootDevice(true)
                              .size(40f)
                              .id("c04a2198-7e60-4bc0-b869-6e9c9dbcb8e1")
                              .durable(true)
                              .type(Volume.Type.LOCAL)
                              .build())
                      .build())
              .operatingSystem(new OperatingSystem.Builder()
                      .description(OsFamily.LINUX.value())
                      .family(OsFamily.LINUX)
                      .build())
              .location(new LocationBuilder()
                      .id("908DC2072407C94C8054610AD5A53B8C")
                      .description("us")
                      .scope(LocationScope.REGION)
                      .metadata(ImmutableMap.<String, Object>of(
                              "version", "10",
                              "state", "AVAILABLE"))
                      .parent(new LocationBuilder()
                              .id("de")
                              .description("Germany")
                              .scope(LocationScope.PROVIDER)
                              .build())
                      .build())
              .publicAddresses(ImmutableList.<String>of("173.252.120.6"))
              .build();

      assertEquals(actual, expected);
   }
}
