r'''
  ____   ___  _     _ _       
 / ___| / _ \| |   (_) |_ ___ 
 \___ \| | | | |   | | __/ _ \
  ___) | |_| | |___| | ||  __/
 |____/ \__\_\_____|_|\__\___|
                              
Script to set the config
/usr/bin/python3 /var/www/nebuleair_pro_4g/sqlite/set_config.py

in case of readonly error:
sudo chmod 777 /var/www/nebuleair_pro_4g/sqlite/sensors.db
'''

import sqlite3

# Connect to (or create if not existent) the database
conn = sqlite3.connect("/var/www/nebuleair_pro_4g/sqlite/sensors.db")
cursor = conn.cursor()

print(f"Connected to database")

# Note: Using INSERT OR IGNORE to add only new configurations without overwriting existing ones
print("Adding new configurations (existing ones will be preserved)")


# Insert general configurations
config_entries = [
    ("modem_config_mode", "0", "bool"),
    ("deviceID", "XXXX", "str"),
    ("latitude_raw", "0", "int"),
    ("longitude_raw", "0", "int"),
    ("latitude_precision", "0", "int"),
    ("longitude_precision", "0", "int"),
    ("deviceName", "NebuleAir-proXXX", "str"),
    ("SaraR4_baudrate", "115200", "int"),
    ("NPM_solo_port", "/dev/ttyAMA5", "str"),
    ("sshTunnel_port", "59228", "int"),
    ("SARA_R4_general_status", "connected", "str"),
    ("SARA_R4_SIM_status", "connected", "str"),
    ("SARA_R4_network_status", "connected", "str"),
    ("SARA_R4_neworkID", "20810", "int"),
    ("WIFI_status", "connected", "str"),
    ("send_aircarto", "0", "bool"),
    ("send_uSpot", "0", "bool"),
    ("send_miotiq", "1", "bool"),
    ("npm_5channel", "0", "bool"),
    ("envea", "0", "bool"),
    ("windMeter", "0", "bool"),
    ("BME280", "1", "bool"),
    ("MPPT", "0", "bool"),
    ("NOISE", "0", "bool"),
    ("MHZ19", "0", "bool"),
    ("modem_version", "XXX", "str"),
    ("device_type", "nebuleair_pro", "str"),
    ("language", "fr", "str"),
    ("wifi_power_saving", "0", "bool"),
    ("cpu_power_mode", "normal", "str")
]

for key, value, value_type in config_entries:
    cursor.execute(
        "INSERT OR IGNORE INTO config_table (key, value, type) VALUES (?, ?, ?)",
        (key, value, value_type)
    )

# Clean up duplicate envea sondes first (keep only first occurrence of each name)
print("Cleaning up duplicate envea sondes...")
cursor.execute("""
    DELETE FROM envea_sondes_table 
    WHERE id NOT IN (
        SELECT MIN(id) 
        FROM envea_sondes_table 
        GROUP BY name
    )
""")
deleted_count = cursor.rowcount
if deleted_count > 0:
    print(f"Deleted {deleted_count} duplicate envea sonde entries")

# Insert envea sondes (only if they don't already exist)
# Attention pour le H2S il y a plusieurs sondes
# H2S 1ppm -> coef 4
# H2S 20ppm -> coef 1
# H2S 200ppm -> coef 10

envea_sondes = [
    (False, "ttyAMA4", "h2s", 4),  #H2S
    (False, "ttyAMA3", "no2", 1),
    (False, "ttyAMA3", "nh3", 100),
    (False, "ttyAMA3", "so2", 4),
    (False, "ttyAMA2", "o3", 1)
]

for connected, port, name, coefficient in envea_sondes:
    # Check if sensor with this name already exists
    cursor.execute("SELECT COUNT(*) FROM envea_sondes_table WHERE name = ?", (name,))
    exists = cursor.fetchone()[0] > 0
    
    if not exists:
        cursor.execute(
            "INSERT INTO envea_sondes_table (connected, port, name, coefficient) VALUES (?, ?, ?, ?)",
            (1 if connected else 0, port, name, coefficient)
        )
        print(f"Added envea sonde: {name}")
    else:
        print(f"Envea sonde '{name}' already exists, skipping")


# Database migrations (add columns to existing tables)
migrations = [
    ("data_NPM", "npm_status", "INTEGER DEFAULT 0"),
    ("data_NOISE", "noise_status", "INTEGER DEFAULT 0"),
]

for table, column, col_type in migrations:
    try:
        cursor.execute(f"ALTER TABLE {table} ADD COLUMN {column} {col_type}")
        print(f"Migration: added column '{column}' to {table}")
    except:
        pass  # Column already exists

# Commit and close the connection
conn.commit()
conn.close()

print("Database updated successfully!")
