"""
Module that given a filename and a position saves the file in the csv format
"""
import os
import sys
import pandas as pd


def convert_to_csv(data: dict, filename: str, position: str = None) -> None:
    """
    Converts a dictionary to a CSV file and saves it at a specified location.

    Args:
        data (dict): The data to be converted into CSV format.
        filename (str): The name of the output CSV file, without the '.csv' extension.
        position (str, optional): The file path where the CSV should be saved. Defaults to the directory of the caller script if not provided.

    Returns:
        None: The function does not return anything.
        
    Raises:
        FileNotFoundError: If the specified directory does not exist.
        PermissionError: If write permissions are lacking for the directory.
        TypeError: If `data` is not a dictionary.
        Exception: For other issues that may arise during the creation or saving of the CSV file.

    Example:
        >>> convert_to_csv({'id': [1, 2], 'value': [10, 20]}, 'output', '/path/to/save')
        Saves a CSV file named 'output.csv' at '/path/to/save'.
    """

    if ".csv" in filename:
        filename = filename.replace(".csv", "")  # Remove .csv extension

    # Get the directory of the caller script if position is not provided
    if position is None:
        caller_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
        position = caller_dir

    try:
        if not isinstance(data, dict):
            raise TypeError("Input data must be a dictionary")

        os.makedirs(position, exist_ok=True)  # Create directory if needed

        df = pd.DataFrame.from_dict(data, orient='index')
        df.to_csv(os.path.join(position, f"{filename}.csv"), index=False)

    except FileNotFoundError as fnfe:
        raise FileNotFoundError(
            f"The specified directory '{position}' does not exist.") from fnfe
    except PermissionError as pe:
        raise PermissionError(
            f"You don't have permission to write to '{position}'.") from pe
    except Exception as e:
        raise e  # Re-raise other potential errors
