<?php

namespace App\Pricing\ValueObject;

/**
 * نتیجهٔ زنجیرهٔ قیمت‌گذاری، پیش از اینکه جایی ذخیره شود.
 *
 * همان اعدادی که `PriceSnapshot` نگه می‌دارد — عمداً یک شکل، تا «قیمتی که به کاربر
 * نشان دادیم» و «قیمتی که ثبت کردیم» نتوانند واگرا شوند.
 */
final readonly class PriceQuote
{
    /** @param list<array<string, mixed>> $discounts */
    public function __construct(
        public int $baseRials,
        public int $itemsRials,
        public int $discountRials,
        public int $insuranceBaseRials,
        public int $insuranceSupplementaryRials,
        public int $taxRials,
        public int $finalRials,
        public int $depositRials,
        public array $discounts = [],
        public array $sources = [],
        /**
         * پکیج در پیش‌نمایش **مصرف نمی‌شود** — فقط اعلام می‌شود. مصرف واقعی هنگام
         * ثبت نهایی است، وگرنه هر رفرش صفحه یک جلسه از بیمار می‌گرفت.
         */
        public bool $packageWillBeConsumed = false,
        public ?string $packageUuid = null,
    ) {}

    public function breakdown(): array
    {
        return ['discounts' => $this->discounts, 'sources' => $this->sources];
    }

    public function toArray(): array
    {
        return [
            'base_rials'                    => $this->baseRials,
            'items_rials'                   => $this->itemsRials,
            'discount_rials'                => $this->discountRials,
            'insurance_base_rials'          => $this->insuranceBaseRials,
            'insurance_supplementary_rials' => $this->insuranceSupplementaryRials,
            'tax_rials'                     => $this->taxRials,
            'final_rials'                   => $this->finalRials,
            'deposit_rials'                 => $this->depositRials,
            'package_will_be_consumed'      => $this->packageWillBeConsumed,
            'package_uuid'                  => $this->packageUuid,
            'breakdown'                     => $this->breakdown(),
        ];
    }
}
