package com.kamco.cd.kamcoback.config;

import com.zaxxer.hikari.HikariDataSource;
import javax.sql.DataSource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

@Slf4j
@Component
@RequiredArgsConstructor
public class StartupLogger {

  private final Environment environment;
  private final DataSource dataSource;

  @EventListener(ApplicationReadyEvent.class)
  public void logStartupInfo() {
    String[] activeProfiles = environment.getActiveProfiles();
    String profileInfo = activeProfiles.length > 0 ? String.join(", ", activeProfiles) : "default";

    // Database connection information
    String dbUrl = environment.getProperty("spring.datasource.url");
    String dbUsername = environment.getProperty("spring.datasource.username");
    String dbDriver = environment.getProperty("spring.datasource.driver-class-name");

    // HikariCP pool settings
    String poolInfo = "";
    if (dataSource instanceof HikariDataSource hikariDs) {
      poolInfo =
          String.format(
              """
            │  Pool Size        : min=%d, max=%d
            │  Connection Timeout: %dms
            │  Idle Timeout     : %dms
            │  Max Lifetime     : %dms""",
              hikariDs.getMinimumIdle(),
              hikariDs.getMaximumPoolSize(),
              hikariDs.getConnectionTimeout(),
              hikariDs.getIdleTimeout(),
              hikariDs.getMaxLifetime());
    }

    // JPA/Hibernate settings
    String showSql = environment.getProperty("spring.jpa.show-sql", "false");
    String ddlAuto = environment.getProperty("spring.jpa.hibernate.ddl-auto", "none");
    String batchSize =
        environment.getProperty("spring.jpa.properties.hibernate.jdbc.batch_size", "N/A");
    String batchFetchSize =
        environment.getProperty("spring.jpa.properties.hibernate.default_batch_fetch_size", "N/A");

    String startupMessage =
        String.format(
            """

          ╔════════════════════════════════════════════════════════════════════════════════╗
          ║                    🚀 APPLICATION STARTUP INFORMATION                          ║
          ╠════════════════════════════════════════════════════════════════════════════════╣
          ║  PROFILE CONFIGURATION                                                         ║
          ╠────────────────────────────────────────────────────────────────────────────────╣
          │  Active Profile(s): %s
          ╠════════════════════════════════════════════════════════════════════════════════╣
          ║  DATABASE CONFIGURATION                                                        ║
          ╠────────────────────────────────────────────────────────────────────────────────╣
          │  Database URL     : %s
          │  Username         : %s
          │  Driver           : %s
          ╠════════════════════════════════════════════════════════════════════════════════╣
          ║  HIKARICP CONNECTION POOL                                                      ║
          ╠────────────────────────────────────────────────────────────────────────────────╣
          %s
          ╠════════════════════════════════════════════════════════════════════════════════╣
          ║  JPA/HIBERNATE CONFIGURATION                                                   ║
          ╠────────────────────────────────────────────────────────────────────────────────╣
          │  Show SQL         : %s
          │  DDL Auto         : %s
          │  JDBC Batch Size  : %s
          │  Fetch Batch Size : %s
          ╚════════════════════════════════════════════════════════════════════════════════╝
          """,
            profileInfo,
            dbUrl != null ? dbUrl : "N/A",
            dbUsername != null ? dbUsername : "N/A",
            dbDriver != null ? dbDriver : "PostgreSQL JDBC Driver (auto-detected)",
            poolInfo,
            showSql,
            ddlAuto,
            batchSize,
            batchFetchSize);

    log.info(startupMessage);
  }
}
