<?php

declare(strict_types=1);

namespace Xentral\Modules\SubscriptionCycle\Data;

use DateTimeImmutable;
use DateTimeInterface;

final class SubscriptionCycleCacheData
{

    /** @var int $subscriptionArticleId */
    private $subscriptionArticleId;

    /** @var DateTimeInterface $startDate */
    private $startDate;

    /** @var DateTimeInterface $calculationBaseDate */
    private $calculationBaseDate;

    /** @var float $startMonthPriceFactor */
    private $startMonthPriceFactor;

    /** @var int $cyclesCount */
    private $cyclesCount;

    private function __construct()
    {
    }

    /**
     * @param array $data
     *
     * @return SubscriptionCycleCacheData
     */
    public static function fromDbState(array $data): SubscriptionCycleCacheData
    {
        $cacheData = new SubscriptionCycleCacheData();

        $cacheData->subscriptionArticleId = (int)$data['subscription_article_id'];
        $cacheData->startDate = new DateTimeImmutable($data['start_date']);
        $cacheData->cyclesCount = (int)$data['cycles_count'];
        $cacheData->calculationBaseDate = new DateTimeImmutable($data['calculation_base_date']);
        $cacheData->startMonthPriceFactor = (float)$data['start_month_price_factor'];

        return $cacheData;
    }

    /**
     * @return int
     */
    public function getSubscriptionArticleId(): int
    {
        return $this->subscriptionArticleId;
    }

    /**
     * @return DateTimeInterface
     */
    public function getStartDate(): DateTimeInterface
    {
        return $this->startDate;
    }

    /**
     * @return DateTimeInterface
     */
    public function getCalculationBaseDate(): DateTimeInterface
    {
        return $this->calculationBaseDate;
    }

    /**
     * @return float
     */
    public function getStartMonthPriceFactor(): float
    {
        return $this->startMonthPriceFactor;
    }

    /**
     * @return int
     */
    public function getCyclesCount(): int
    {
        return $this->cyclesCount;
    }
}