<?php

namespace App\Packages\Capsule\Models;

use App\Packages\Capsule\Repository\CapsuleCommentRepository;
use App\Packages\Core\Traits\RepositoryTrait;
use App\Packages\User\Models\User;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Carbon;
use Ramsey\Uuid\Uuid;

/**
 * @property int $id
 * @property string $uuid
 * @property int $user_id
 * @property int $capsule_id
 * @property string $content
 *
 * @property string|Carbon $created_at
 * @property string|Carbon $updated_at
 * @property string|Carbon $deleted_at
 *
 * @property User $user
 * @property Capsule $capsule
 *
 * @method static CapsuleCommentRepository repository()
 */
class CapsuleComment extends Model
{
	use RepositoryTrait;
	use SoftDeletes;

	/** @var string */
	public static $repositoryClass = CapsuleCommentRepository::class;

	/** @var string */
	protected $table = 'table_capsule_comment';

	protected $dates = [
		'created_at',
		'updated_at',
		'deleted_at',
	];

	public static function boot()
	{
		parent::boot();
		static::creating(function ($model) {
			/** @var static $model */
			$model->uuid = Uuid::uuid4();
		});
	}

	/**
	 * @param Capsule $capsule
	 * @param User $user
	 * @param $content
	 *
	 * @return CapsuleComment
	 */
	public static function createComment(Capsule $capsule, User $user, $content)
	{
		$comment = new CapsuleComment();
		$comment->capsule_id = $capsule->id;
		$comment->user_id = $user->id;
		$comment->content = $content;
		$comment->save();

		$comment->capsule->refreshCommentCount();
		$comment->user->refreshCommentCount();

		return $comment;
	}

	/**
	 * @return BelongsTo
	 */
	public function user()
	{
		return $this->belongsTo(User::class, 'user_id')
            ->with(['avatar']);
	}

	/**
	 * @return BelongsTo
	 */
	public function capsule()
	{
		return $this->belongsTo(Capsule::class, 'capsule_id');
	}
}
