<?php

namespace App\Models\Accounts\Cronogramas;

use App\Enums\Accounts\Cronogramas\CronogramaProjectStatus;
use App\Models\User;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Str;
use DateTimeInterface;

/**
 * Projeto de cronograma pertencente a um usuário da Conta-Angra.
 */
class Project extends Model {

    use SoftDeletes;

    protected $connection = 'mysql';

    public $incrementing = false;

    protected $keyType = 'string';

    protected $table = 'cr_projects';

    protected $fillable = [
        'id',
        'user_id',
        'name',
        'description',
        'status',
        'start_date',
        'planned_end_date',
        'actual_end_date',
        'completion_percent',
        'public_share_enabled',
        'public_share_token',
        'public_share_enabled_at',
    ];

    protected $casts = [
        'start_date' => 'date',
        'planned_end_date' => 'date',
        'actual_end_date' => 'date',
        'completion_percent' => 'decimal:2',
        'public_share_enabled' => 'boolean',
        'public_share_enabled_at' => 'datetime',
    ];

    public static function boot(): void {
        parent::boot();
        static::creating(function (self $model): void {
            if (empty($model->id)) {
                $model->id = (string) Str::uuid();
            }
            if (empty($model->status)) {
                $model->status = CronogramaProjectStatus::Active->value;
            }
            if (empty($model->public_share_token)) {
                $model->public_share_token = Str::random(64);
            }
        });
    }

    protected function serializeDate(DateTimeInterface $date): string {
        return $date->format('Y-m-d H:i:s');
    }

    public function user(): BelongsTo {
        return $this->belongsTo(User::class, 'user_id', 'id');
    }

    public function activities(): HasMany {
        return $this->hasMany(Activity::class, 'project_id', 'id')
            ->orderBy('sort_order')
            ->orderBy('created_at');
    }

    public function activeActivities(): HasMany {
        return $this->activities()->whereNull('deleted_at');
    }

    public function historyLogs(): HasMany {
        return $this->hasMany(HistoryLog::class, 'project_id', 'id')
            ->orderByDesc('created_at');
    }

    public function scopes(): HasMany {
        return $this->hasMany(ProjectScope::class, 'project_id', 'id');
    }

    public function isReadOnly(): bool {
        return CronogramaProjectStatus::tryFrom($this->status)?->isReadOnly() ?? false;
    }

}
