<?php

namespace App\Services;

use App\Models\Media;
use App\Traits\RemoveArchiveS3;
use App\Traits\UploadsFile;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Http\UploadedFile;

class MediaService
{
    use RemoveArchiveS3, UploadsFile;

    public function getAll(): Collection
    {
        return Media::query()
            ->with(['user'])
            ->orderBy('created_at', 'desc')
            ->get();
    }

    public function findById(int $id): ?Media
    {
        return Media::with(['user'])->find($id);
    }

    public function create(array $data): Media
    {
        return Media::create($data);
    }

    public function update(int $id, array $data): ?Media
    {
        $model = $this->findById($id);

        if (! $model) {
            return null;
        }

        $model->update($data);

        return $model->fresh(['user']);
    }

    public function delete(int $id): bool
    {
        $model = $this->findById($id);

        if (! $model) {
            return false;
        }

        return $model->delete();
    }

    public function createFromFile(UploadedFile $file, string $folder, string $source, int $sourceId, ?string $filename = null): Media
    {
        $path = $this->uploadFile($file, $folder, $filename);

        return Media::create([
            'source'    => $source,
            'source_id' => $sourceId,
            'name'      => $file->getClientOriginalName(),
            'path'      => $path,
        ]);
    }

    public function replaceFile(UploadedFile $newFile, string $folder, string $source, int $sourceId, ?Media $old = null, ?string $filename = null): Media
    {
        if ($old) {
            $this->removeArchiveByPath($old->path);
            $old->delete();
        }

        return $this->createFromFile($newFile, $folder, $source, $sourceId, $filename);
    }
}
