/**
 * Basic Session Example
 *
 * This example demonstrates how to use a single Session to connect to IoTDB,
 * execute queries, and insert data. Shows both traditional and Builder pattern approaches.
 */

import { Session, ConfigBuilder, TSDataType, TreeTablet } from "../src";

async function main() {
  console.log("=== Basic Session Example ===\n");

  // Method 1: Traditional constructor (backward compatible)
  console.log("Method 1: Traditional constructor");
  const session1 = new Session({
    host: "localhost",
    port: 6667,
    username: "root",
    password: "root",
  });

  // Method 2: Using Builder pattern (recommended)
  console.log("Method 2: Using Builder pattern");
  const session2 = new Session(
    new ConfigBuilder()
      .host("localhost")
      .port(6667)
      .username("root")
      .password("root")
      .fetchSize(1024)
      .build(),
  );

  // For demo purposes, we'll use session1
  const session = session1;

  try {
    // Open the session
    console.log("\nOpening session...");
    await session.open();
    console.log("Session opened successfully");

    // Create a database
    console.log("\nCreating database...");
    await session.executeNonQueryStatement("CREATE DATABASE root.example");
    console.log("Database created");

    // Create timeseries
    console.log("\nCreating timeseries...");
    await session.executeNonQueryStatement(
      "CREATE TIMESERIES root.example.device1.temperature WITH DATATYPE=FLOAT, ENCODING=RLE",
    );
    await session.executeNonQueryStatement(
      "CREATE TIMESERIES root.example.device1.humidity WITH DATATYPE=FLOAT, ENCODING=RLE",
    );
    console.log("Timeseries created");

    // Insert tablet data using TreeTablet class with addRow method
    console.log("\nInserting tree tablet data using addRow...");
    const tablet = new TreeTablet(
      "root.example.device1",
      ["temperature", "humidity"],
      [TSDataType.FLOAT, TSDataType.FLOAT]
    );
    
    // Add rows one at a time - convenient for streaming data
    tablet.addRow(Date.now(), [25.5, 60.0]);
    tablet.addRow(Date.now() + 1000, [26.0, 61.5]);
    tablet.addRow(Date.now() + 2000, [26.5, 62.0]);
    
    await session.insertTablet(tablet);
    console.log("Tree tablet data inserted");
    
    // Alternative: Use plain object interface (still supported for backward compatibility)
    console.log("\nInserting using plain object interface...");
    await session.insertTablet({
      deviceId: "root.example.device1",
      measurements: ["temperature", "humidity"],
      dataTypes: [TSDataType.FLOAT, TSDataType.FLOAT],
      timestamps: [Date.now() + 3000, Date.now() + 4000],
      values: [
        [27.0, 63.0],
        [27.5, 64.0],
      ],
    });
    console.log("Plain object data inserted");

    // Query data using SessionDataSet iterator pattern
    console.log("\nQuerying data...");
    const dataSet = await session.executeQueryStatement(
      "SELECT * FROM root.example.device1",
    );
    console.log("Columns:", dataSet.getColumnNames());
    
    let rowCount = 0;
    while (await dataSet.hasNext()) {
      const row = dataSet.next();
      rowCount++;
      console.log(`Row ${rowCount}:`, row.getTimestamp(), row.getFields());
    }
    await dataSet.close();
    console.log("Total rows:", rowCount);

    // Show databases
    console.log("\nShowing databases...");
    const dbDataSet = await session.executeQueryStatement("SHOW DATABASES");
    const databases = [];
    while (await dbDataSet.hasNext()) {
      databases.push(dbDataSet.next().getFields());
    }
    await dbDataSet.close();
    console.log("Databases:", databases);
  } catch (error) {
    console.error("Error:", error);
  } finally {
    // Close the session
    console.log("\nClosing session...");
    await session.close();
    console.log("Session closed");
  }
}

main().catch(console.error);
