/*
 * 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.jclouds.cloudsigma2.functions;

import java.math.BigInteger;
import java.net.URI;
import java.util.ArrayList;
import java.util.Map;

import org.jclouds.cloudsigma2.domain.DeviceEmulationType;
import org.jclouds.cloudsigma2.domain.Drive;
import org.jclouds.cloudsigma2.domain.IPConfiguration;
import org.jclouds.cloudsigma2.domain.IPConfigurationType;
import org.jclouds.cloudsigma2.domain.Model;
import org.jclouds.cloudsigma2.domain.NIC;
import org.jclouds.cloudsigma2.domain.Owner;
import org.jclouds.cloudsigma2.domain.ServerDrive;
import org.jclouds.cloudsigma2.domain.ServerInfo;
import org.jclouds.cloudsigma2.domain.ServerStatus;
import org.jclouds.cloudsigma2.domain.Tag;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.inject.Guice;

@Test(groups = "unit")
public class ServerInfoToJsonTest {

   private static final ServerInfoToJson SERVER_INFO_TO_JSON = Guice.createInjector().getInstance(ServerInfoToJson.class);

   private ServerInfo input;
   private JsonObject expected = new JsonObject();

   @BeforeMethod
   public void setUp() throws Exception {
      Owner owner = new Owner.Builder()
            .resourceUri(new URI("/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/"))
            .uuid("5b4a69a3-8e78-4c45-a8ba-8b13f0895e23")
            .build();

      Map<String, String> meta = Maps.newHashMap();
      meta.put("description", "A full server with description");

      input = new ServerInfo.Builder()
            .cpu(1000)
            .cpusInsteadOfCores(false)
            .drives(ImmutableList.of(
                  new ServerDrive.Builder()
                        .deviceChannel("0:0")
                        .deviceEmulationType(DeviceEmulationType.IDE)
                        .drive(new Drive.Builder()
                              .resourceUri(new URI("/api/2.0/drives/ae78e68c-9daa-4471-8878-0bb87fa80260/"))
                              .uuid("ae78e68c-9daa-4471-8878-0bb87fa80260")
                              .build())
                        .build()
                  , new ServerDrive.Builder()
                  .bootOrder(1)
                  .deviceChannel("0:0")
                  .deviceEmulationType(DeviceEmulationType.VIRTIO)
                  .drive(new Drive.Builder()
                        .resourceUri(new URI("/api/2.0/drives/22826af4-d6c8-4d39-bd41-9cea86df2976/"))
                        .uuid("22826af4-d6c8-4d39-bd41-9cea86df2976")
                        .build())
                  .build()
            ))
            .enableNuma(false)
            .hvRelaxed(false)
            .hvTsc(false)
            .memory(new BigInteger("268435456"))
            .meta(meta)
            .name("test_acc_full_server")
            .nics(ImmutableList.of(
                  new NIC.Builder()
                        .firewallPolicy(null)
                        .ipV4Configuration(new IPConfiguration(IPConfigurationType.DHCP, null))
                        .ipV6Configuration(null)
                        .mac("22:a7:a0:0d:43:48")
                        .model(Model.VIRTIO)
                        .runtime(null)
                        .vlan(null)
                        .build()
            ))
            .owner(owner)
            .requirements(new ArrayList<String>())
            .resourceUri(new URI("/api/2.0/servers/a19a425f-9e92-42f6-89fb-6361203071bb/"))
            .runtime(null)
            .smp(1)
            .status(ServerStatus.STOPPED)
            .tags(ImmutableList.of(new Tag.Builder().name("tag_uuid_1").build(), new Tag.Builder().name("tag_uuid_2").build()))
            .uuid("a19a425f-9e92-42f6-89fb-6361203071bb")
            .vncPassword("tester")
            .build();

      expected.addProperty("name", "test_acc_full_server");
      expected.addProperty("cpu", 1000);
      expected.addProperty("mem", "268435456");

      JsonObject metaObject = new JsonObject();
      metaObject.addProperty("description", "A full server with description");

      expected.add("meta", metaObject);
      expected.add("requirements", new JsonArray());

      JsonArray tagsArray = new JsonArray();
      JsonObject tagObject1 = new JsonObject();
      tagObject1.add("resources", new JsonArray());
      tagObject1.addProperty("name", "tag_uuid_1");
      JsonObject tagObject2 = new JsonObject();
      tagObject2.add("resources", new JsonArray());
      tagObject2.addProperty("name", "tag_uuid_2");
      tagsArray.add(tagObject1);
      tagsArray.add(tagObject2);
      expected.add("tags", tagsArray);

      expected.addProperty("vnc_password", "tester");

      JsonObject nicJson = new JsonObject();

      JsonObject ipv4ConfObject = new JsonObject();
      ipv4ConfObject.addProperty("conf", "dhcp");
      nicJson.add("ip_v4_conf", ipv4ConfObject);
      nicJson.addProperty("model", "virtio");
      nicJson.addProperty("mac", "22:a7:a0:0d:43:48");

      JsonArray nicsArray = new JsonArray();
      nicsArray.add(nicJson);

      expected.add("nics", nicsArray);

      JsonArray drivesArray = new JsonArray();
      JsonObject driveJson1 = new JsonObject();
      driveJson1.addProperty("boot_order", (Number) null);
      driveJson1.addProperty("dev_channel", "0:0");
      driveJson1.addProperty("device", "ide");
      driveJson1.addProperty("drive", "ae78e68c-9daa-4471-8878-0bb87fa80260");

      JsonObject driveJson2 = new JsonObject();
      driveJson2.addProperty("boot_order", 1);
      driveJson2.addProperty("dev_channel", "0:0");
      driveJson2.addProperty("device", "virtio");
      driveJson2.addProperty("drive", "22826af4-d6c8-4d39-bd41-9cea86df2976");

      drivesArray.add(driveJson1);
      drivesArray.add(driveJson2);

      expected.add("drives", drivesArray);
   }

   public void test() {
      Assert.assertEquals(SERVER_INFO_TO_JSON.apply(input), expected);
   }
}
