<?php

namespace App\Cancellation\ValueObject;

/**
 * نتیجهٔ محاسبهٔ لغو — پیش از اینکه چیزی اتفاق بیفتد.
 *
 * همان شکل در پیش‌نمایش و در لغو واقعی برمی‌گردد: بیمار نباید عددی ببیند که با آنچه
 * واقعاً کسر می‌شود فرق دارد.
 */
final readonly class PenaltyResult
{
    /** @param list<string> $notes */
    public function __construct(
        public int $penaltyRials,
        public bool $depositRefundable,
        public bool $creditRefundable,
        public bool $withinFreeWindow,
        public array $notes = [],
    ) {}

    /** لغو توسط کلینیک، یا داخل پنجرهٔ رایگان. */
    public static function free(bool $withinFreeWindow = true, array $notes = []): self
    {
        return new self(0, true, true, $withinFreeWindow, $notes);
    }

    /** @return array<string, mixed> */
    public function toArray(): array
    {
        return [
            'penalty_rials'       => $this->penaltyRials,
            'deposit_refundable'  => $this->depositRefundable,
            'credit_refundable'   => $this->creditRefundable,
            'within_free_window'  => $this->withinFreeWindow,
            'notes'               => $this->notes,
        ];
    }
}
