use Object;
use PgCharge;

package SuperObject;
@ISA=("Object");
my $conn;

sub new {
    my $type = shift;
    my %param = @_;
    my $self = new Object;
    $self->addProperties(%param);
	$self->addPropertie('conn',0);
    bless $self, $type;
	return $self;
}

sub initConnect {
	my $class=shift;
	my ($DBHOST,$DBNAME,$DBUSER,$DBPWD)=@_;
	$conn=PgCharge->new($DBHOST,$DBNAME,$DBUSER,$DBPWD);
	return 0 if (!$conn);
	#$self->addPropertie('conn',$conn);
	return 1;
}


# Les deux méthodes suivantes sont séparées
# pour des raisons d'évolution.
# On peut les shunter par $conn->exec si besoin est.
sub update {
	my $class=shift;
	my $req=shift;
	$conn->exec($req);
}

sub insert {
	my $class=shift;
	my $req=shift;
	my $result=$conn->exec($req);
	return $result;
}

sub map {
	my $self=shift;
	my $key_var=shift;
	my $val_var=shift;
	my $where=shift;
	my @result;
	my %map;
	$where="" if (!$where);
	if (!$conn) {
		$self->initConnect() || return 0;
	}
	#print STDERR "envoi de $where\n";
	$conn->load($self->{name},"$where",$key_var,$val_var);
	for my $ref_tmp (@{$conn->{$self->{name}}}) {
		#print STDERR $self->printHash($ref_tmp);
		if (exists $ref_tmp->{$key_var} && exists $ref_tmp->{$val_var}) {
			$map{$ref_tmp->{$key_var}}=$ref_tmp->{$val_var};
		}
	}
	$self->{map}=\%map;
	return \%map;
}

sub loadByUid {
	my $self=shift;
	my $uid=shift;
	my @fields;
	my $ref_fields;
	return 0 if (!$uid);
	$ref_fields=$self->listAttribute();
	@fields=keys(%{$ref_fields});
	$conn->load($self->{name},"where uid=$uid",@fields);
	for my $ref_tmp (@{$conn->{$self->{name}}}) {
		my $i=0;
		for my $field (@fields) {
			$self->{$field}=$ref_tmp->{$field};
		}
	}
	return 1;
}

sub Select {
	my $class=shift;
	if (ref $class) { print STDERR "Class method called by object"; return 0; }
	my $where=shift;
	my $ref_fields=shift;
	my @fields;
	my @result;
	if (!$ref_fields) {
		my $ref_hash=$class->listAttribute();
		@fields=keys(%{$ref_hash});
		#print STDERR "ca fait ".$#fields."champs\n";
	} else {
		@fields=@{$ref_fields};
		#print STDERR "ca fait $ref_fields pas ".$#fields."champs\n";
	}
	#@fields=keys(%{$ref_fields});
	$conn->load($class,"$where",@fields);
	for my $ref_tmp (@{$conn->{$class}}) {
		my $i=0;
		my $instance=$class->new();
		for my $field (@fields) {
			$instance->{$field}=$ref_tmp->{$field};
		}
		push @result,$instance;
	}
	return \@result;
}

sub strInsert {
	my $self=shift;
	#if (ref $class) { print STDERR "Class method called by object"; return 0; }
	my $ref_fields=shift;
	my @fields;
	my @values;
	my $result;
	if (!$self->{uid}) {
		$self->{uid}='nextId()';
	}
	if (!$ref_fields) {
		my $ref_hash=$self->listAttribute();
		@fields=keys(%{$ref_hash});
	} else {
		@fields=@{$ref_fields};
	}
	$result="INSERT INTO ".$self->{name}." (".join(',',@fields).") values (";
	for my $field (@fields) {
		push @values,$self->{$field};
	}
	$result.="'".join("','",@values)."');";
	# On vire les affectations uid foireuses :
	print STDERR "Result avant : $result\n";
	$result=~s/.nextId.../nextId()/;
	print STDERR "Result après : $result\n";
	return $result;
}

sub strUpdate {
	my $self=shift;
	#if (ref $class) { print STDERR "Class method called by object"; return 0; }
	my $ref_fields=shift;
	my $where=shift;
	if (!$where && !$self->{uid}) { return 0; }
	if (!$where) {	$where=" where uid=".$self->{uid}; }
	my @fields;
	my @values;
	my $result;
	if (!$ref_fields) {
		my $ref_hash=$self->listAttribute();
		@fields=keys(%{$ref_hash});
	} else {
		@fields=@{$ref_fields};
	}
	$result="UPDATE ".$self->{name}." set "; 
	for my $field (@fields) {
		push @values,"$field='".$self->{$field}."'";
	}
	$result.=join(",",@values)." $where;";
	return $result;
}

