<?php

/**
 * Copyright 2024-2025 Simply.IN Sp. z o.o.
 *
 * NOTICE OF LICENSE
 *
 * Licensed under the EUPL-1.2 or later.
 * You may not use this work except in compliance with the Licence.
 *
 * Copy of the Licence is available at:
 * https://joinup.ec.europa.eu/software/page/eupl
 * It is bundled with this package in the file LICENSE.txt
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the Licence is distributed on an as is basis,
 * without warranties or conditions of any kind, either express or implied.
 * Check the Licence for the specific language governing permissions
 * and limitations under the License.
 *
 * @author   Simply.IN Sp. z o.o.
 * @copyright 2024-2025 Simply.IN Sp. z o.o.
 * @license   https://joinup.ec.europa.eu/software/page/eupl
 */

declare(strict_types=1);

namespace SimplyIn\Ajax\Service;

use SimplyIn\Session\SimplyInSessionInterface;

if (!defined('_PS_VERSION_')) {
    exit;
}

class CheckoutSessionService
{
    private const KEY_BILLING = 'simplyin_billing';
    private const KEY_SHIPPING = 'simplyin_shipping';
    private const KEY_PARCEL = 'simplyin_parcel';
    private const KEY_SERVICE_TYPE = 'service_type';
    private const KEY_AUTH_TOKEN = 'simplyin_auth_token';
    private const KEY_SHOP_LOGIN_CHALLENGE_EMAIL = 'simplyin_shop_login_challenge_email';

    public function __construct(private readonly SimplyInSessionInterface $session)
    {
    }

    public function getSelectedShipping(): false|string
    {
        return $this->readNonEmpty(self::KEY_SHIPPING);
    }

    public function getSelectedBilling(): false|string
    {
        return $this->readNonEmpty(self::KEY_BILLING);
    }

    public function getSelectedParcel(): false|string
    {
        return $this->readNonEmpty(self::KEY_PARCEL);
    }

    public function getServiceType(): false|string
    {
        return $this->readNonEmpty(self::KEY_SERVICE_TYPE);
    }

    public function getAuthToken(): false|string
    {
        $token = $this->session->get(self::KEY_AUTH_TOKEN, false);

        return is_string($token) && $token !== '' ? $token : false;
    }

    /**
     * Email-first shop-login challenge: the email the OTP was sent to is pinned server-side in the
     * session at send time. Verify/resend must use this value and never a request-supplied email —
     * otherwise a shopper could verify a code that was e-mailed to one address while logging into
     * an account keyed by another.
     */
    public function getShopLoginChallengeEmail(): false|string
    {
        return $this->readNonEmpty(self::KEY_SHOP_LOGIN_CHALLENGE_EMAIL);
    }

    public function storeShopLoginChallengeEmail(string $email): void
    {
        $this->session->set(self::KEY_SHOP_LOGIN_CHALLENGE_EMAIL, $email);
    }

    public function clearShopLoginChallengeEmail(): void
    {
        $this->session->unset(self::KEY_SHOP_LOGIN_CHALLENGE_EMAIL);
    }

    public function storeSelection(
        string $billingId,
        string $shippingId,
        string $parcelId,
        string $serviceType,
    ): void {
        $this->session->set(self::KEY_BILLING, $billingId);
        $this->session->set(self::KEY_SHIPPING, $shippingId);
        $this->session->set(self::KEY_PARCEL, $parcelId);
        $this->session->set(self::KEY_SERVICE_TYPE, $serviceType);
    }

    public function storePsAddressIds(int $idAddressDelivery, int $idAddressInvoice): void
    {
        $this->session->set('simplyin_id_address_delivery', $idAddressDelivery);
        $this->session->set('simplyin_id_address_invoice', $idAddressInvoice);
    }

    public function clearPsAddressIds(): void
    {
        $this->session->unset(['simplyin_id_address_delivery', 'simplyin_id_address_invoice']);
    }

    private function readNonEmpty(string $key): false|string
    {
        $value = $this->session->get($key, '');

        return is_string($value) && $value !== '' ? $value : false;
    }
}
