<?php

declare(strict_types=1);

/*
 * Copyright Humbly Arrogant Software Limited 2020-2023.
 *
 * Use of this software is governed by the Business Source License included in the LICENSE file and at https://getparthenon.com/docs/next/license.
 *
 * Change Date: 26.06.2026 ( 3 years after 2.2.0 release )
 *
 * On the date above, in accordance with the Business Source License, use of this software will be governed by the open source license specified in the LICENSE file.
 */

namespace Parthenon\Billing\Plan;

use Parthenon\Billing\Exception\NoPlanFoundException;

class CachedPlanManager implements PlanManagerInterface
{
    public const REDIS_STORAGE_KEY = 'parthenon_plan';
    private ?array $plans = null;

    public function __construct(
        private PlanManagerInterface $planManager,
        private \Redis $redis,
    ) {
    }

    public function getPlans(): array
    {
        if (!isset($this->plans)) {
            $rawData = $this->redis->get(self::REDIS_STORAGE_KEY);

            if (!$rawData) {
                $this->plans = $this->planManager->getPlans();
                $rawData = serialize($this->plans);
                $this->redis->set(self::REDIS_STORAGE_KEY, $rawData);
            } else {
                $this->plans = unserialize($rawData);
            }
        }

        return $this->plans;
    }

    public function getPlanForUser(LimitedUserInterface $limitedUser): Plan
    {
        return $this->getPlanByName($limitedUser->getPlanName());
    }

    public function getPlanByName(string $planName): Plan
    {
        $plans = $this->getPlans();

        foreach ($plans as $plan) {
            if ($plan->getName() === $planName) {
                return $plan;
            }
        }
        throw new NoPlanFoundException();
    }
}
