<?php

namespace App\Services\Account;

use App\Models\User;
use App\Services\Media\MediaService;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use Illuminate\Validation\ValidationException;

class ProfileService
{
    public function __construct(
        private readonly MediaService $mediaService,
    ) {}

    public function update(array $validated, User $user): void
    {
        try {
            DB::transaction(function () use ($user, $validated): void {
                $user->update([
                    'email' => $validated['email'],
                    'username' => $validated['username'],
                ]);

                $profile = $user->profile()->updateOrCreate(
                    ['user_id' => $user->id],
                    [
                        'full_name' => $validated['full_name'],
                        'phone_number' => $validated['phone_number'] ?? null,
                        'gender' => $validated['gender'] ?? null,
                        'birth_date' => $validated['birth_date'] ?? null,
                        'address' => $validated['address'] ?? null,
                    ],
                );

                $newFiles = ! empty($validated['profile_photo']) ? [$validated['profile_photo']] : [];
                $removeIds = $validated['remove_profile_photo_ids'] ?? [];

                $this->mediaService->syncCollection($profile, 'profile_photo', $newFiles, $removeIds, 1);
            });
        } catch (ValidationException $e) {
            throw $e;
        } catch (\Throwable $e) {
            Log::error('Gagal memperbarui profil: '.$e->getMessage(), [
                'trace' => $e->getTraceAsString(),
            ]);

            throw ValidationException::withMessages([
                'system' => 'Terjadi kesalahan pada server. Silakan laporkan masalah ini ke pihak terkait.',
            ]);
        }
    }

    public function updatePassword(User $user, string $password): void
    {
        $user->update([
            'password' => Hash::make($password),
        ]);
    }
}
