<?php

namespace App\Models;

use App\Models\Concerns\BelongsToCompany;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne;

class Offboarding extends Model
{
    use BelongsToCompany;

    public const STATUS_IN_PROGRESS = 'in_progress';

    public const STATUS_CLEARANCE_PENDING = 'clearance_pending';

    public const STATUS_CLEARED = 'cleared';

    public const STATUS_COMPLETED = 'completed';

    public const STATUS_CANCELLED = 'cancelled';

    protected $table = 'offboardings';

    protected $fillable = [
        'company_id',
        'user_id',
        'offboarding_date',
        'last_working_date',
        'notice_period_days',
        'type',
        'status',
        'reason',
        'notes',
    ];

    protected $casts = [
        'offboarding_date' => 'date',
        'last_working_date' => 'date',
        'notice_period_days' => 'integer',
    ];

    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }

    public function checklistItems(): HasMany
    {
        return $this->hasMany(OffboardingChecklistItem::class)->orderBy('display_order');
    }

    public function fnfSettlement(): HasOne
    {
        return $this->hasOne(FnfSettlement::class);
    }

    public function clearanceProgress(): array
    {
        $items = $this->checklistItems;
        $total = $items->count();
        if ($total === 0) {
            return ['total' => 0, 'completed' => 0, 'percent' => 0];
        }

        $completed = $items->whereIn('status', [
            OffboardingChecklistItem::STATUS_COMPLETED,
            OffboardingChecklistItem::STATUS_WAIVED,
            OffboardingChecklistItem::STATUS_NA,
        ])->count();

        return [
            'total' => $total,
            'completed' => $completed,
            'percent' => (int) round(($completed / $total) * 100),
        ];
    }

    public function isClearanceComplete(): bool
    {
        $progress = $this->clearanceProgress();

        return $progress['total'] > 0 && $progress['completed'] === $progress['total'];
    }
}
