#!/bin/env python3

import logging as log

import configparser as cp
import os

class config_utils():
    @staticmethod
    def search_known_paths() -> tuple[bool, str]:
        '''
        Look at predefined paths on the filesystem for a config file
        '''

        possible_config_locations = [
            "./config.ini",
            f"{os.getenv('HOME')}/.config/wgdashboard/config.ini",
            "/etc/wgdashboard/config.ini",
        ]

        try:
            for path in possible_config_locations:
                if os.path.exists(path):
                    return True, path
                else:
                    continue
            return False, ''

        except Exception as err:
            return False, ''

    @staticmethod
    def read_data(config_path) -> tuple[bool, dict]:
        config = cp.ConfigParser()

        try:
            config.read(config_path)

            if len(config.sections()) == 0:
                return False, {}

            config_dict = {}
            for section in config.sections():
                new_items = {}

                for key, value in config.items(section):
                    key = key.lower()
                    val = value.strip().lower()

                    if val == 'true':
                        value = True
                    elif val == 'false':
                        value = False

                    new_items[key] = value

                config_dict[section.lower()] = new_items
            
            return True, config_dict

        except cp.ParsingError as err:
            return False, {}

    @staticmethod
    def find_section(config_data: dict, target_section: str) -> bool:
        if target_section not in config_data:
            log.error("target section not in the config")
            return False

        return True
    
    @staticmethod
    def find_key(config_data: dict, target_section: str, target_key: str) -> bool:
        if target_key not in config_data[target_section]:
            log.error("target key not in the config")
            return False

        return True

    @staticmethod
    def write_key(config_data: dict, target_section: str, target_key: str, new_value: str) -> bool:
        config_data[target_section][target_key] = new_value

        config = cp.ConfigParser()

        for section, values in config_data.items():
            config[section] = {}
            for key, value in values.items():
                config[section][key] = str(value)
        
        try:
            ok, candidate_path = config_utils.search_known_paths()
            if not ok:
                log.error("failed to retrieve a valid path for the config")
                return False

            with open(candidate_path, "w") as f:
                config.write(f)

            return True

        except Exception as err:
            log.info("exception occured",err)
            return False