#coding=utf-8
import pymongo
import uuid
import config
import time
import re
from bson.objectid import ObjectId

class UserAction:
    def __init__(self):
        self.con = pymongo.Connection("localhost", 27017)
        self.db = self.con.bookstore

    def __delete__(self):
        self.con.close()

    def register(self,username,password,email):
        if self.db.users.find_one({'username':username}) is None:
            user = {
                'username':username,
                'password':str(uuid.uuid5(config.PASSWORD_NAME_SPACE,str(password))),
                'email':email,
                'basket':[],
                'orders':[]
            }
            self.db.users.insert(user)
            return "success"
        else:
            return "nameerror"

    def check_user(self,username,password):
        user = self.db.users.find_one({'username':username,
            'password':str(uuid.uuid5(config.PASSWORD_NAME_SPACE,str(password)))})
        if user is not None:
            return "success"
        else:
            return "error"

    def get_book_detail(self,book_id):
        return self.db.books.find_one({'_id':ObjectId(book_id)})

    def add_book(self,title,author,publishers,cover,price,language,classification,isbn,
        description,inventory):
        book = {
            'title':title,
            'author':author,
            'publishers':publishers,
            'cover':cover,
            'price':price,
            'language':language,
            'classification':classification,
            'isbn':isbn,
            'description':description,
            'inventory':inventory,
        }
        self.db.books.insert(book)

    def get_home_page_book(self,num):
        books = self.db.books.find().skip((num-1)*3).limit(num*3)
        return books

    def search_book(self,key_word):
        temp = []
        for i in key_word.keys():
            sword = '.*%s.*'%(key_word[i])
            temp.append({i:re.compile(sword)})

        return self.db.books.find({'$or':temp})

    def add_basket(self,user,book_id,num):
        num = int(num)
        print num,type(num)
        book_name = self.db.books.find_one({'_id':ObjectId(book_id)}).get('title')
        if self.db.users.find_one({'username':user,'basket.book_id':book_id}) is None:
            self.db.users.update({'username':user},{'$push':{'basket':{'book_id':book_id,
                                                                        'book_name':book_name,
                                                                       'num':num}}})
            self.db.books.update({'_id':ObjectId(book_id)},{'$inc':{'inventory':0-num}})
        else:
            self.db.users.update({'username':user,'basket.book_id':book_id},{'$inc':{'basket.$.num':num}})
            self.db.books.update({'_id':ObjectId(book_id)},{'$inc':{'inventory':num}})


    def get_basket(self,user):
        return self.db.users.find_one({'username':user},{'basket':1}).get('basket')

    def forget_password(self,username,email,newpassword):
        user = self.db.users.find_one({'username':username})
        if user is None:
            return 'usernameerror'
        elif email != user.get('email'):
            return "emailerror"
        else:
            self.db.users.update({'username':username},{'password':str(uuid.uuid5(config.PASSWORD_NAME_SPACE,str(newpassword)))})
            return "success"

    def get_book_by_page(self,page):
        return self.db.books.find().skip((int(page)-1)*3).limit(int(page)*3)

    def remove_book_from_basket(self,username,book_id):
        print username ,book_id
        self.db.users.update({'username':username,'basket.book_id':str(book_id)},{'$pop':{'basket':'$'}})
    def get_page_num(self):
        return  int(round(self.db.books.find().explain().get('nscanned')%3,0)+1)

    def add_test_book(self):
        self.add_book(title="编译原理",author="Alfred",publishers="机械工业出版社",
                      cover="u=2178011690,1856320529&fm=21&gp=0.jpg",price=89,
                      language="中文",classification="计算机科学",isbn="978-7-111-25121-7",
                      description="本书深入讨论了编译器设计的重要主题，包括词法分析、语法分析、语法制导分析、类型检查、运行环境、中间代码生成、代码生成、代码优化等，并在最后两章中讨论了实现编译器的一些编程问题和几个编译器实例，每章都提供了大量的练习和参考文献。本书从介绍编译的原理性概念开始，然后通过构建一个简单的编译器来逐一解释这些概念。",
                      inventory=30)
        self.add_book(title="数据库系统概念",author="(美国)希尔伯沙茨",publishers="机械工业出版社",
              cover="2fdda3cc7cd98d1014135c27213fb80e7aec90e4.jpg",price=45.00,
              language="中文",classification="计算机科学",isbn="9787111234227",
              description="《数据库系统概念》特点：综合全面。涵盖了数据模型、关系模型、基于对象的数据库和XML、数据存储和查询、事务管理、数据库系统体系结构等方面的内容。直观易懂。采用直观的方式描述概念，以结构清晰的图示和示例代替形式化的证明。实用性强。以银行数据库实例生动地解释重要概念，通俗易懂。内容新颖。反映了数据库在设计、管理和使用方式等方面的变化及数据库概念方面的发展趋势。深入研究实例。提供四个领先的数据库系统PostgreSQL、Oracle、IBMDB2和MicrosoftSQLServer的实例研究。",
              inventory=40)

        self.add_book(title="Javascript权威指南",author="(美国)弗拉纳根",publishers="机械工业出版社",
              cover="2fdda3cc7cd98d1014135c27213fb80e7aec90e4.jpg",price=139.00,
              language="中文",classification="计算机科学",isbn="9787111216322",
              description="随着Ajax和Web 2.0技术的提出和流行，JavaScript再度受到广大技术人员的重视。但却没有一本从全新视角和层次来介绍JavaScript的参考书。《JavaScript高级程序设计》的出版填补了市场的空白，吸引了众多读者的目光，并且也获得相当不错的销售。而当时，《JavaScript权威指南》原书还处在改版之中。现在，《JaVascript权威指南第5版》虽然姗姗来迟，但必定会给众多期待本书的读者带来如沐春风的感觉。",
              inventory=10)
        self.add_book(title="舞！舞！舞！",author="村上春树",publishers="上海译文出版社",
              cover="11385343fbf2b211450b3e2aca8065380cd78ea9.jpg",price=25.00,
              language="中文",classification="文学",isbn="9787532742950",
              description="《舞！舞！舞！》是村上春树紧接于《挪威的森林》之后发表的又一部重要长篇小说。被誉为《挪威的森林》的姊妹篇。其内容与他的另一部小说《寻羊冒险记》相衔接。小说揭示了资本主义社会的不合理性对人的心灵的扭曲以及这种社会下人的精神孤独和生命的脆弱，在手法上现实与虚幻交织，艺术水准高超。本书在读者中影响广泛。另有郑希怡粤语专辑《舞舞舞》，欧洲电影《舞舞舞》。",
              inventory=10)


if __name__ == '__main__':
    t = UserAction()
    # t.db.users.drop()
    # t.register('coco','541788','9@hloli.cc')
    #t.db.books.drop()
    #t.add_test_book()

    for i in t.db.users.find():
        print i

    # for i in t.db.users.find({'username':'coco','basket.book_id':'54aff185348e3b15ff4258cb'}):
    #     print i

    # t.db.users.update({'username':'coco','basket.book_id':'54aff185348e3b15ff4258cb'},
    #                   {'$pop':{'basket':'$'}})

    t.db.users.update({'username':'coco','basket.book_id':'54aff185348e3b15ff4258cb'},{'$inc':{'basket.$.num':int(1)}})