package Greenstone::Directory;

use strict;
use warnings;
use utf8;
use base 'Exporter';

use File::Path 'remove_tree';
use Greenstone::Config;

our $VERSION = 1.00;
our @EXPORT = ( );

sub new {
    my ($parent, $class, $name, %args) = @_;
    ref $class and die "Constructor used as object method\n";
    defined $name or die "Must have a name\n";
    my $self = bless (
        {
            name   => $name,
            parent => $parent,
        },
        $class
    );
    for my $param (keys %args) {
        $self->{$param} = $args{$param};
    }
    return $self;
}

sub list {
    my $parent = shift;
    ref $parent and die "Static method called on object\n";
    my $dirs = {};
    my $dir = "$Greenstone::Config::GSDL3HOME/$parent";
    opendir DH, $dir or die "Could not open directory '$dir'\n";
    while (my $entry = readdir DH) {
        # skip hidden files and current/parent directory
        $entry =~ /^\./ and next;
        # skip non-directories
        -d "$dir/$entry" or next;
        # We don't really need to store anything more than the fact that the directory exists
        # So we just store nothing, which is enough to put the key in the hash
        # (i.e. it acts as a hashset)
        $dirs->{$entry} = ();
    }
    closedir DH;
    return $dirs;
}

sub exists {
    my $self = shift;
    my $dirs = list $self->{parent};
    return exists $dirs->{$self->{name}};
}

sub dir {
    my $self = shift;
    return "$Greenstone::Config::GSDL3HOME/$self->{parent}/$self->{name}";
}

sub create {
    my $self = shift;
    if ($self->exists) {
        print STDERR "Site already exists\n";
        return 0;
    }
    mkdir $self->dir or die "Failed to create directory: $!\n";
    return 1;
}

sub delete {
    my $self = shift;
    unless ($self->exists) {
        print STDERR "Site doesn't exist\n";
        return 0;
    }
    remove_tree $self->dir or die "Failed to remove directory: $!\n";
    return 1;
}

1;
