<?php

namespace App\Models\ESign;

use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;

class EsignSigner extends Model
{
    use BelongsToTenant;

    protected $table = 'esign_signers';

    // 역할 상수
    public const ROLE_CREATOR = 'creator';
    public const ROLE_COUNTERPART = 'counterpart';

    // 상태 상수
    public const STATUS_WAITING = 'waiting';
    public const STATUS_NOTIFIED = 'notified';
    public const STATUS_AUTHENTICATED = 'authenticated';
    public const STATUS_SIGNED = 'signed';
    public const STATUS_REJECTED = 'rejected';

    public const STATUSES = [
        self::STATUS_WAITING,
        self::STATUS_NOTIFIED,
        self::STATUS_AUTHENTICATED,
        self::STATUS_SIGNED,
        self::STATUS_REJECTED,
    ];

    protected $fillable = [
        'tenant_id',
        'contract_id',
        'role',
        'sign_order',
        'name',
        'email',
        'phone',
        'access_token',
        'token_expires_at',
        'otp_code',
        'otp_expires_at',
        'otp_attempts',
        'auth_verified_at',
        'signature_image_path',
        'signed_at',
        'consent_agreed_at',
        'sign_ip_address',
        'sign_user_agent',
        'status',
        'rejected_reason',
    ];

    protected $casts = [
        'sign_order' => 'integer',
        'otp_attempts' => 'integer',
        'token_expires_at' => 'datetime',
        'otp_expires_at' => 'datetime',
        'auth_verified_at' => 'datetime',
        'signed_at' => 'datetime',
        'consent_agreed_at' => 'datetime',
    ];

    protected $hidden = [
        'access_token',
        'otp_code',
    ];

    // === Relations ===

    public function contract(): BelongsTo
    {
        return $this->belongsTo(EsignContract::class, 'contract_id');
    }

    public function signFields(): HasMany
    {
        return $this->hasMany(EsignSignField::class, 'signer_id');
    }

    // === Helpers ===

    public function isVerified(): bool
    {
        return $this->auth_verified_at !== null;
    }

    public function hasSigned(): bool
    {
        return $this->signed_at !== null;
    }

    public function canSign(): bool
    {
        return $this->isVerified()
            && ! $this->hasSigned()
            && $this->status !== self::STATUS_REJECTED
            && $this->contract->canSign();
    }
}
