<?php

namespace App\Repositories\Eloquent;

use App\Models\Booking;
use App\Models\Payment;
use App\Models\PaymentSetting;
use Illuminate\Support\Facades\DB;

class PaymentManagementRepository
{
    public function overview(): array
    {
        $setting = PaymentSetting::first() ?? new PaymentSetting([
            'convenience_fee_type' => 'percentage',
            'convenience_fee_value' => 0,
            'platform_fee_percentage' => 10,
            'is_active' => true,
        ]);
        $paidBookings = Booking::where('payment_status', 'paid');

        return [
            'setting' => $setting,
            'stats' => [
                'gross_consultations' => (float) (clone $paidBookings)->sum('amount'),
                'convenience_fees' => (float) (clone $paidBookings)->sum('convenience_fee_amount'),
                'platform_fees' => (float) (clone $paidBookings)->sum('platform_fee_amount'),
                'professional_net' => (float) (clone $paidBookings)->sum(DB::raw('COALESCE(professional_net_amount, amount)')),
                'paid_transactions' => Payment::whereRaw('LOWER(status) = ?', ['paid'])->count(),
            ],
            'payments' => Payment::with(['booking.client.profile', 'booking.professional.user.profile'])
                ->whereRaw('LOWER(status) = ?', ['paid'])->latest()->paginate(10)->withQueryString(),
        ];
    }

    public function updateSetting(array $data): PaymentSetting
    {
        $setting = PaymentSetting::first();
        if (! $setting) {
            return PaymentSetting::create($data);
        }

        $setting->update($data);

        return $setting->refresh();
    }
}
