package Geo::GDAL::FFI::VSI;
use v5.10;
use strict;
use warnings;
use Encode qw(decode encode);
use Carp;
use FFI::Platypus::Buffer;
require Exporter;

our $VERSION = 0.0900;

our @ISA = qw(Exporter);
our @EXPORT_OK = qw(Mkdir Rmdir ReadDir FOpen Unlink Rename);

sub FOpen {
    return Geo::GDAL::FFI::VSI::File->Open(@_);
}

sub Unlink {
    my ($path) = @_;
    my $e = Geo::GDAL::FFI::VSIUnlink(encode(utf8 => $path));
    confess Geo::GDAL::FFI::error_msg() // "Failed to unlink '$path'." if $e == -1;
}

sub Rename {
    my ($path, $new_path) = @_;
    my $e = Geo::GDAL::FFI::VSIRename(encode(utf8 => $path), encode(utf8 => $new_path));
    confess Geo::GDAL::FFI::error_msg() // "Failed to rename '$path' to '$new_path'." if $e == -1;
}

sub Mkdir {
    my ($path, $mode) = @_;
    $mode //= hex '0x0666';
    my $e = Geo::GDAL::FFI::VSIMkdir(encode(utf8 => $path), $mode);
    confess Geo::GDAL::FFI::error_msg() // "Failed to mkdir '$path'." if $e == -1;
}

sub Rmdir {
    my ($path) = @_;
    my $e = Geo::GDAL::FFI::VSIRmdir(encode(utf8 => $path));
    confess Geo::GDAL::FFI::error_msg() // "Failed to rmdir '$path'." if $e == -1;
}

sub ReadDir {
    my ($path, $max_files) = @_;
    $max_files //= 0;
    my $csl = Geo::GDAL::FFI::VSIReadDirEx(encode(utf8 => $path), $max_files);
    my @dir;
    for my $i (0 .. Geo::GDAL::FFI::CSLCount($csl)-1) {
        push @dir, decode utf8 => Geo::GDAL::FFI::CSLGetField($csl, $i);
    }
    Geo::GDAL::FFI::CSLDestroy($csl);
    return @dir;
}

1;

=pod

=encoding UTF-8

=head1 NAME

Geo::GDAL::FFI::VSI - A GDAL virtual file system

=head1 SYNOPSIS

use Geo::GDAL::FFI::VSI qw/FOpen Mkdir ReadDir/;

=head1 DESCRIPTION

=head1 METHODS

=head2 FOpen($path, $access)

 my $file = FOpen('/vsimem/file', 'w');

Short for Geo::GDAL::FFI::VSI::File::Open

=head2 Mkdir($path, $mode)

$mode is optional and by default 0x0666.

=head2 ReadDir($path, $max_files)

$max_files is optional and by default 0, i.e., read all names of files
in the dir.

=head1 LICENSE

This software is released under the Artistic License. See
L<perlartistic>.

=head1 AUTHOR

Ari Jolma - Ari.Jolma at gmail.com

=head1 SEE ALSO

L<Geo::GDAL::FFI>

L<Alien::gdal>, L<FFI::Platypus>, L<http://www.gdal.org>

=cut

__END__;