public function copyTo(Media $media, $directory, $filename = null)
    {
        $storage = $this->filesystem->disk($media->disk);

        if ($filename) {
            $filename = $this->removeExtensionFromFilename($filename, $media->extension);
        } else {
            $filename = $media->filename;
        }

        $directory = trim($directory, '/');
        $target_path = $directory.'/'.$filename.'.'.$media->extension;

        if ($storage->has($target_path)) {
            throw MediaMoveException::destinationExists($target_path);
        }

        try {
            $storage->copy($media->getDiskPath(), $target_path);
        } catch (\Exception $exception) {
            throw MediaMoveException::failedToCopy($media->getDiskPath(), $target_path);
        }

        // now we copy the Media object
        /** @var Media $newMedia */
        $newMedia = $media->replicate();
        $newMedia->filename = $filename;
        $newMedia->directory = $directory;

        $newMedia->save();

        return $newMedia;
    }