# coding: utf-8

from pkg_resources import get_distribution

from pyramid.httpexceptions import HTTPNotFound
from pyramid.view import static_view
from pyramid.view import view_config

# www is a view for static files; it will be found when all other
# views fail to be found (it's a NotFound view)
www = static_view('{{package}}:static', cache_max_age=86400)
www = view_config(context='pyramid.exceptions.NotFound')(www)

cache_one_hour = 3600
cache_one_day = 86400
never_cache = 0

@view_config(name='versions.json', renderer='json', http_cache=cache_one_hour)
def versions(request):
    pjqm_dist = get_distribution('pyramid_jqm')
    pyramid_dist = get_distribution('pyramid')
    return {'pjqm_version':pjqm_dist.version,
            'pyramid_version':pyramid_dist.version}

@view_config(name='countries.json', renderer='json', http_cache=cache_one_day)
def countries(request):
    return countrylist

@view_config(name='webframeworks.json', renderer='json',
             http_cache=cache_one_day)
def webframeworks(crequest):
    return webframework_list

@view_config(name='get_personalinfo.json', renderer='json',
             http_cache=never_cache)
def get_personalinfo(request):
    return personalinfo

@view_config(name='change_personalinfo.json', renderer='json',
             http_cache=never_cache)
def change_personalinfo(request):
    data = request.json_body
    frameworks = []
    update = dict(frameworks=frameworks)
    for item in data:
        name, value = item['name'], item['value']
        if name == 'newsletter':
            update['newsletter'] = True
        if name == 'frameworks':
            frameworks.append(value)
        else:
            update[name] = value
    if not 'newsletter' in update:
        update['newsletter'] = False
    personalinfo.update(update)
    return {}

personalinfo = {'email':'jqm@example.com', 'firstname':'John',
                'lastname':'Mobile', 'country':'US', 'newsletter':False}

