#**************************************************************************
#   Copyright (C) 2006 by Michael Andreen <harvATruinDOTnu>               *
#                                                                         *
#   This program is free software; you can redistribute it and/or modify  *
#   it under the terms of the GNU General Public License as published by  *
#   the Free Software Foundation; either version 2 of the License, or     *
#   (at your option) any later version.                                   *
#                                                                         *
#   This program is distributed in the hope that it will be useful,       *
#   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
#   GNU General Public License for more details.                          *
#                                                                         *
#   You should have received a copy of the GNU General Public License     *
#   along with this program; if not, write to the                         *
#   Free Software Foundation, Inc.,                                       *
#   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
#**************************************************************************/
package NDIRC::Misc;
use strict;
use warnings;
require Exporter;

our @ISA = qw/Exporter/;

our @EXPORT = qw/valuecolor addCommand parseCommand commands/;

our %channels;
our %commands;

$channels{'#def-ndawn'} = ['all','member','def'];
$channels{'#nd'} = ['all','member'];
$channels{'#ndef'} = ['all','member','scan'];
$channels{'#nd-day'} = ['all','member'];
$channels{'#ndintel'} = ['all','member'];
$channels{'#nd-officers'} = ['all','member'];
$channels{'#nd-seniors'} = ['all','member'];
$channels{'#nd-ia'} = ['all','member'];
$channels{'#ndawn'} = ['all'];
$channels{'pm'} = ['pm'];

$ND::defchan = "#def-ndawn";
$ND::memchan = "#nd";
$ND::scanchan = "#ndef";
$ND::bcchan = "#nd-day";
$ND::intelchan = "#ndintel";
$ND::officerchan = "#nd-officers";
$ND::communitychan = "#ndawn";
$ND::pubchan = "#newdawn";

sub valuecolor {
	my $s = $_;
	$s = $_[1] if $#_ >= 1;
	$s = "" unless defined $s;
	return chr(3)."5$s".chr(15) if $s eq 'Hostile';
	return chr(3)."3$s".chr(15) if $s eq 'Friendly';
	return chr(3)."3$s".chr(15) if $s eq 'Nap' or $s eq 'NAP';
	return chr(2)."$s".chr(15) if $_[0];
	return $s;
}

sub addCommand {
	my ($command, $list, $func) = @_;
	$commands{$command} = {fun => $func, acc => $list};
}

sub parseCommand {
	my ($msg,$channel) = @_;
	if ($msg =~ /^(\S+)(?: (.+))?$/){
		my $c = $1;
		my $args = $2;
		my @k = keys %commands;
		if (exists $commands{$c}){
			my $a = $commands{$c}->{acc};
			my $b = (exists $channels{lc $channel} ? $channels{lc $channel} : ['all']);
			if (intersect($a,$b) > 0){
				$commands{$c}->{fun}->($args,$c);
				return 1;
			}
		}
	}
	return 0;
}

sub commands {
	my ($channel) = @_;
	my @commands;
	my $b = (exists $channels{lc $channel} ? $channels{lc $channel} : ['all']);
	for my $c (sort keys %commands){
		my $a = $commands{$c}->{acc};
		if (intersect($a,$b) > 0){
			push @commands, $c;
		}
	}
	return join ', ', @commands;
}

sub intersect {
	my ($a, $b) = @_;
	my %union;
	foreach my $e (@{$a}) { $union{$e} = 1 }

	my %isect;
	foreach my $e (@{$b}) {
	     $isect{$e} = 1 if ( exists $union{$e} )
	}
	return keys %isect;
}

1;
