<?php

namespace App\Models\Tenants;

use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\Crypt;

/**
 * 카드 모델
 *
 * @property int $id
 * @property int $tenant_id
 * @property string $card_company
 * @property string $card_number_encrypted
 * @property string $card_number_last4
 * @property string $expiry_date
 * @property string|null $card_password_encrypted
 * @property string $card_name
 * @property string $status
 * @property int|null $assigned_user_id
 * @property int|null $created_by
 * @property int|null $updated_by
 * @property int|null $deleted_by
 */
class Card extends Model
{
    use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;

    protected $table = 'cards';

    protected $fillable = [
        'tenant_id',
        'card_company',
        'card_number_encrypted',
        'card_number_last4',
        'expiry_date',
        'card_password_encrypted',
        'card_name',
        'status',
        'assigned_user_id',
        'created_by',
        'updated_by',
        'deleted_by',
    ];

    protected $hidden = [
        'card_number_encrypted',
        'card_password_encrypted',
    ];

    protected $attributes = [
        'status' => 'active',
    ];

    // =========================================================================
    // 관계 정의
    // =========================================================================

    /**
     * 담당자
     */
    public function assignedUser(): BelongsTo
    {
        return $this->belongsTo(User::class, 'assigned_user_id');
    }

    /**
     * 생성자
     */
    public function creator(): BelongsTo
    {
        return $this->belongsTo(User::class, 'created_by');
    }

    /**
     * 수정자
     */
    public function updater(): BelongsTo
    {
        return $this->belongsTo(User::class, 'updated_by');
    }

    // =========================================================================
    // 암호화/복호화 메서드
    // =========================================================================

    /**
     * 카드번호 암호화 설정
     */
    public function setCardNumber(string $cardNumber): void
    {
        $this->card_number_encrypted = Crypt::encryptString($cardNumber);
        $this->card_number_last4 = substr($cardNumber, -4);
    }

    /**
     * 카드번호 복호화 조회
     */
    public function getDecryptedCardNumber(): string
    {
        return Crypt::decryptString($this->card_number_encrypted);
    }

    /**
     * 카드 비밀번호 암호화 설정
     */
    public function setCardPassword(?string $password): void
    {
        $this->card_password_encrypted = $password
            ? Crypt::encryptString($password)
            : null;
    }

    /**
     * 카드 비밀번호 복호화 조회
     */
    public function getDecryptedCardPassword(): ?string
    {
        return $this->card_password_encrypted
            ? Crypt::decryptString($this->card_password_encrypted)
            : null;
    }

    // =========================================================================
    // 헬퍼 메서드
    // =========================================================================

    /**
     * 마스킹된 카드번호 조회
     */
    public function getMaskedCardNumber(): string
    {
        return '****-****-****-'.$this->card_number_last4;
    }

    /**
     * 활성 상태 여부
     */
    public function isActive(): bool
    {
        return $this->status === 'active';
    }

    /**
     * 상태 토글
     */
    public function toggleStatus(): void
    {
        $this->status = $this->status === 'active' ? 'inactive' : 'active';
    }
}