countrylist = [
    {'abbr': 'US', 'name': 'United States'},
    {'abbr': 'CA', 'name': 'Canada'},
    {'abbr': 'AX', 'name': 'Åland Islands'},
    {'abbr': 'AL', 'name': 'Albania'},
    {'abbr': 'DZ', 'name': 'Algeria'},
    {'abbr': 'AS', 'name': 'American Samoa'},
    {'abbr': 'AD', 'name': 'Andorra'},
    {'abbr': 'AO', 'name': 'Angola'},
    {'abbr': 'AI', 'name': 'Anguilla'},
    {'abbr': 'AQ', 'name': 'Antarctica'},
    {'abbr': 'AG', 'name': 'Antigua and Barbuda'},
    {'abbr': 'AR', 'name': 'Argentina'},
    {'abbr': 'AM', 'name': 'Armenia'},
    {'abbr': 'AW', 'name': 'Aruba'},
    {'abbr': 'AU', 'name': 'Australia'},
    {'abbr': 'AT', 'name': 'Austria'},
    {'abbr': 'AZ', 'name': 'Azerbaijan'},
    {'abbr': 'BS', 'name': 'Bahamas'},
    {'abbr': 'BH', 'name': 'Bahrain'},
    {'abbr': 'BD', 'name': 'Bangladesh'},
    {'abbr': 'BB', 'name': 'Barbados'},
    {'abbr': 'BY', 'name': 'Belarus'},
    {'abbr': 'BE', 'name': 'Belgium'},
    {'abbr': 'BZ', 'name': 'Belize'},
    {'abbr': 'BJ', 'name': 'Benin'},
    {'abbr': 'BM', 'name': 'Bermuda'},
    {'abbr': 'BT', 'name': 'Bhutan'},
    {'abbr': 'BO', 'name': 'Bolivia'},
    {'abbr': 'BA', 'name': 'Bosnia and Herzegovina'},
    {'abbr': 'BW', 'name': 'Botswana'},
    {'abbr': 'BV', 'name': 'Bouvet Island'},
    {'abbr': 'BR', 'name': 'Brazil'},
    {'abbr': 'IO', 'name': 'British Indian Ocean Territory'},
    {'abbr': 'BN', 'name': 'Brunei'},
    {'abbr': 'BG', 'name': 'Bulgaria'},
    {'abbr': 'BF', 'name': 'Burkina Faso'},
    {'abbr': 'BI', 'name': 'Burundi'},
    {'abbr': 'KH', 'name': 'Cambodia'},
    {'abbr': 'CM', 'name': 'Cameroon'},
    {'abbr': 'CV', 'name': 'Cape Verde'},
    {'abbr': 'KY', 'name': 'Cayman Islands'},
    {'abbr': 'CF', 'name': 'Central African Republic'},
    {'abbr': 'TD', 'name': 'Chad'},
    {'abbr': 'CL', 'name': 'Chile'},
    {'abbr': 'CN', 'name': 'China'},
    {'abbr': 'CX', 'name': 'Christmas Island'},
    {'abbr': 'CP', 'name': 'Clipperton Island'},
    {'abbr': 'CC', 'name': 'Cocos (Keeling) Islands'},
    {'abbr': 'CO', 'name': 'Colombia'},
    {'abbr': 'KM', 'name': 'Comoros'},
    {'abbr': 'CG', 'name': 'Congo'},
    {'abbr': 'CK', 'name': 'Cook Islands'},
    {'abbr': 'CR', 'name': 'Costa Rica'},
    {'abbr': 'CI', 'name': "Côte d'Ivoire"},
    {'abbr': 'HR', 'name': 'Croatia'},
    {'abbr': 'CU', 'name': 'Cuba'},
    {'abbr': 'CY', 'name': 'Cyprus'},
    {'abbr': 'CZ', 'name': 'Czech Republic'},
    {'abbr': 'DK', 'name': 'Denmark'},
    {'abbr': 'DJ', 'name': 'Djibouti'},
    {'abbr': 'DM', 'name': 'Dominica'},
    {'abbr': 'DO', 'name': 'Dominican Republic'},
    {'abbr': 'CD', 'name': 'DR Congo'},
    {'abbr': 'EC', 'name': 'Ecuador'},
    {'abbr': 'EG', 'name': 'Egypt'},
    {'abbr': 'SV', 'name': 'El Salvador'},
    {'abbr': 'GQ', 'name': 'Equatorial Guinea'},
    {'abbr': 'ER', 'name': 'Eritrea'},
    {'abbr': 'EE', 'name': 'Estonia'},
    {'abbr': 'ET', 'name': 'Ethiopia'},
    {'abbr': 'FK', 'name': 'Falkland Islands (Malvinas)'},
    {'abbr': 'FO', 'name': 'Faroe Islands'},
    {'abbr': 'FJ', 'name': 'Fiji'},
    {'abbr': 'FI', 'name': 'Finland'},
    {'abbr': 'FR', 'name': 'France'},
    {'abbr': 'GF', 'name': 'French Guiana'},
    {'abbr': 'PF', 'name': 'French Polynesia'},
    {'abbr': 'TF', 'name': 'French Southern and Antarctic Lands'},
    {'abbr': 'GA', 'name': 'Gabon'},
    {'abbr': 'GM', 'name': 'Gambia'},
    {'abbr': 'GE', 'name': 'Georgia'},
    {'abbr': 'DE', 'name': 'Germany'},
    {'abbr': 'GH', 'name': 'Ghana'},
    {'abbr': 'GI', 'name': 'Gibraltar'},
    {'abbr': 'GR', 'name': 'Greece'},
    {'abbr': 'GL', 'name': 'Greenland'},
    {'abbr': 'GD', 'name': 'Grenada'},
    {'abbr': 'GP', 'name': 'Guadeloupe'},
    {'abbr': 'GU', 'name': 'Guam'},
    {'abbr': 'GT', 'name': 'Guatemala'},
    {'abbr': 'GG', 'name': 'Guernsey'},
    {'abbr': 'GN', 'name': 'Guinea'},
    {'abbr': 'GW', 'name': 'Guinea-Bissau'},
    {'abbr': 'GY', 'name': 'Guyana'},
    {'abbr': 'HT', 'name': 'Haiti'},
    {'abbr': 'HM', 'name': 'Heard Island and McDonald Islands'},
    {'abbr': 'HN', 'name': 'Honduras'},
    {'abbr': 'HK', 'name': 'Hong Kong'},
    {'abbr': 'HU', 'name': 'Hungary'},
    {'abbr': 'IS', 'name': 'Iceland'},
    {'abbr': 'IN', 'name': 'India'},
    {'abbr': 'ID', 'name': 'Indonesia'},
    {'abbr': 'IR', 'name': 'Iran'},
    {'abbr': 'IQ', 'name': 'Iraq'},
    {'abbr': 'IE', 'name': 'Ireland'},
    {'abbr': 'IM', 'name': 'Isle of Man'},
    {'abbr': 'IL', 'name': 'Israel'},
    {'abbr': 'IT', 'name': 'Italy'},
    {'abbr': 'JM', 'name': 'Jamaica'},
    {'abbr': 'JP', 'name': 'Japan'},
    {'abbr': 'JE', 'name': 'Jersey'},
    {'abbr': 'JO', 'name': 'Jordan'},
    {'abbr': 'KZ', 'name': 'Kazakhstan'},
    {'abbr': 'KE', 'name': 'Kenya'},
    {'abbr': 'KI', 'name': 'Kiribati'},
    {'abbr': 'KW', 'name': 'Kuwait'},
    {'abbr': 'KG', 'name': 'Kyrgyzstan'},
    {'abbr': 'LA', 'name': 'Laos'},
    {'abbr': 'LV', 'name': 'Latvia'},
    {'abbr': 'LB', 'name': 'Lebanon'},
    {'abbr': 'LS', 'name': 'Lesotho'},
    {'abbr': 'LR', 'name': 'Liberia'},
    {'abbr': 'LY', 'name': 'Libya'},
    {'abbr': 'LI', 'name': 'Liechtenstein'},
    {'abbr': 'LT', 'name': 'Lithuania'},
    {'abbr': 'LU', 'name': 'Luxembourg'},
    {'abbr': 'MO', 'name': 'Macau'},
    {'abbr': 'MK', 'name': 'Macedonia'},
    {'abbr': 'MG', 'name': 'Madagascar'},
    {'abbr': 'MW', 'name': 'Malawi'},
    {'abbr': 'MY', 'name': 'Malaysia'},
    {'abbr': 'MV', 'name': 'Maldives'},
    {'abbr': 'ML', 'name': 'Mali'},
    {'abbr': 'MT', 'name': 'Malta'},
    {'abbr': 'MH', 'name': 'Marshall Islands'},
    {'abbr': 'MQ', 'name': 'Martinique'},
    {'abbr': 'MR', 'name': 'Mauritania'},
    {'abbr': 'MU', 'name': 'Mauritius'},
    {'abbr': 'YT', 'name': 'Mayotte'},
    {'abbr': 'MX', 'name': 'Mexico'},
    {'abbr': 'FM', 'name': 'Micronesia'},
    {'abbr': 'MD', 'name': 'Moldova'},
    {'abbr': 'MC', 'name': 'Monaco'},
    {'abbr': 'MN', 'name': 'Mongolia'},
    {'abbr': 'ME', 'name': 'Montenegro'},
    {'abbr': 'MS', 'name': 'Montserrat'},
    {'abbr': 'MA', 'name': 'Morocco'},
    {'abbr': 'MZ', 'name': 'Mozambique'},
    {'abbr': 'MM', 'name': 'Myanmar'},
    {'abbr': 'NA', 'name': 'Namibia'},
    {'abbr': 'NR', 'name': 'Nauru'},
    {'abbr': 'NP', 'name': 'Nepal'},
    {'abbr': 'NL', 'name': 'Netherlands'},
    {'abbr': 'AN', 'name': 'Netherlands Antilles'},
    {'abbr': 'NC', 'name': 'New Caledonia'},
    {'abbr': 'NZ', 'name': 'New Zealand'},
    {'abbr': 'NI', 'name': 'Nicaragua'},
    {'abbr': 'NE', 'name': 'Niger'},
    {'abbr': 'NG', 'name': 'Nigeria'},
    {'abbr': 'NU', 'name': 'Niue'},
    {'abbr': 'NF', 'name': 'Norfolk Island'},
    {'abbr': 'MP', 'name': 'Northern Mariana Islands'},
    {'abbr': 'KP', 'name': 'North Korea'},
    {'abbr': 'NO', 'name': 'Norway'},
    {'abbr': 'OM', 'name': 'Oman'},
    {'abbr': 'PK', 'name': 'Pakistan'},
    {'abbr': 'PW', 'name': 'Palau'},
    {'abbr': 'PS', 'name': 'Palestinian Territory'},
    {'abbr': 'PA', 'name': 'Panama'},
    {'abbr': 'PG', 'name': 'Papua New Guinea'},
    {'abbr': 'PY', 'name': 'Paraguay'},
    {'abbr': 'PE', 'name': 'Peru'},
    {'abbr': 'PH', 'name': 'Philippines'},
    {'abbr': 'PN', 'name': 'Pitcairn Islands'},
    {'abbr': 'PL', 'name': 'Poland'},
    {'abbr': 'PT', 'name': 'Portugal'},
    {'abbr': 'PR', 'name': 'Puerto Rico'},
    {'abbr': 'QA', 'name': 'Qatar'},
    {'abbr': 'RE', 'name': 'R\xc3\xa9union'},
    {'abbr': 'RO', 'name': 'Romania'},
    {'abbr': 'RU', 'name': 'Russia'},
    {'abbr': 'RW', 'name': 'Rwanda'},
    {'abbr': 'BL', 'name': 'Saint Barthélemy'},
    {'abbr': 'SH', 'name': 'Saint Helena, Ascension, and Tristan da Cunha'},
    {'abbr': 'KN', 'name': 'Saint Kitts and Nevis'},
    {'abbr': 'LC', 'name': 'Saint Lucia'},
    {'abbr': 'MF', 'name': 'Saint Martin (French part)'},
    {'abbr': 'PM', 'name': 'Saint Pierre and Miquelon'},
    {'abbr': 'VC', 'name': 'Saint Vincent and the Grenadines'},
    {'abbr': 'WS', 'name': 'Samoa'},
    {'abbr': 'SM', 'name': 'San Marino'},
    {'abbr': 'ST', 'name': 'São Tomé and Príncipe',},
    {'abbr': 'SA', 'name': 'Saudi Arabia'},
    {'abbr': 'SN', 'name': 'Senegal'},
    {'abbr': 'RS', 'name': 'Serbia'},
    {'abbr': 'SC', 'name': 'Seychelles'},
    {'abbr': 'SL', 'name': 'Sierra Leone'},
    {'abbr': 'SG', 'name': 'Singapore'},
    {'abbr': 'SK', 'name': 'Slovakia'},
    {'abbr': 'SI', 'name': 'Slovenia'},
    {'abbr': 'SB', 'name': 'Solomon Islands'},
    {'abbr': 'SO', 'name': 'Somalia'},
    {'abbr': 'ZA', 'name': 'South Africa'},
    {'abbr': 'GS', 'name': 'South Georgia and South Sandwich Islands'},
    {'abbr': 'KR', 'name': 'South Korea'},
    {'abbr': 'ES', 'name': 'Spain'},
    {'abbr': 'LK', 'name': 'Sri Lanka'},
    {'abbr': 'SD', 'name': 'Sudan'},
    {'abbr': 'SR', 'name': 'Suriname'},
    {'abbr': 'SJ', 'name': 'Svalbard'},
    {'abbr': 'SZ', 'name': 'Swaziland'},
    {'abbr': 'SE', 'name': 'Sweden'},
    {'abbr': 'CH', 'name': 'Switzerland'},
    {'abbr': 'SY', 'name': 'Syria'},
    {'abbr': 'TW', 'name': 'Taiwan'},
    {'abbr': 'TJ', 'name': 'Tajikistan'},
    {'abbr': 'TZ', 'name': 'Tanzania'},
    {'abbr': 'TH', 'name': 'Thailand'},
    {'abbr': 'TL', 'name': 'Timor-Leste'},
    {'abbr': 'TG', 'name': 'Togo'},
    {'abbr': 'TK', 'name': 'Tokelau'},
    {'abbr': 'TO', 'name': 'Tonga'},
    {'abbr': 'TT', 'name': 'Trinidad and Tobago'},
    {'abbr': 'TN', 'name': 'Tunisia'},
    {'abbr': 'TR', 'name': 'Turkey'},
    {'abbr': 'TM', 'name': 'Turkmenistan'},
    {'abbr': 'TC', 'name': 'Turks and Caicos Islands'},
    {'abbr': 'TV', 'name': 'Tuvalu'},
    {'abbr': 'UG', 'name': 'Uganda'},
    {'abbr': 'UA', 'name': 'Ukraine'},
    {'abbr': 'AE', 'name': 'United Arab Emirates'},
    {'abbr': 'GB', 'name': 'United Kingdom'},
    {'abbr': 'UM', 'name': 'United States Minor Outlying Islands'},
    {'abbr': 'XX', 'name': 'Unknown'},
    {'abbr': 'UY', 'name': 'Uruguay'},
    {'abbr': 'UZ', 'name': 'Uzbekistan'},
    {'abbr': 'VU', 'name': 'Vanuatu'},
    {'abbr': 'VA', 'name': 'Vatican City (Holy See)'},
    {'abbr': 'VE', 'name': 'Venezuela'},
    {'abbr': 'VN', 'name': 'Vietnam'},
    {'abbr': 'VG', 'name': 'Virgin Islands (British)'},
    {'abbr': 'VI', 'name': 'Virgin Islands (U.S.)'},
    {'abbr': 'WF', 'name': 'Wallis and Futuna'},
    {'abbr': 'EH', 'name': 'Western Sahara'},
    {'abbr': 'YE', 'name': 'Yemen'},
    {'abbr': 'ZM', 'name': 'Zambia'},
    {'abbr': 'ZW', 'name': 'Zimbabwe'}
    ]

