require 'scrabble.rb';
require 'board.rb';
class Searcher
    attr_accessor :board
    def initialize(newDict)
        @scrab = Scrabble.new(newDict);

        mainW = TkRoot.new { 
            title "Ruby Scrabble"
        };
        board_frame = TkFrame.new(mainW) {
            background 'black'
            pack('side' => 'left')
        };

        @board = Board.new(board_frame);

        titleFont = TkFont.new('arial');
        titleFont.configure('weight' => 'bold', 'size' => 16);
        title = TkLabel.new(mainW) {
            text "Justin\'s Scrabbler"
            pack('side' => 'top')
        };
        letFrame = TkFrame.new(mainW) {
            pack('side' => 'top', 'pady' => 3, 'padx' => 5)
        };
        title.font(titleFont);
        TkLabel.new(letFrame) {
            text "Letters: "
            pack('side' => 'left')
        };
        letVar = TkVariable.new();
        TkEntry.new(letFrame) {
            textvariable letVar
            pack('side' => 'left')
        };
        runSearch = Proc.new { Thread.start {
            letAr = letVar.value.downcase.strip.split(//);
            results = @scrab.search(letAr);
            setList(results)
        } };
        tmpScrab, setMeth, clearMeth = 
            @scrab, method("setList"), method("clearList");
        srchButton = TkButton.new(mainW) {
            text 'Search'
            command Proc.new { 
                Thread.new {
                    srchButton.configure('state' => 'disabled');
                    clearMeth.call();
                    letAr = letVar.value.downcase.strip.split(//);
                    results = tmpScrab.search(letAr);
                    setMeth.call(results);
                    srchButton.configure('state' => 'normal');
                }
            }
            pack('side' => 'top')
        };
        @listW = TkListbox.new(mainW) {
            selectmode 'single'
            width 27
            pack('side' => 'left', 'fill' => 'y')
        };
        scrollProc = Proc.new { |*args| @listW.yview *args };
        scrollBar = TkScrollbar.new(mainW) {
            command scrollProc
            pack('side' => 'left', 'fill' => 'y')
        };
        @listW.yscrollcommand(Proc.new { |first,last|
            scrollBar.set(first,last)
        });
        @listW.bind('ButtonRelease-1', Proc.new{
            idx = @listW.curselection.first;
            @board.setB(@scrab.Mx);
            @board.placeMove(@results[idx]);
        });
    end

    def clearList()
        @listW.delete(0, 'end');
    end
    def setList(results)
        @results = results;
        @results.each { |r|
            @listW.insert('end', r)
        }
    end

    def loadB(file)
        @scrab.loadB(file);
        @board.setB(@scrab.Mx);
    end
end
