#!/usr/bin/perl
use strict;
use Data::Show;
use Text::Balanced qw (extract_bracketed extract_multiple);



# ?x=a&y=b&w=c&z=d&n=m&stmt=[x|b]-[[w-c]|n]

# [
# 	{chainconceptid => |chainconceptid|, chaingroupid => |chaingroupid| },
# 	{'-or' => {chainunitid => {like => ~search~}, chainunitname => ~search~ }
# ]


# &chainconceptid=
# &chaingroupid=
# &chainunitid=
# &chaingroupname=
# &qs=[x|b]-[[w-c]|n]
my $p = {
	x=> 'a',
	y=> 'b',
	w=> 'c',
	z=> 1,
	n=> 2
};

my $s = &build_where_query('(x|b)-((w-c)|n)');


sub build_where_query{
	my $qs = shift;
	my $f = [];
	# my $r = regroup($qs);
my ($extracted, $remainder) = extract_multiple( 
           $qs, 
           [ \&extract_bracketed ]);	
show $extracted, $remainder;
	

}


sub regroup{
	my $qs = shift;


my $re;
 $re = qr{ (                   # paren group 1 (full function)
                            
                            (                 # paren group 2 (parens)
                                \(
                                    (             # paren group 3 (contents of parens)
                                    (?:
                                      (?> [^()]+ ) # Non-parens without backtracking
                                    |
                                      (?2)         # Recurse to start of paren group 2
                                    )*
                                    )
                                \)
                            )
                        )
                    }x;

                    my ($m1,$m2,$m3);
  $qs=~/$re/ and $m1=$1,$m2=$2,$m3=$3;
  	show ($m1,$m2,$m3);
  	my $nmatch = regroup($m3) if $m3;
  


	# if($qs =~ /\[([^\[]*?)\|([^\]]*?)\]/){
	# 	while($qs =~ /\[([^\[]*?)\|([^\]]*?)\]/g){
	# 		my ($o1,$o2) = ($1,$2);
	# 		my $fso1 = build_where_query($o1);
	# 		my $fso2 = build_where_query($o2);
	# 		show $o1, $fso1;	
	# 		show $o2, $fso2;			
	# 	}
	# }elsif($qs =~ /\[([^\[]*?)-([^\]]*?)\]/){
	# 	while($qs =~ /\[([^\[]*?)-([^\]]*?)\]/g){
	# 		my ($a1,$a2) = ($1,$2);
	# 		my $fsa1 = build_where_query($a1);
	# 		my $fsa2 = build_where_query($a2);
	# 		show $a1, $fsa1;	
	# 		show $a2, $fsa2;
	# 	}
	# }else{
	# 	return $qs;
	# }

}

1;
