<?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\Checkout;

use SimplyIn\Session\SimplyInSessionInterface;

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

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

    /**
     * @param string $authToken the authorization this request resolved to - passed in rather than
     *                          re-read from the session, because the pay-again surface runs in a
     *                          session that never held one and would otherwise build an anonymous
     *                          card payload for an authenticated request
     *
     * @return array<string, mixed>
     */
    public function build(string $paymentType, bool $accountCreated, string $authToken = ''): array
    {
        return match ($paymentType) {
            'blik' => $this->buildBlik(),
            'card' => $this->buildCard(),
            'add-card' => $this->buildAddCard($accountCreated, $authToken),
            default => [],
        };
    }

    /**
     * @return array<string, mixed>
     */
    private function buildBlik(): array
    {
        return [
            'blikCode' => $this->session->get('simplyin_payment_blik'),
        ];
    }

    /**
     * @return array<string, mixed>
     */
    private function buildCard(): array
    {
        return [
            'cardName' => $this->session->get('simplyin_card_name'),
            'LastDigitsOfCardNumber' => $this->session->get('simplyin_card_last_digits'),
            'cardProvider' => $this->session->get('simplyin_card_provider'),
            'OTT' => $this->session->get('simplyin_card_ott') ?: '',
            'saveCard' => false,
        ];
    }

    /**
     * @return array<string, mixed>
     */
    private function buildAddCard(bool $accountCreated, string $authToken): array
    {
        $isAuthenticated = $authToken !== '' || $accountCreated;

        if ($isAuthenticated) {
            $cardName = (string) ($this->session->get('simplyin_card_name') ?: '');
            if ($cardName === '') {
                $cardName = 'Karta';
            }
            $saveCard = $accountCreated
                ? true
                : (bool) $this->session->get('simplyin_card_save');
        } else {
            $cardName = '';
            $saveCard = false;
        }

        return [
            'cardName' => $cardName,
            'LastDigitsOfCardNumber' => $this->session->get('simplyin_card_last_digits'),
            'cardProvider' => $this->session->get('simplyin_card_provider'),
            'OTT' => $this->session->get('simplyin_card_ott') ?: '',
            'saveCard' => $saveCard,
        ];
    }
}
