text: # -*- coding: utf-8 -*-
  """
      :author: Grey Li (李辉)
      :url: http://greyli.com
      :copyright: © 2018 Grey Li <withlihui@gmail.com>
      :license: MIT, see LICENSE for more details.
  """
  import os
  import random
  
  from PIL import Image
  from faker import Faker
  from flask import current_app
  from sqlalchemy.exc import IntegrityError
  
  from albumy.extensions import db
  from albumy.models import User, Photo, Tag, Comment, Notification, Category, Post
  
  fake = Faker()
  
  
  def fake_admin():
      admin = User(name='Grey Li',
                   username='greyli',
                   email='admin@helloflask.com',
                   bio=fake.sentence(),
                   website='http://greyli.com',
                   confirmed=True)
      admin.set_password('helloflask')
      notification = Notification(message='Hello, welcome to Albumy.', receiver=admin)
      db.session.add(notification)
      db.session.add(admin)
      db.session.commit()
  
  
  def fake_user(count=10):
      for i in range(count):
          user = User(name=fake.name(),
                      confirmed=True,
                      username=fake.user_name(),
                      bio=fake.sentence(),
                      location=fake.city(),
                      website=fake.url(),
                      member_since=fake.date_this_decade(),
                      email=fake.email())
          user.set_password('123456')
          db.session.add(user)
          try:
              db.session.commit()
          except IntegrityError:
              db.session.rollback()
  
  
  def fake_follow(count=30):
      for i in range(count):
          user = User.query.get(random.randint(1, User.query.count()))
          user.follow(User.query.get(random.randint(1, User.query.count())))
      db.session.commit()
  
  
  def fake_tag(count=20):
      for i in range(count):
          tag = Tag(name=fake.word())
          db.session.add(tag)
          try:
              db.session.commit()
          except IntegrityError:
              db.session.rollback()
  
  
  def fake_photo(count=30):
      # photos
      upload_path = current_app.config['ALBUMY_UPLOAD_PATH']
      for i in range(count):
          print(i)
  
          filename = 'random_%d.jpg' % i
          r = lambda: random.randint(128, 255)
          img = Image.new(mode='RGB', size=(800, 800), color=(r(), r(), r()))
          img.save(os.path.join(upload_path, filename))
  
          photo = Photo(
              description=fake.text(),
              filename=filename,
              filename_m=filename,
              filename_s=filename,
              author=User.query.get(random.randint(1, User.query.count())),
              timestamp=fake.date_time_this_year()
          )
  
          # tags
          for j in range(random.randint(1, 5)):
              tag = Tag.query.get(random.randint(1, Tag.query.count()))
              if tag not in photo.tags:
                  photo.tags.append(tag)
  
          db.session.add(photo)
      db.session.commit()
  
  
  def fake_collect(count=50):
      for i in range(count):
          user = User.query.get(random.randint(1, User.query.count()))
          user.collect(Photo.query.get(random.randint(1, Photo.query.count())))
      db.session.commit()
  
  
  def fake_comment(count=100):
      for i in range(count):
          comment = Comment(
              author=User.query.get(random.randint(1, User.query.count())),
              body=fake.sentence(),
              timestamp=fake.date_time_this_year(),
              photo=Photo.query.get(random.randint(1, Photo.query.count()))
          )
          db.session.add(comment)
      db.session.commit()
  
  
  def fake_categories(count=10):
      category = Category(name='Default')
      db.session.add(category)
  
      for i in range(count):
          category = Category(name=fake.word())
          db.session.add(category)
          try:
              db.session.commit()
          except IntegrityError:
              db.session.rollback()
  
  
  def fake_posts(count=50):
      for i in range(count):
          post = Post(
              title=fake.sentence(),
              body=fake.text(2000),
              category=Category.query.get(random.randint(1, Category.query.count())),
              timestamp=fake.date_time_this_year()
          )
  
          db.session.add(post)
      db.session.commit()
  