<?php

use App\Packages\Capsule\Models\Capsule;
use App\Packages\Capsule\Models\CapsuleComment;
use App\Packages\Capsule\Models\CapsulePreview;
use App\Packages\Capsule\Models\CapsuleTaggedUser;
use App\Packages\Capsule\Models\CapsuleVideo;
use App\Packages\Friend\Models\FriendInvite;
use App\Packages\Friend\Models\FriendRelation;
use App\Packages\User\Models\UserAvatar;
use App\Packages\User\Models\User;
use App\Packages\User\Models\UserNotification;
use Illuminate\Database\Seeder;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Schema;

/**
 * Class DatabaseSeeder
 */
class DatabaseSeeder extends Seeder
{

	const CAPSULES_COUNT = 10;
	const USERS_COUNT = 100;

	/**
	 * Run the database seeds.
	 *
	 * @return void
	 */
	public function run()
	{
		$this->createUsers();
//
//
//		$this->createCapsules();
//		$this->createTaggedUsers();
//
//
//		$this->createFriendInvites();
//		$this->createFriendRelations();
	}

	/**  */
	public function createCapsules()
	{
		$capsules = factory(Capsule::class, static::CAPSULES_COUNT)
			->create()->each(function (Capsule $capsule) {

				$status = rand(0, 1);
				if (!$status) {
					$capsule->status = Capsule::STATUS_OPENED;
					$capsule->open_at = now()->addDays(rand(1,5));
				} else {
					$capsule->status = $status;
					$capsule->open_at = now();
				}

                // Preview
				$preview = new CapsulePreview();
				$preview->save();

				$capsule->preview()->associate($preview);


                // Video
				$video = new CapsuleVideo();
				$video->save();

                $capsule->video()->associate($video);

                // Comments
				$comments = factory(CapsuleComment::class, rand(0,10))
					->create()->each(function (CapsuleComment $comment) {
						$comment->user_id = rand(0, 10);
						$comment->save();
					});

				$capsule->capsuleComments()
					->saveMany($comments);


				$user = User::repository()
					->query()
					->orderByRaw('RAND()')->first();

				$capsule->user_id = $user->id;

				$capsule->save();
			});

		$this->command->info('Capsules added');
	}

	/**  */
	public function createTaggedUsers()
	{
		$capsules = Capsule::repository()->all();
		$capsules->each(function (Capsule $capsule) {

			$limit = rand(0, 5);
			if ($limit) {
				$users = User::repository()->query()
					//->orderByRaw('RAND()')
					->orderByRaw('RAND()')
					->limit($limit)
					->get();

				$users->each(function (User $user) use ($capsule) {
					$taggedUser = new CapsuleTaggedUser();
					$taggedUser->user_id = $user->id;
					$taggedUser->by_user_id = $capsule->user_id;
					$taggedUser->capsule_id = $capsule->id;
					$taggedUser->save();
				});
			}
		});

		$this->command->info('Tagged users added');
	}

	public function createComments()
	{

	}

	public function createCommentsTaggedUsers()
	{

	}

	/**  */
	public function createFriendRelations()
	{
		$users = User::repository()->all();
		$users->each(function(User $user) use ($users) {

			for ($i = 0; $i <= rand(0,5); $i++) {
				$friend = $users->random();
			//	$relation = FriendRelation::createFriend($user, $friend);
			}
		});

		$this->command->info('Friend Relations created');
	}

	/**  */
	public function createFriendInvites()
	{
		$users = User::repository()->all();
		$users->each(function(User $user) use ($users) {

			for ($i = 0; $i <= rand(0,5); $i++) {
				$friend = $users->random();
			//	$relation = FriendInvite::createInvite($user, $friend);
			}
		});

		$this->command->info('Friend Invites created');
	}

	/**
	 * @return User[]|Collection
	 */
	public function createUsers()
	{
		/** @var Collection|User[] $users */
		$users = factory(User::class, static::USERS_COUNT)
			->create()->each(function (User $user) {

				$avatar = new UserAvatar();
				$avatar->save();

				$user->avatar_id = $avatar->id;
				$user->save();

				factory(UserNotification::class)
					->create()->each(function (UserNotification $notification) use ($user) {

						$notification->user_id = $user->id;
						$notification->save();
					});
			});

		$this->command->info('Users added');

		return $users;
	}

}
