# -*- coding: utf-8 -*-
"""AI provider accounts: the one place that knows the providers, their stored API keys and the status line in the settings.

Whoever stores or deletes a key (login dialog, settings buttons) calls sync_status, so the "Stav přihlášení" row of the
settings always follows the stored keys, whichever part of the addon asked for the login.
"""
import importlib

import xbmcaddon

# provider id -> (display name, client module with validate_api_key)
PROVIDERS = {
    'openai': ('OpenAI', 'OpenAIClient'),
    'anthropic': ('Anthropic', 'AnthropicClient'),
    'google': ('Google AI', 'GoogleClient'),
    'mistral': ('Mistral AI', 'MistralClient'),
    'groq': ('Groq', 'GroqClient'),
}
DEFAULT_PROVIDER = 'mistral'
LOGGED_OUT = 'Nepřihlášen'


def resolve(provider=None, addon=None):
    """Provider id from an explicit value or the ai_provider setting; unknown values fall back to the default."""
    value = (provider or (addon or xbmcaddon.Addon()).getSetting('ai_provider') or DEFAULT_PROVIDER).lower()
    return next((known for known in PROVIDERS if known in value), DEFAULT_PROVIDER)


def name(provider):
    return PROVIDERS[provider][0]


def key_setting(provider):
    return f'{provider}_api_key'


def status_setting(provider):
    return f'{provider}_status'


def get_key(provider, addon=None):
    return (addon or xbmcaddon.Addon()).getSetting(key_setting(provider))


def has_key(provider, addon=None):
    return bool(get_key(provider, addon))


def validate(provider):
    """Asks the provider whether the stored key works."""
    module = importlib.import_module(f'wcs.ai.{PROVIDERS[provider][1]}')
    return module.validate_api_key()


def sync_status(addon=None):
    """Writes the status row of every provider from its stored key (only the rows that changed)."""
    addon = addon or xbmcaddon.Addon()
    for provider in PROVIDERS:
        status = f'Přihlášen k {name(provider)}' if has_key(provider, addon) else LOGGED_OUT
        if addon.getSetting(status_setting(provider)) != status:
            addon.setSetting(status_setting(provider), status)


def log_out(provider, addon=None):
    addon = addon or xbmcaddon.Addon()
    addon.setSetting(key_setting(provider), '')
    sync_status(addon)
