use utf8;
use warnings; no warnings "redefine";
use strict;
use Fehler qw(warnung problem hat_problem);
use Loader qw(current_user check_perm);
use Dbase::Help qw(DoSelect Do quote qquote unixtime Do DoTime);
use Dbase::Globals qw(kpersinfo);

my $lcheck = DoTime-60*60*24;
my $can_write;

# Flag:
# 1: eigenen Edit *nicht* ignorieren
# 2: Nur spezifisches Feld berücksichtigen
# 4: problem() statt warnung()

# Delta:
# Zeit in Sekunden, die ein Eintrag höchstens alt sein darf

sub warn_arbeit($$;$$$$) {
	my($db,$id,$sp,$kn,$flag,$delta) = @_;
	$flag ||= 0;
	$can_write = !check_perm("readonly",1) unless defined $can_write;

	$db = quote($db);
	$sp = defined($sp) ? quote($sp) : "*";
	$id = quote($id);

	my $tm = DoTime;
	if($can_write and $lcheck < $tm-10*60) {
		Do("delete from in_arbeit where person = ".current_user." and timestamp < From_UnixTime($lcheck)");
		Do "delete from in_arbeit where timestamp < DATE_SUB(NOW(), INTERVAL 1 DAY)";
		$lcheck = $tm;
	}
	my $cond = "";
	$cond .= " AND person != ${\ current_user() }" unless $flag&1;
	if($flag & 2) {
		$cond .= " AND row = ${\ qquote($sp) }";
	} else {
		$cond .= " AND row IN ('*', ${\ qquote($sp) })";
	}
	$cond .= " AND timestamp >= DATE_SUB(NOW(), INTERVAL $delta SECOND)"
		if defined $delta;

	my $warn = ($flag & 4) ? \&problem : \&warnung;
	my @msgs;
	DoSelect {
		my($pers,$row,$count) = @_;
		$count = $count != 1 && $count . 'x ';
		if($row eq "*") {
			push(@msgs, $count."aufgerufen von ".kpersinfo($pers));
		} elsif($sp ne "*") { # muss dasselbe Feld sein
			push(@msgs, "Feld wird ${count}editiert von ".kpersinfo($pers));
		} else {
			push(@msgs, "Feld '$row' wird ${count}editiert von ".kpersinfo($pers));
		}
	} <<_;
	SELECT   person, row, COUNT(*)
	FROM     in_arbeit
	WHERE    tabelle = '$db'
	     AND idx = '$id'
	     $cond
	GROUP BY person, row
	ORDER BY timestamp
_
	&$warn(@msgs) if @msgs;
	return undef if hat_problem();
	return Db::Arbeiter->new($db,$sp,$id) if $can_write;
}

package Db::Arbeiter;
use Dbase::Help qw(Do);
use Loader qw(current_user);

sub new {
	my $was = shift;
	my($db,$sp,$idx) = @_;
	my $id;
	$id = Do("insert into in_arbeit set tabelle='$db',row='$sp',idx='$idx',person=".current_user);
	bless \$id,$was;
}
sub DESTROY {
	my $me = shift;
	return unless $$me;
	Do("delete from in_arbeit where id = $$me");
}

1;
