/*
 * Copyright (c) 2022 Airbyte, Inc., all rights reserved.
 */

package io.airbyte.config.helpers;

import static org.junit.jupiter.api.Assertions.assertEquals;

import com.google.cloud.storage.Storage;
import io.airbyte.config.EnvConfigs;
import io.airbyte.config.storage.CloudStorageConfigs;
import io.airbyte.config.storage.DefaultGcsClientFactory;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

@Slf4j
@Tag("logger-client")
class GcsLogsTest {

  private static Storage getClientFactory() {
    return new DefaultGcsClientFactory(new CloudStorageConfigs.GcsConfig(
        System.getenv(LogClientSingleton.GCS_LOG_BUCKET),
        System.getenv(LogClientSingleton.GOOGLE_APPLICATION_CREDENTIALS))).get();
  }

  /**
   * The test files here were generated by {@link S3LogsTest}. See that class for more information.
   *
   * Generate enough files to force pagination and confirm all data is read.
   */
  @Test
  void testRetrieveAllLogs() throws IOException {
    final File data;
    data = GcsLogs.getFile(getClientFactory(), (new EnvConfigs()).getLogConfigs(), "paginate", 6);
    final var retrieved = new ArrayList<String>();
    Files.lines(data.toPath()).forEach(retrieved::add);

    final var expected = List.of("Line 0", "Line 1", "Line 2", "Line 3", "Line 4", "Line 5", "Line 6", "Line 7", "Line 8");

    assertEquals(expected, retrieved);

  }

  /**
   * The test files for this test have been pre-generated and uploaded into the bucket folder. The
   * folder contains the following files with these contents:
   * <li>first-file.txt - Line 1, Line 2, Line 3</li>
   * <li>second-file.txt - Line 4, Line 5, Line 6</li>
   * <li>third-file.txt - Line 7, Line 8, Line 9</li>
   */
  @Test
  void testTail() throws IOException {
    final var data = new GcsLogs(GcsLogsTest::getClientFactory).tailCloudLog((new EnvConfigs()).getLogConfigs(), "tail", 6);

    final var expected = List.of("Line 4", "Line 5", "Line 6", "Line 7", "Line 8", "Line 9");
    assertEquals(data, expected);
  }

}
