# coding:utf-8
 
from .. import *
from nose.tools import assert_equal, assert_not_equal
 
from flanker.addresslib.address import parse, parse_list
from flanker.addresslib.address import Address, AddressList, EmailAddress, UrlAddress
 
 
def test_addr_properties():
    email = parse('name@host.com')
    url = parse('http://host.com')
    non_ascii = parse(u'Gonzalo Bañuelos<gonz@host.com>')
 
    eq_ (False, url.supports_routing)
    eq_ (True,  email.supports_routing)
 
    eq_(Address.Type.Email, email.addr_type)
    eq_(Address.Type.Url, url.addr_type)
    eq_(non_ascii, "gonz@host.com")
 
    adr = parse("Zeka <EV@host.coM>")
    eq_ (str(adr), 'EV@host.com')
 
 
def test_address_compare():
    a = EmailAddress("a@host.com")
    b = EmailAddress("b@host.com")
    also_a = EmailAddress("A@host.com")
 
    ok_(a == also_a)
    #eq_(False, a != "I am also A <a@HOST.com>")
    ok_(a != 'crap')
    ok_(a != None)
    ok_(a != b)
 
    u = UrlAddress("http://hello.com")
    ok_ (u == "http://hello.com")
 
    # make sure it works for sets:
    s = set()
    s.add(a)
    s.add(also_a)
    eq_ (1, len(s))
    s.add(u)
    s.add(u)
    eq_ (2, len(s))
 
 
def test_local_url():
    u = UrlAddress('http:///foo/bar')
    eq_(None, u.hostname)
 
 
def test_addresslist_basics():
    lst = parse_list("http://foo.com:1000; Biz@Kontsevoy.Com   ")
    eq_ (2, len(lst))
    eq_ ("http", lst[0].scheme)
    eq_ ("kontsevoy.com", lst[1].hostname)
    eq_ ("Biz", lst[1].mailbox)
    ok_ ("biz@kontsevoy.com" in lst)
 
    # test case-sensitivity: hostname must be lowercased, but the local-part needs
    # to remain case-sensitive
    ok_ ("Biz@kontsevoy.com" in str(lst))
 
    # check parsing:
    spec = '''http://foo.com:8080, "Ev K." <ev@host.com>, "Alex K" alex@yahoo.net; "Tom, S" "tom+[a]"@s.com'''
    lst = parse_list(spec, True)
 
    eq_ (len(lst), 4)
    eq_ ("http://foo.com:8080", lst[0].address)
    eq_ ("ev@host.com", lst[1].address)
    eq_ ("alex@yahoo.net", lst[2].address)
    eq_ ('"tom+[a]"@s.com', lst[3].address)
 
    # string-based persistence:
    s = str(lst)
    clone = parse_list(s)
    eq_ (lst, clone)
 
    # now clone using full spec:
    s = lst.full_spec()
    clone = parse_list(s)
    eq_ (lst, clone)
 
    # hostnames:
    eq_ (set(['host.com', 'foo.com', 'yahoo.net', 's.com']), lst.hostnames)
    eq_ (set(['url', 'email']), lst.addr_types)
 
    # add:
    result = lst + parse_list("ev@local.net") + ["foo@bar.com"]
    ok_ (isinstance(result, AddressList))
    eq_ (len(result), len(lst)+2)
    ok_ ("foo@bar.com" in result)
 
 
def test_addresslist_with_apostrophe():
    s = '''"Allan G\'o"  <allan@example.com>, "Os Wi" <oswi@example.com>'''
    lst = parse_list(s)
    eq_ (2, len(lst))
    eq_ ('"Allan G\'o" <allan@example.com>', lst[0].full_spec())
    eq_ ('"Os Wi" <oswi@example.com>', lst[1].full_spec())
    lst = parse_list("=?UTF-8?Q?Eugueny_=CF=8E_Kontsevoy?= <eugueny@gmail.com>")
    eq_ ('=?UTF-8?Q?Eugueny_=CF=8E_Kontsevoy?= <eugueny@gmail.com>', lst.full_spec())
    eq_ (u'Eugueny ώ Kontsevoy', lst[0].display_name)
 
 
def test_edge_cases():
    email = EmailAddress('"foo.bar@"@example.com')
    eq_('"foo.bar@"@example.com', email.address)