sub printHTML {
	my $self=shift;
	my $ref_fields=shift;
	my $ref_dispfields=shift;
	my @str;
	my ($ret);
	$ret=chr(13);
	if (!$ref_dispfields) {
		#print STDERR "Getting attributes...\n";
		my $ref_hash;
		my @tmpArr;
		$ref_hash=$self->listAttribute();
		@tmpArr=keys(%$ref_hash);
		$ref_fields=\@tmpArr if (!$ref_fields);
		#print STDERR "Determining attributes for ".$#{$ref_fields}." fields...\n";
		#print STDERR "Loading attributes...\n";
		for my $key (@$ref_fields) {
			#print STDERR "Loading attributes of $key...\n";
			$ref_dispfields->{$key}={'denom'=>$key , 'style'=>'' };
		}
	}
	for $field (@$ref_fields) {
		#print STDERR "Preparing display of $field (=>".$self->{$field}.")\n";
		my $l_str=' ';
		$l_str=$self->{$field} if ($self->{$field});
		$l_str=~s/\_/\\\_/g;
		$l_str=~s/&/\\&/g;
		$l_str=~s/$ret//g;
		push @str,"\n<td ".$ref_dispfields->{$field}{style}.">".$l_str."</td>\n";
	}
	return "<tr>\n".join(" ",@str)." </tr>";
}

sub printLatex {
	my $self=shift;
	my $ref_fields=shift;
	my $ref_dispfields=shift;
	my @str;
	my ($ret);
	$ret=chr(13);
	if (!$ref_dispfields) {
		my $ref_hash=$self->listAttribute();
		for my $key (keys(%$ref_fields)) {
			$ref_dispfields->{$key}={'denom'=>$key , 'style'=>'c' };
		}
	}
	for $field (@$ref_fields) {
		my $l_str=' ';
		$l_str=$self->{$field} if ($self->{$field});
		$l_str=~s/\_/\\\_/g;
		$l_str=~s/&/\\&/g;
		$l_str=~s/$ret//g;
		push @str,$l_str;
	}
	return join(" & ",@str).' \\\\';
}

sub printHTMLHeader {
	my $self=shift;
	my $ref_fields=shift;
	my $ref_dispfields=shift;
	my @str;
	my ($result,$nbentries);
	$nbEntries=0;
	if (!$ref_dispfields) {
		my $ref_hash;
		my @tmpArr;
		$ref_hash=$self->listAttribute();
		@tmpArr=keys(%$ref_hash);
		$ref_fields=\@tmpArr if (!$ref_fields);
		for my $key (@$ref_fields) {
			$ref_dispfields->{$key}={'denom'=>$key , 'style'=>'' };
		}
	}
	for $field (@$ref_fields) {
		push @str,"<th ".$ref_dispfields->{$field}{style}.">".$ref_dispfields->{$field}{denom}."</th>";
		$nbEntries++;
	}
	$result .= "<tr>\n ".join("\n ",@str)."</tr>\n";

	return $result;
}

sub printLatexHeader {
	my $self=shift;
	my $ref_fields=shift;
	my $ref_dispfields=shift;
	my @str;
	my @style;
	my ($result,$nbentries);
	$nbEntries=0;
	if (!$ref_dispfields) {
		my $ref_hash=$self->listAttribute();
		for my $key (@$ref_fields) {
			$ref_dispfields->{$key}={'denom'=>$key , 'style'=>'c' };
		}
	}
	for $field (@$ref_fields) {
		push @style,$ref_dispfields->{$field}{style};
		push @str,$ref_dispfields->{$field}{denom};
		$nbEntries++;
	}
	$result = "\\begin{longtable}[c]{|".join('|',@style)."|}\n";
	$result .= "\\hline \n{\\bf ".join("} & {\\bf ",@str)."} \\\\\n";
	$result .= "\\hline \n \\endfirsthead \n ";
	$result .= "\\hline \n{\\bf ".join("} & {\\bf ",@str)."} \\\\\n";
	$result .= "\\endhead \n ";
	$result .= "\\hline \n \\multicolumn{".($nbEntries-1)."}{|c}{} &{\\textit{ Suite...}} \\\\ \\hline \n \\endfoot\n";
	$result .= "\\endlastfoot\n";

	return $result;
}


package Field;
@ISA=("Object");

sub new {
    my $type = shift;
    my %param = @_;
    my $self = new Object;
	$self->addProperties(%param);
    bless $self, $type;
	return $self;
}


1;


