from httpcore import TimeoutException
from httpcore._exceptions import ConnectError
from httpx import Timeout, Client, ConnectTimeout
from unittest.mock import patch
from pytest import raises

from googletrans import Translator


def test_bind_multiple_service_urls():
    service_urls = [
        'translate.google.com',
        'translate.google.co.kr',
    ]

    translator = Translator(service_urls=service_urls)
    assert translator.service_urls == service_urls

    assert translator.translate('test', dest='ko')
    assert translator.detect('Hello')


def test_source_language(translator):
    result = translator.translate('안녕하세요.')
    assert result.src == 'ko'


def test_pronunciation(translator):
    result = translator.translate('안녕하세요.', dest='ja')
    assert result.pronunciation == 'Kon\'nichiwa.'


def test_pronunciation_issue_175(translator):
    result = translator.translate('Hello', src='en', dest='ru')

    assert result.pronunciation is not None


def test_latin_to_english(translator):
    result = translator.translate('veritas lux mea', src='la', dest='en')
    assert result.text == 'The truth is my light'


def test_unicode(translator):
    result = translator.translate(u'안녕하세요.', src='ko', dest='ja')
    assert result.text == u'こんにちは。'


def test_emoji(translator):
    result = translator.translate('😀')
    assert result.text == u'😀'


def test_language_name(translator):
    result = translator.translate(u'Hello', src='ENGLISH', dest='iRiSh')
    assert result.text == u'Dia dhuit'


def test_language_name_with_space(translator):
    result = translator.translate(
        u'Hello', src='en', dest='chinese (simplified)')
    assert result.dest == 'zh-cn'


def test_language_rfc1766(translator):
    result = translator.translate(u'luna', src='it_ch@euro', dest='en')
    assert result.text == u'moon'


def test_special_chars(translator):
    text = u"©×《》"

    result = translator.translate(text, src='en', dest='en')
    assert result.text == text


def test_translate_list(translator):
    args = (['test', 'exam'], 'ko', 'en')
    translations = translator.translate(*args)

    assert translations[0].text == u'테스트'
    assert translations[1].text == u'시험'


def test_detect_language(translator):
    ko = translator.detect(u'한국어')
    en = translator.detect('English')
    rubg = translator.detect('тест')

    assert ko.lang == 'ko'
    assert en.lang == 'en'
    assert rubg.lang == ['ru', 'bg']


def test_detect_list(translator):
    items = [u'한국어', ' English', 'тест']

    result = translator.detect(items)

    assert result[0].lang == 'ko'
    assert result[1].lang == 'en'
    assert result[2].lang == ['ru', 'bg']


def test_src_in_special_cases(translator):
    args = ('Tere', 'en', 'ee')

    result = translator.translate(*args)

    assert result.text in ('Hello', 'Hi,')


def test_src_not_in_supported_languages(translator):
    args = ('Hello', 'en', 'zzz')

    with raises(ValueError):
        translator.translate(*args)


def test_dest_in_special_cases(translator):
    args = ('hello', 'ee', 'en')

    result = translator.translate(*args)

    assert result.text == 'Tere'


def test_dest_not_in_supported_languages(translator):
    args = ('Hello', 'zzz', 'en')

    with raises(ValueError):
        translator.translate(*args)


def test_timeout():
    # httpx will raise ConnectError in some conditions
    with raises((TimeoutException, ConnectError, ConnectTimeout)):
        translator = Translator(timeout=Timeout(0.0001))
        translator.translate('안녕하세요.')


class MockResponse:
    def __init__(self, status_code):
        self.status_code = status_code
        self.text = 'tkk:\'translation\''


@patch.object(Client, 'get', return_value=MockResponse('403'))
def test_403_error(session_mock):
    translator = Translator()
    assert translator.translate('test', dest='ko')
