import os
from dotenv import load_dotenv
from ...utils.fluxQueryBuilder import FluxQueryBuilder
from ...utils.influx import InfluxDBHelper

load_dotenv()

load_dotenv()

# Create the InfluxDB client
client = InfluxDBHelper(
    url=os.getenv("INFLUXDB_URL"),
    token=os.getenv("INFLUXDB_TOKEN"),
    org=os.getenv("INFLUXDB_ORG"),
    bucket=os.getenv("INFLUXDB_BUCKET"),
)

# Build a Flux query
builder = (
    FluxQueryBuilder()
    .bucket(os.getenv("INFLUXDB_BUCKET"))
    .time_range("-30d", "now()")
    .filter_measurement("sensor_data")
    .filter_fields("co2", "humidity", "temperature")
    .pivot()
    .mean()
)

# Get the query string
flux_query = builder.build()
print("Generated Flux Query:\n", flux_query)

# Run the query
tables = client.query_api.query(org=os.getenv("INFLUXDB_ORG"), query=flux_query)

# Output the results
for table in tables:
    for record in table.records:
        print(record.values)
"""
flux_query = builder.build()

print(flux_query)

tables = client.query_api.query(org= _org, query= flux_query)

for table in tables:
    for record in table.records:
        print(record)


Some query examples
from(bucket: "co2-test")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "sensor_data")
  |> filter(fn: (r) => r["_field"] == "co2" or r["_field"] == "humidity" or r["_field"] == "temperature") 


from(bucket: "co2-test")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "sensor_data")
  |> filter(fn: (r) => r["_field"] == "co2" or r["_field"] == "humidity" or r["_field"] == "temperature")

from(bucket: "example-bucket")
    |> range(start: -1h)
    |> filter(fn: (r) => r._measurement == "cpu" and r._field == "usage_system" and r.cpu == "cpu-total")
    |> window(every: 5m) //every five min
    |> mean() //gives the average back

from(bucket: "co2-dev")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "sensor_data")
  |> filter(fn: (r) => r["room"] == "1/210")
  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
  |> yield(name: "mean")

"""

