#!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import print_function
import sys
import os
import re
import unicodedata
import sys
import codecs

if sys.version_info[0] == 3:
    from urllib.request import urlopen
    from urllib.request import urlretrieve
else:
    from urllib import urlopen
    from urllib import urlretrieve
import os.path
import json

class Fickr(object):

    photostream_url = u'http://www.flickr.com/photos/'
    flickrit_url = u'https://flickrit.pboehm.org/photos/'

    def __init__(self):
        self.__username, self.__size = self.get_name_and_quality()

    __valid_sizes = ['sq', 'q', 't', 's', 'n', 'm', 'z', 'c',
                     'l', 'q', 'k', 'o']

    def slugify(self, value):
        value = unicodedata.normalize('NFKD', value)
        value = value.encode('ascii', 'ignore').decode('ascii')
        value = re.sub(r'[^\w\s-]', '', value).strip().lower()
        value = re.sub(r'[-\s]+', '-', value)
        return value

    def download_pic(self, url, name):
        urlretrieve(url, name)

    def get_name_and_quality(self):
        if len(sys.argv) == 1:
            print('Username not found, run "./ficr <username> <size>"')
            print('Sizes: o->Original, q->150x150, k->2048x???')
            exit(1)
        else:
            username = sys.argv[1]
            try:
                size = sys.argv[2]     # Picture-Size (o->Original, q->150x150, k->2048x???)
                if size not in self.__valid_sizes:
                    size = u'o'
            except IndexError:
                size = u'o'
        return [username, size]

    def use_photostream(self):
        try:
            from pyquery import PyQuery as pq
        except ImportError:
            print('please install pyQuery: pip install pyquery')
        doc = pq(url='%s%s' % (self.photostream_url, self.__username))
        for _ in doc('.photo-display-item'):
            doc = pq(url='%s/%s/%s/sizes/%s/' % (self.photostream_url,
                                                 self.__username,
                                                 _.attrib['data-photo-id'],
                                                 self.__size))
            photo_title = u'%s' % doc('meta[name=title]').attr("content")
            link = doc('#allsizes-photo').children().attr('src')
            self.prepare_download(link, photo_title)

    def prepare_download(self, photo_url, photo_title):
        path = self.slugify(u'%s' % self.__username)
        filename = u'%s/%s.jpg' % (path, self.slugify(photo_title))
        if not os.path.exists(path):
            os.mkdir(path)
        if not os.path.isfile(filename):
            print(u'Download: %s' % photo_title)
            self.download_pic(photo_url, filename)
        else:
            print(u'Exists:   %s' % photo_title)

    def use_flickit(self):
        response =  urlopen('%s%s' % (self.flickrit_url, self.__username))
        reader = codecs.getreader("utf-8")
        data = json.load(reader(response))
        if self.__size == 'z':
            key = 'url_z'
        else:
            key = 'url_o'
        for photo in data:
            self.prepare_download(photo[key], photo['title'])

    def get_photos(self):
        try:
            print('use flickrit: %s\nit only supports size o and z' % self.flickrit_url)
            self.use_flickit()
        except Exception:
            print('error flickrit, parse: %s\n' % self.photostream_url)
            self.use_photostream()

if __name__ == "__main__":
    #Execute
    Fickr().get_photos()
