package Common::DB::Deploy::ChangeScript;

use strict;
use warnings;

use File::Spec;
use IO::Uncompress::Gunzip;
use IO::Uncompress::Bunzip2;

use Common::DB::Deploy::QuerySplitter;

my %compressionLibs = (
    gz => sub {
        return IO::Uncompress::Gunzip->new(@_)
            || die "Uncompress failed: ${IO::Uncompress::Gunzip::GunzipError}";
    },
    bz2 => sub {
        return IO::Uncompress::Bunzip2->new(@_)
            || die "Uncompress failed: ${IO::Uncompress::Bunzip2::Bunzip2Error}";
    },
    DEFAULT => sub {
        open(my $fh, '<', @_)
            || die "Can't open file: $!";
        return $fh;
    },
);

sub new {
    my ($class, %args) = @_;

    my $self = bless {
        version    => undef,
        db_name    => undef,
        file_name  => undef,
        dir_path   => undef,
        statements => [],
        %args,
    }, $class;

    $self->_init();
    return $self;
}

sub version {
    return shift->{version};
}

sub fileName {
    return shift->{file_name};
}

sub dirPath {
    return shift->{dir_path};
}

sub _init {
    my $self = shift;

    $self->_splitQueries( $self->_getContent() || '' );

    return 1;
}

sub getStatements {
    return shift->{statements};
}

sub _splitQueries {
    my ($self, $content) = @_;

    my $oQuerySplitter = Common::DB::Deploy::QuerySplitter->new();
    $self->{statements} = $oQuerySplitter->split($content);

    return 1;
}

sub _getContent {
    my $self = shift;

    my $content;

    my $pathToScript = File::Spec->catfile($self->dirPath, $self->fileName);
    my ($ext)    = ($pathToScript =~ /\.([^.]*)$/, 'DEFAULT');
    my $fh       = &{ $compressionLibs{$ext} || $compressionLibs{DEFAULT} }($pathToScript);
    {
        local $/;
        $content = <$fh>;
    }
    close $fh;

    return $content;
}



1;