from typing import Union
from uuid import UUID

from cognee.modules.data.exceptions import DatasetTypeError
from cognee.modules.data.methods import get_datasets


async def get_dataset_ids(datasets: Union[list[str], list[UUID]], user):
    """
    Function returns dataset IDs necessary based on provided input.
    It transforms raw strings into real dataset_ids with keeping write permissions in mind.
    If a user wants to write to a dataset he is not the owner of it must be provided through UUID.
    Args:
        datasets:
        pipeline_name:
        user:

    Returns: a list of write access dataset_ids if they exist

    """
    if all(isinstance(dataset, UUID) for dataset in datasets):
        # Return list of dataset UUIDs
        dataset_ids = datasets
    else:
        # Convert list of dataset names to dataset UUID
        if all(isinstance(dataset, str) for dataset in datasets):
            # Get all user owned dataset objects (If a user wants to write to a dataset he is not the owner of it must be provided through UUID.)
            user_datasets = await get_datasets(user.id)
            # Filter out non name mentioned datasets
            dataset_ids = [dataset for dataset in user_datasets if dataset.name in datasets]
            # Filter out non current tenant datasets
            dataset_ids = [
                dataset.id for dataset in dataset_ids if dataset.tenant_id == user.tenant_id
            ]
        else:
            raise DatasetTypeError(
                f"One or more of the provided dataset types is not handled: f{datasets}"
            )

    return dataset_ids
