/*
 * Copyright 2000-2020 JetBrains s.r.o.
 *
 * 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 jetbrains.buildServer.clouds.vmware;

import com.intellij.util.WaitFor;
import java.io.File;
import java.util.*;
import jetbrains.buildServer.BaseTestCase;
import jetbrains.buildServer.clouds.CloudClientParameters;
import jetbrains.buildServer.clouds.CloudImageParameters;
import jetbrains.buildServer.clouds.CloudInstanceUserData;
import jetbrains.buildServer.clouds.InstanceStatus;
import jetbrains.buildServer.clouds.base.connector.CloudAsyncTaskExecutor;
import jetbrains.buildServer.clouds.base.types.CloneBehaviour;
import jetbrains.buildServer.clouds.server.impl.profile.CloudClientParametersImpl;
import jetbrains.buildServer.clouds.server.impl.profile.CloudImageDataImpl;
import jetbrains.buildServer.clouds.server.impl.profile.CloudImageParametersImpl;
import jetbrains.buildServer.clouds.vmware.connector.VMWareApiConnector;
import jetbrains.buildServer.clouds.vmware.stubs.FakeApiConnector;
import jetbrains.buildServer.clouds.vmware.stubs.FakeDatacenter;
import jetbrains.buildServer.clouds.vmware.stubs.FakeModel;
import jetbrains.buildServer.clouds.vmware.stubs.FakeVirtualMachine;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import static jetbrains.buildServer.clouds.vmware.VmwareCloudIntegrationTest.PROFILE_ID;
import static jetbrains.buildServer.clouds.vmware.VmwareCloudIntegrationTest.TEST_SERVER_UUID;

/**
 * @author Sergey.Pak
 *         Date: 5/19/2014
 *         Time: 4:25 PM
 */
@Test
public class VmwareCloudInstanceTest extends BaseTestCase {

  private CloudAsyncTaskExecutor myStatusTask;
  private VMWareApiConnector myApiConnector;
  private VmwareCloudImage myImage;
  private VmwareCloudImageDetails myImageDetails;
  private File myIdxStorage;

  @BeforeMethod
  public void setUp() throws Exception {
    super.setUp();
    myStatusTask = new CloudAsyncTaskExecutor("Test-vmware");
    myApiConnector = new FakeApiConnector(TEST_SERVER_UUID, PROFILE_ID);
    myIdxStorage = createTempDir();
    final Map<String, String> imgParams = new HashMap<>();
    imgParams.put("nickname", "imageNickname");
    imgParams.put("sourceVmName", "mySource");
    imgParams.put("snapshot", "mySourceSnapshot");
    imgParams.put("folder", "myFolder");
    imgParams.put("pool", "myPool");
    imgParams.put("behaviour", CloneBehaviour.FRESH_CLONE.toString());
    imgParams.put("maxInstances", "5");
    CloudImageParameters imageParameters = new CloudImageParametersImpl(new CloudImageDataImpl(imgParams), VmwareCloudIntegrationTest.PROJECT_ID, UUID.randomUUID().toString());
    myImageDetails = new VmwareCloudImageDetails(imageParameters);

    final CloudClientParameters clientParameters = new CloudClientParametersImpl(createMap(), createSet(imageParameters));

    final FakeDatacenter dc2 = FakeModel.instance().addDatacenter("dc2");
    FakeModel.instance().addFolder("myFolder").setParent(dc2);
    FakeModel.instance().addVM("mySource").setParentFolder("myFolder");
    FakeModel.instance().addVMSnapshot("mySource", "mySourceSnapshot");
    FakeModel.instance().addResourcePool("myPool");
    myImage = new VmwareCloudImage(myApiConnector,
                                   myImageDetails,
                                   myStatusTask,
                                   myIdxStorage,
                                   VmwareTestUtils.createProfileFromProps(clientParameters));
  }


  public void do_not_make_instance_start_date_earlier(){
    final CloudInstanceUserData data = new CloudInstanceUserData("aaa", "bbbb", "localhost", 10000l, "profileDescr", Collections.<String, String>emptyMap());

    final VmwareCloudInstance instance = myImage.startNewInstance(data);

    new WaitFor(5 * 1000){

      @Override
      protected boolean condition() {
        return instance.getStatus() == InstanceStatus.RUNNING;
      }
    };

    FakeVirtualMachine fakeVM = FakeModel.instance().getVirtualMachine(instance.getName());
    final Calendar calendarInstance = Calendar.getInstance();
    calendarInstance.set(2001, 1, 1);
    fakeVM.setBootTime(calendarInstance);
    calendarInstance.set(2001, 1, 1);
    final Calendar instance2 = Calendar.getInstance();
    instance2.set(2002, 1, 1);
    assertTrue(instance.getStartedTime().after(instance2.getTime()));
  }



  @AfterMethod
  public void tearDown() throws Exception {
    super.tearDown();
  }
}