import { logError, logInfo } from "@/lib/logger";
import { Kysely, MssqlDialect } from "kysely";
import * as tarn from "tarn";
import * as tedious from "tedious";
import type { ViewpointDB } from "./types";

export interface ViewpointDBConfig {
  host: string;
  port: number;
  database: string;
  user: string;
  password: string;
  maxConnections: number;
  idleTimeout: number;
  connectionTimeout: number;
  requestTimeout: number;
  trustServerCertificate: boolean;
}

export const createViewpointDBPool = (config: ViewpointDBConfig) => {
  const dialect = new MssqlDialect({
    tarn: {
      ...tarn,
      options: {
        min: 0,
        max: config.maxConnections,
        idleTimeoutMillis: config.idleTimeout,
      },
    },
    tedious: {
      ...tedious,
      connectionFactory: () =>
        new tedious.Connection({
          server: config.host,
          authentication: {
            type: "default",
            options: {
              userName: config.user,
              password: config.password,
            },
          },
          options: {
            port: config.port,
            database: config.database,
            encrypt: true,
            trustServerCertificate: config.trustServerCertificate,
            connectTimeout: config.connectionTimeout,
            requestTimeout: config.requestTimeout,
            useUTC: true,
            rowCollectionOnRequestCompletion: false,
          },
        }),
    },
  });

  try {
    const db = new Kysely<ViewpointDB>({ dialect });
    logInfo("Viewpoint SQL Server pool created");
    return db;
  } catch (err) {
    logError(`Failed to create Viewpoint SQL Server pool: ${err}`);
    throw err;
  }
};
