<?php

declare(strict_types=1);

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

final class MerchantPaymentMethod extends Model
{
    public const DEFAULT_FEES = [
        'ideal' => 0.24,
        'paypal' => 0.15,
        'paypal - refund' => 0.40,
        'visa mastercard - refund' => 0.40,
        'visa mastercard - chargeback non-secure' => 0.40,
        'visa mastercard' => 0.29,
        'bancontact' => 0.45,
        'pin' => 0.06,
        'debit (terminal) - maestro pin' => 0.06,
        'debit (terminal) - vpay pin' => 0.06,
        'debit (terminal) - pin (maestro) be' => 0.15,
        'debit (terminal) - pin (v pay) be' => 0.15,
        'debit (terminal) - retourpinnen' => 0.20,
        'debit (terminal) - mastercard debit nl' => 0.06,
        'debit (terminal) - visa debit nl' => 0.06,
        'debit (terminal) - mastercard debit be' => 0.15,
        'debit (terminal) - visa debit be' => 0.15,
        'credit (terminal) - pin (mastercard)' => 0.06,
        'credit (terminal) - pin (visa)' => 0.06,
        'credit (terminal) - pin (american express)' => 0.06,
        'gateway (terminal) - pin (eigen contract)' => 0.06,
        'giropay' => 0.29,
        'sofortbanking' => 0.39,
        'sofort e-commerce' => 0.39,
        'sofortbanking - sofort e-commerce' => 0.39,
        'maestro' => 0.29,
        'overboeking (sct)' => 0.40,
        'payconiq - payconiq belgie' => 0.40,
        'american express - amex (full service)' => 0.29,
        'american express - refund (full service)' => 0.40,
        'carte bancaire - carte bleue' => 0.29,
        'terugbetaling - refund (iban)' => 0.40,
    ];

    public const DEFAULT_PROVISION = [
        'visa mastercard' => 1.90,
        'credit (terminal) - pin (mastercard)' => 1.90,
        'credit (terminal) - pin (visa)' => 1.90,
        'credit (terminal) - pin (american express)' => 1.90,
        'giropay' => 2.00,
        'sofortbanking' => 1.00,
        'sofort e-commerce' => 1.00,
        'sofortbanking - sofort e-commerce' => 1.00,
        'maestro' => 1.90,
        'american express - amex (full service)' => 1.90,
        'carte bancaire - carte bleue' => 1.90,
    ];

    public const DEFAULT_CODES = [
        'ideal' => 'TOM010',
        'pay plus' => 'TOM011',
        'visa mastercard' => 'TOM012',
        'maestro' => 'TOM012',
        'american express - amex (full service)' => 'TOM012',
        'carte bancaire - carte bleue' => 'TOM012',
        'bancontact' => 'TOM013',
        'sofortbanking' => 'TOM014',
        'sofort e-commerce' => 'TOM014',
        'sofortbanking - sofort e-commerce' => 'TOM014',
        'giropay' => 'TOM015',
        'pin' => 'TOM016',
        'debit (terminal) - maestro pin' => 'TOM016',
        'debit (terminal) - vpay pin' => 'TOM016',
        'debit (terminal) - pin (maestro) be' => 'TOM016',
        'debit (terminal) - pin (v pay) be' => 'TOM016',
        'debit (terminal) - mastercard debit nl' => 'TOM016',
        'debit (terminal) - visa debit nl' => 'TOM016',
        'debit (terminal) - mastercard debit be' => 'TOM016',
        'debit (terminal) - visa debit be' => 'TOM016',
        'credit (terminal) - pin (mastercard)' => 'TOM017',
        'credit (terminal) - pin (visa)' => 'TOM017',
        'credit (terminal) - pin (american express)' => 'TOM017',
        'gateway (terminal) - pin (eigen contract)' => 'TOM017',
        'debit (terminal) - retourpinnen' => 'TOM018',
        'paypal - refund' => 'TOM019',
        'visa mastercard - refund' => 'TOM019',
        'visa mastercard - chargeback non-secure' => 'TOM019',
        'american express - refund (full service)' => 'TOM019',
        'terugbetaling - refund (iban)' => 'TOM019',
        'terminal' => 'TOM021',
        'paypal' => 'TOM023',
        'payconiq - payconiq belgie' => 'TOM024',
        'provision' => 'TOM025',
    ];

    protected $table = 'merchants_payment_methods';

    protected $fillable = [
        'payment_method_id',
        'payment_method_name',
        'fee',
        'provision',
        'code',
    ];

    public static function getDefaultFee(string $paymentMethod): float
    {
        return self::DEFAULT_FEES[$paymentMethod];
    }

    public function merchant(): BelongsTo
    {
        return $this->belongsTo(Merchant::class);
    }
}
