package	Opals::SearchSuggestion;


use	Exporter;
@ISA       = qw(Exporter);
@EXPORT_OK = qw(
    sug_getSuggestion
      );

$VERSION   = 0.01;      
#use utf8;

use strict;
use Opals::Context;

use Opals::Search qw(
    srch_parseSearchTerm
    srch_searchRecord
);
use Text::Aspell;
my $speller = Text::Aspell->new;
$speller->set_option('lang','en_US');
$speller->set_option('sug-mode','fast');


sub sug_getSuggestion{
    my ($dbh,$zid,$kw,$sLocation)=@_;
    my $suggestion =getSugestionTbl($kw);
    my $sTerms=getNextSuggestion($suggestion);
    my $size =search($dbh,$zid,$sTerms,$sLocation);
        #print "$size --- $sTerms\n";
    while($sTerms ne'' && $size==0){
        $sTerms=getNextSuggestion($suggestion);
        $size = search($dbh,$zid,$sTerms,$sLocation);
    }
    if($size==0) {
        $sTerms="";
    };
    return $sTerms;
}

sub getNextSuggestion{ 
    my ($suggestion) =@_;   
    my $retval="";
    my $s =$suggestion->{'wordPos'};
    my $l =$suggestion->{'numOfSug'};
    my $sugTbl=$suggestion->{'sugTable'};
    my $j=scalar(@$s)-1;
    if(@$s[$j]==@$l[$j]) {
        return $retval;
    }
    for(my $i= 0; $i<scalar(@$sugTbl);$i++){
        $retval .= @$sugTbl[$i]->{'suggestions'}[@$s[$i]] ." "  ;
    }
    $j=0;
    @$s[$j] +=1;
    while($j< scalar(@$s)-1 && @$s[$j]==@$l[$j]  ){
        @$s[$j] =0;
        $j++;
        @$s[$j]+=1;
    } 
    $suggestion->{'wordPos'}=$s; 
    $suggestion->{'numOfSug'}=$l;   
    return $retval;
    
}
sub getSugestionTbl{
    my ($terms)=@_;
    my @tList= split(/\s/,$terms);
    my @sugTbl;
    my @wPos=();
    my @sLen=();
    foreach my $t(@tList){
        my $suggestions =getSuggestions($t);
        push @sugTbl,{suggestions=>$suggestions};
        push @wPos,0;
        push @sLen,scalar(@$suggestions);
    }
    my $retval ={wordPos=>\@wPos, numOfSug=>\@sLen,sugTable=>\@sugTbl};; 
    return $retval;    
}
sub getSuggestions{
    my($term)=@_;
    my @retval;
    if($speller->check($term)){
        push @retval,$term;
    }
    else{
        my @suggestions = $speller->suggest($term); 
        my $i =0;
        while($i<3 && $i<scalar(@suggestions)){
            push @retval ,@suggestions[$i++];
        }
    }
    return \@retval;
}
sub search{
    my ($dbh,$zid,$kw,$owlLocation)=@_;
    my $sTerm = srch_parseSearchTerm($kw);
    my $pqf="";
    if ($sTerm) {
       $pqf = "\@attr 1=1016  $sTerm "; 
       if($owlLocation && $owlLocation ne ''){
            $pqf = "\@and $pqf \@attr 1=8008 \"$owlLocation\"";
       }
       my ($size,$result) =srch_searchRecord($dbh, $zid, 'b',  $pqf, $ENV{'Z_INDEX_BASE'}, 1);      
        return $size;
    }
    else{
        return 0;
    }
    
}

