from typing import Any, Dict, Optional, Tuple, List
from app.core.database.operations import add_item_to_database, get_items_from_database, update_items_in_database, delete_items_from_database
from app.core.data_validator import validate_data, check_required_fields_presence
from app.models.registry import MODEL_REGISTRY


def add_service(model_name: str,
                item_data: Dict[str,
                                Any],
                return_column: str = None) -> Tuple[Dict[str,
                                                         Any],
                                                    List[int]]:
    if not model_name:
        return ({'error': 'Neophodno ime modela'}, [400])

    if not item_data:
        return ({'error': 'Nedostaju neophodni podaci'}, [400])

    if model_name not in MODEL_REGISTRY:
        return ({'error': 'Nepostojeći model'}, [400])

    table_name = MODEL_REGISTRY[model_name]['metadata']['table_name']

    response, status_codes = check_required_fields_presence(
        input_data=item_data, model_name=model_name)
    if 'error' in response:
        return (response, status_codes)

    response, status_codes = validate_data(
        form_values=item_data, model_name=model_name)
    if 'error' in response:

        return (response, status_codes)

    response = add_item_to_database(
        table_name=table_name,
        item_dict=item_data,
        return_column=return_column)
    if isinstance(response, dict) and 'error' in response:
        return (response, [500])

    return (response, [200])


def list_service(model_name: str,
                 filters: Optional[Dict[str,
                                        Any]] = None) -> Tuple[Dict[str,
                                                                    Any],
                                                               List[int]]:
    if not model_name:
        return ({'error': 'Neophodno ime modela'}, [400])

    if model_name not in MODEL_REGISTRY:
        return ({'error': 'Nepostojeći model'}, [400])

    table_name = MODEL_REGISTRY[model_name]['metadata']['table_name']

    response = get_items_from_database(
        table_name=table_name, conditions=filters)
    if isinstance(response, dict) and 'error' in response:
        return (response, [500])

    return (response, [200])


def get_by_id_service(
        model_name: str, id: int) -> Tuple[Dict[str, Any], List[int]]:
    if not id:
        return ({'error': 'Neophodan ID'}, [400])

    if not model_name:
        return ({'error': 'Neophodno ime modela'}, [400])

    if model_name not in MODEL_REGISTRY:
        return ({'error': 'Nepostojeći model'}, [400])

    table_name = MODEL_REGISTRY[model_name]['metadata']['table_name']

    response = get_items_from_database(
        table_name=table_name, conditions={'id': id})
    if isinstance(response, dict) and 'error' in response:
        return (response, [500])

    if not response:
        return ({'error': 'Nije pronađeno'}, [404])

    return (response[0], [200])


def update_service(model_name: str,
                   item_data: Dict[str,
                                   Any],
                   id: int) -> Tuple[Dict[str,
                                          Any],
                                     List[int]]:
    if not item_data or not id or not model_name:
        return ({'error': 'Nedostaju neophodni podaci'}, [400])

    if model_name not in MODEL_REGISTRY:
        return ({'error': 'Nepostojeći model'}, [400])

    table_name = MODEL_REGISTRY[model_name]['metadata']['table_name']

    response, status_codes = validate_data(
        form_values=item_data, model_name=model_name)
    if 'error' in response:
        return (response, status_codes)

    response = update_items_in_database(
        table_name=table_name,
        updated_fields=item_data,
        conditions={
            'id': id})
    if 'error' in response:
        return (response, [500])

    return (response, [200])


def delete_service(
        model_name: str, id: int) -> Tuple[Dict[str, Any], List[int]]:
    if not id:
        return ({'error': 'Neophodan ID'}, [400])

    table_name = MODEL_REGISTRY[model_name]['metadata']['table_name']

    response = delete_items_from_database(
        table_name=table_name, conditions={'id': id})
    if 'error' in response:
        return (response, [500])

    return (response, [200])
