/**
 * 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.
 */

export const SQL_DIALECT_TREE = 'tree';
export const SQL_DIALECT_TABLE = 'table';

export interface EndPoint {
  host: string;
  port: number;
}

/**
 * Internal config used by Connection class (includes internal-only fields)
 */
export interface InternalConfig extends Config {
  sqlDialect?: string;
}

/**
 * Parse a single "host:port" node URL into an EndPoint. Accepts the bracketed
 * IPv6 form "[::1]:6667" (consistent with the [ipv6]:port endpoint format
 * standardized in apache/iotdb#18162) as well as IPv4 and hostname URLs. A bare
 * (unbracketed) IPv6 address with a port is ambiguous and rejected; the
 * "[ipv6]:port" form must be used.
 */
function parseNodeUrl(url: string): EndPoint {
  const trimmed = url.trim();
  let host: string;
  let portStr: string;
  if (trimmed.startsWith('[')) {
    // Bracketed IPv6: [host]:port
    const close = trimmed.indexOf(']');
    if (close === -1 || trimmed[close + 1] !== ':') {
      throw new Error(`Invalid nodeUrl format: ${url}. Expected format: "[ipv6]:port"`);
    }
    host = trimmed.slice(1, close).trim();
    portStr = trimmed.slice(close + 2).trim();
  } else {
    const idx = trimmed.indexOf(':');
    // A non-bracketed URL with more than one colon is a bare IPv6 address,
    // which is ambiguous with a trailing port; it must be written as [ipv6]:port.
    if (idx === -1 || idx !== trimmed.lastIndexOf(':')) {
      throw new Error(`Invalid nodeUrl format: ${url}. Expected format: "host:port" (use "[ipv6]:port" for IPv6 addresses)`);
    }
    host = trimmed.slice(0, idx).trim();
    portStr = trimmed.slice(idx + 1).trim();
  }
  // Require the port to be all digits: parseInt would otherwise accept a numeric prefix, so
  // "[::1]:6667junk" or "[::1]:6667:9999" would be silently read as port 6667 and mask a malformed
  // endpoint (IoTDB's Java and Python parsers reject these because the whole value must convert).
  const port = /^\d+$/.test(portStr) ? parseInt(portStr, 10) : NaN;
  if (!host || isNaN(port) || port <= 0 || port > 65535) {
    throw new Error(`Invalid nodeUrl format: ${url}. Host must be non-empty and port must be a valid number (1-65535)`);
  }
  return { host, port };
}

/**
 * Parse nodeUrls from string array format (e.g., ["host1:6667", "host2:6668"])
 * to EndPoint array format
 */
export function parseNodeUrls(nodeUrls: string[]): EndPoint[] {
  return nodeUrls.map(parseNodeUrl);
}

export interface Config {
  host?: string;
  port?: number;
  nodeUrls?: string[] | EndPoint[];
  username?: string;
  password?: string;
  database?: string;
  timezone?: string;
  fetchSize?: number;
  enableSSL?: boolean;
  sslOptions?: SSLOptions;
  /**
   * Enable the optimized tablet serialization path: single-pass,
   * single-buffer writes with inline null bitmaps (no intermediate
   * per-column buffers or Buffer.concat), BigInt-free int64 writes.
   * Produces byte-identical wire output to the legacy path.
   * 
   * @default true
   */
  enableFastSerialization?: boolean;
}

export interface SSLOptions {
  ca?: Buffer;
  cert?: Buffer;
  key?: Buffer;
  rejectUnauthorized?: boolean;
}

export interface PoolConfig extends Config {
  maxPoolSize?: number;
  minPoolSize?: number;
  maxIdleTime?: number;
  waitTimeout?: number;
  /**
   * Enable client-side redirection optimization.
   * When enabled, the client caches device→endpoint mappings
   * and routes writes directly to optimal nodes.
   * 
   * @default true
   * @requires Multi-node IoTDB cluster
   */
  enableRedirection?: boolean;
  /**
   * Time-to-live for cached redirect mappings (milliseconds).
   * Set to 0 for no expiration.
   * Recommended: 300000 (5 minutes)
   * 
   * @default 300000
   */
  redirectCacheTTL?: number;
}

