from typing import Any, Dict, Tuple, List
from app.core.database.operations import get_items_from_database
from app.models.registry import MODEL_REGISTRY


# Fetches selectbox options without exposing it as an API. Used internally
# by get_metadata()
def get_select_box_options(model_name: str, type: str,
                           column_name: str) -> Tuple[Dict[str, Any], List[int]]:
    if model_name not in MODEL_REGISTRY:
        return ({'error': f'Model "{model_name}" nije registrovan'}, [400])

    metadata_model = MODEL_REGISTRY[model_name]['metadata']['columns']
    layout_model = MODEL_REGISTRY[model_name].get(
        'layout', {}).get(type).get('desktop', [])

    column_metadata = metadata_model.get(column_name)
    if not column_metadata:
        return (
            {'error': f'Kolona "{column_name}" nije pronadjena u modelu "{model_name}"'}, [500])

    if 'foreign_key' in column_metadata['constraints']:
        if model_name == 'new_apartment' and column_name == 'building_id':
            return ([], [200])  # Or skip entirely depending on your logic
        source_table = column_metadata['constraints']['foreign_key']['ref_table']
        foreign_key_column_name = column_metadata['constraints']['foreign_key']['ref_column']

        # Find label for select box in layout model
        select_box_label = None
        for row in layout_model:
            for column in row['columns']:
                if column['data_name'] == column_name:
                    select_box_label = column.get('select_box_label')
                    break
            if select_box_label:
                break

        if not select_box_label:
            return (
                {'error': f'Nedostaje "select_box_label" za {model_name}.{column_name}'}, [500])

        response = get_items_from_database(table_name=source_table)
        if 'error' in response:
            return (response, [500])

        options = [{'label': item[select_box_label],
                    'value': item[foreign_key_column_name]} for item in response]
        return (options, [200])

    enum_class = column_metadata['constraints'].get('enum')
    if not enum_class:
        return (
            {'error': f'Nije pronađena ENUM vrednost za {model_name}.{column_name}'}, [500])

    return ([{'label': item.value, 'value': item.name}
            for item in enum_class], [200])