webframework_list = [
    {'name': 'python',
     'desc': 'Python',
     'children':
     [
         {'name':'pyramid', 'desc':'Pyramid'},
         {'name':'pylons', 'desc':'Pylons'},
         {'name':'django', 'desc':'Django'},
         {'name':'turbogears', 'desc':'TurboGears'},
         {'name':'zope', 'desc':'Zope'},
         {'name':'grok', 'desc':'Grok'},
         {'name':'flask', 'desc':'Flask'},
         {'name':'bottle', 'desc':'Bottle'},
         ],
     },
    {'name': 'ruby',
     'desc': 'Ruby',
     'children':
     [
         {'name':'rails', 'desc':'Rails'},
         {'name':'merb', 'desc':'Merb'},
         {'name':'camping', 'desc':'Camping'},
         {'name':'sinatra', 'desc':'Sinatra'},
         ],
     },
    {'name': 'php',
     'desc': 'PHP',
     'children':
     [
         {'name':'zend', 'desc':'Zend'},
         {'name':'symfony', 'desc':'Symfony'},
         ],
    },
]

@view_config(route_name="languages", renderer='templates/language_info.pt',
             http_cache=cache_one_day)
def language_info(crequest):
    for info in webframework_list:
        if info['name'] == crequest.matchdict['name']:
            return info
    return HTTPNotFound()