export const DEFAULT_CONFIG: Partial<Config> = {
  host: 'localhost',
  port: 6667,
  username: 'root',
  password: 'root',
  fetchSize: 1024,
  enableSSL: false,
  enableFastSerialization: true, // Enable by default for better performance
};

export const DEFAULT_POOL_CONFIG: Partial<PoolConfig> = {
  ...DEFAULT_CONFIG,
  maxPoolSize: 10,
  minPoolSize: 1,
  maxIdleTime: 60000, // 60 seconds
  waitTimeout: 60000, // 60 seconds
  enableRedirection: true,
  redirectCacheTTL: 300000, // 5 minutes
};

/**
 * Builder class for constructing Session and SessionPool configurations
 */
export class ConfigBuilder {
  private config: Partial<Config>;

  constructor() {
    this.config = { ...DEFAULT_CONFIG };
  }

  host(host: string): this {
    this.config.host = host;
    return this;
  }

  port(port: number): this {
    this.config.port = port;
    return this;
  }

  nodeUrls(nodeUrls: string[] | EndPoint[]): this {
    this.config.nodeUrls = nodeUrls;
    return this;
  }

  username(username: string): this {
    this.config.username = username;
    return this;
  }

  password(password: string): this {
    this.config.password = password;
    return this;
  }

  database(database: string): this {
    this.config.database = database;
    return this;
  }

  timezone(timezone: string): this {
    this.config.timezone = timezone;
    return this;
  }

  fetchSize(fetchSize: number): this {
    this.config.fetchSize = fetchSize;
    return this;
  }

  enableSSL(enable: boolean): this {
    this.config.enableSSL = enable;
    return this;
  }

  sslOptions(sslOptions: SSLOptions): this {
    this.config.sslOptions = sslOptions;
    return this;
  }

  build(): Config {
    return this.config as Config;
  }
}

/**
 * Builder class for constructing SessionPool configurations
 */
export class PoolConfigBuilder extends ConfigBuilder {
  private poolConfig: Partial<PoolConfig>;

  constructor() {
    super();
    this.poolConfig = { ...DEFAULT_POOL_CONFIG };
  }

  override host(host: string): this {
    this.poolConfig.host = host;
    return this;
  }

  override port(port: number): this {
    this.poolConfig.port = port;
    return this;
  }

  override nodeUrls(nodeUrls: string[] | EndPoint[]): this {
    this.poolConfig.nodeUrls = nodeUrls;
    return this;
  }

  override username(username: string): this {
    this.poolConfig.username = username;
    return this;
  }

  override password(password: string): this {
    this.poolConfig.password = password;
    return this;
  }

  override database(database: string): this {
    this.poolConfig.database = database;
    return this;
  }

  override timezone(timezone: string): this {
    this.poolConfig.timezone = timezone;
    return this;
  }

  override fetchSize(fetchSize: number): this {
    this.poolConfig.fetchSize = fetchSize;
    return this;
  }

  override enableSSL(enable: boolean): this {
    this.poolConfig.enableSSL = enable;
    return this;
  }

  override sslOptions(sslOptions: SSLOptions): this {
    this.poolConfig.sslOptions = sslOptions;
    return this;
  }

  maxPoolSize(size: number): this {
    this.poolConfig.maxPoolSize = size;
    return this;
  }

  minPoolSize(size: number): this {
    this.poolConfig.minPoolSize = size;
    return this;
  }

  maxIdleTime(time: number): this {
    this.poolConfig.maxIdleTime = time;
    return this;
  }

  waitTimeout(timeout: number): this {
    this.poolConfig.waitTimeout = timeout;
    return this;
  }

  override build(): PoolConfig {
    return this.poolConfig as PoolConfig;
  }
}
