<?php

namespace App\Repositories\Eloquent;

use App\Models\ProfessionalPayout;
use App\Repositories\Interfaces\ProfessionalPayoutRepositoryInterface;

class ProfessionalPayoutRepository extends BaseRepository implements ProfessionalPayoutRepositoryInterface
{
    public function __construct(ProfessionalPayout $model)
    {
        parent::__construct($model);
    }

    public function totalPaidForProfessional(int $professionalId): float
    {
        return (float) $this->model
            ->where('professional_id', $professionalId)
            ->where('status', 'paid')
            ->sum('amount');
    }

    public function paidForProfessional(int $professionalId): array
    {
        return $this->model
            ->where('professional_id', $professionalId)
            ->where('status', 'paid')
            ->with(['bookings.client.profile'])
            ->latest('paid_at')
            ->get()
            ->map(function (ProfessionalPayout $payout) {
                $proofPath = ltrim((string) $payout->proof_path, '/');
                if (str_starts_with($proofPath, 'storage/')) {
                    $proofPath = substr($proofPath, strlen('storage/'));
                }

                return [
                    'id' => $payout->id,
                    'amount' => (float) $payout->amount,
                    'status' => $payout->status,
                    'reference' => $payout->reference,
                    'paid_at' => optional($payout->paid_at)->toISOString(),
                    'created_at' => optional($payout->created_at)->toISOString(),
                    'proof_url' => $proofPath !== '' ? asset("storage/{$proofPath}") : null,
                    'proof_download_url' => $proofPath !== ''
                        ? url("api/v1/professionals/payouts/{$payout->id}/proof")
                        : null,
                    'proof_name' => $payout->proof_original_name,
                    'proof_mime_type' => $payout->proof_mime_type,
                    'bookings' => $payout->bookings->map(fn ($booking) => [
                        'booking_id' => $booking->uuid,
                        'client_name' => $booking->client?->profile?->full_name ?? 'Client',
                        'date' => (string) $booking->date,
                        'time' => (string) $booking->time,
                        'type' => (string) $booking->type,
                        'amount' => (float) ($booking->professional_net_amount ?? $booking->amount ?? 0),
                        'released_at' => optional($booking->released_at)->toISOString(),
                    ])->values()->all(),
                ];
            })
            ->values()
            ->all();
    }
}
