# import pymysql
import mysql.connector
import socket
hostname = socket.gethostname()
print("Hostname:", hostname)
from dotenv import load_dotenv
import os
#Getting db credentials from .env file
load_dotenv()

DB_CONFIG = {
    ('production', "ubuntu-s-1vcpu-1gb-sfo3-01"):{
        "user": os.getenv("PROD_DB_USER"),
        "password": os.getenv("PROD_DB_PASSWORD"),
        "dbname": os.getenv("PROD_DB_NAME"),
        "host": os.getenv("PROD_DB_HOST"),
        "ovpn_table_name": os.getenv("PROD_OVPN_TABLE_NAME"),
        "country_table_name": os.getenv("PROD_COUNTRY_TABLE_NAME"),
        "ovpn_main_file_path": "Ovpn/",
        "master_table_name": "master_table",
        "project_key_table_name": "project_keys",
        "server_ip": "144.126.211.210",
        "script_name": "LIVE MASTER TABLE scirpt for addding active servers",
        "connection_php_path": "http://localhost/ovpn/vpnGate/check_connection.php",
    },
    ('vpn-parallel-2', "ip-172-26-14-17"):{
        "user": os.getenv("PROD_DB_USER"),
        "password": os.getenv("PROD_DB_PASSWORD"),
        "dbname": os.getenv("PROD_DB_NAME"),
        "host": os.getenv("PROD_DB_HOST"),
        "ovpn_table_name": os.getenv("PROD_OVPN_TABLE_NAME"),
        "country_table_name": os.getenv("PROD_COUNTRY_TABLE_NAME"),
        "ovpn_main_file_path": "Ovpn/",
        "master_table_name": "master_table",
        "project_key_table_name": "project_keys",
        "server_ip": "13.127.118.90",
        "script_name": "LIVE MASTER TABLE scirpt for addding active servers",
        "connection_php_path": "http://localhost/vpn-python-scripting/check_connection.php",
    },
    ('staging', "ip-172-31-59-182"):{
        "user": os.getenv("STAG_DB_USER"),
        "password": os.getenv("STAG_DB_PASSWORD"),
        "dbname": os.getenv("STAG_DB_NAME"),
        "host": os.getenv("STAG_DB_HOST"),
        "ovpn_table_name": os.getenv("STAG_OVPN_TABLE_NAME"),
        "country_table_name": os.getenv("STAG_COUNTRY_TABLE_NAME"),
        "ovpn_main_file_path": "Ovpn/",
        "master_table_name": "master_table",
        "project_key_table_name": "project_keys",
        "server_ip": "52.38.82.122",
        "script_name": "STAGING MASTER TABLE scirpt for addding active servers",
        "connection_php_path": "http://52.38.82.122/vpn-api-python/vpn_server_main_script_research/check_connection.php",
    },
    ('local', "p210144"):{
        "user": os.getenv("LOCAL_DB_USER"),
        "password": os.getenv("LOCAL_DB_PASSWORD"),
        "dbname": os.getenv("LOCAL_DB_NAME"),
        "host": os.getenv("LOCAL_DB_HOST"),
        "ovpn_table_name": os.getenv("LOCAL_OVPN_TABLE_NAME"),
        "country_table_name": os.getenv("LOCAL_COUNTRY_TABLE_NAME"),
        "ovpn_main_file_path": "Ovpn/",
        "master_table_name": "master_table",
        "project_key_table_name": "project_keys",
        "server_ip": "localhost",
        "script_name": "LOCAL MASTER TABLE testing scirpt for addding active servers",
        "connection_php_path": "http://localhost/vpn-python-scripting/check_connection.php",
    }   
}

# def get_config(mode = None):
#     if mode:
#         return DB_CONFIG.get(mode)
#     else:
#         hostname = socket.gethostname()
#         if hostname == 'ubuntu-s-1vcpu-1gb-sfo3-01':
#             return DB_CONFIG.get('production')
#         elif hostname == 'ip-172-31-59-182':
#             return DB_CONFIG.get('staging')
#         else:
#             return DB_CONFIG.get('local')

        
def get_config(mode=None):
    if mode:
        hostname = mode
    else:
        hostname = socket.gethostname()

    for k, v in DB_CONFIG.items():
        if hostname in k:
            return k[0], v
    
    raise ValueError(f"No configuration found for hostname: {hostname}")

class DatabaseConnection:
    def __init__(self, config):
        self.config = config
        self.connection = None
        self.cursor = None

    def connect(self):
        self.connection = mysql.connector.connect(**self.config)
        self.cursor = self.connection.cursor(dictionary=True)
        self.closed = False

    def close(self):
        if self.cursor:
            self.cursor.close()
        if self.connection and self.connection.is_connected():
            self.connection.close()
            self.closed = True

    def execute_query(self, query, data=None):
        self.cursor.execute(query, data)
        self.last_row_id = self.cursor.lastrowid  # Store the last inserted row ID

    def execute_many(self, query, data):
        self.cursor.executemany(query, data)
        self.last_row_id = None  # Reset last inserted row ID for executemany

    def fetch_all(self):
        return self.cursor.fetchall()

    def fetch_one(self):
        return self.cursor.fetchone()

    def get_last_row_id(self):
        return self.last_row_id
    
    def is_closed(self):
        return self.closed
    
            
def get_database_config(config):
    # connection = pymysql.connect(
    #     host=config["host"],
    #     user=config["user"],
    #     password=config["password"],
    #     database=config["dbname"],
    #     cursorclass=pymysql.cursors.DictCursor
    # )
    db_config = {
        "host": config["host"],
        "user": config["user"],
        "password": config["password"],
        "database": config["dbname"],
        # "connection_timeout": 40
    }
 
    return db_config
