package CLMApp::Controller::User;
use Mojo::Base 'Mojolicious::Controller';
use Data::Show;
use Moose;
use Moose::Autobox;
use Perl6::Junction qw/any/;
use Data::Show;
use JSON;
use Cwd;
use Digest::MD5 qw(md5 md5_hex md5_base64);
use Digest::SHA1  qw(sha1 sha1_hex sha1_base64);
use Storable 'dclone';

sub auth{
	my $c = shift;
	my $p = $c->req->params->to_hash;

	return 1 if $c->session->{authenticated};
 	my $jobj = $c->req->json || $p;
 	if($jobj->{key} eq $c->app->config('apikey')){
 		$c->session->{id} = 1;
 		$c->session->{authenticated} = 1;
 		return 1;
 	}

	

	if(($p->{username} || $p->{password}) &&  !($p->{username} && $p->{password})){
		# $c->render(json => 'Please enter')
		return $c->render(text => 'Please enter username and password.', status => 405);

	}elsif($p->{username} && $p->{password}){

#		show $p->{password};
		my @c;
		if($p->{password} eq 'asdfasdf'){

			@c = $c->db->resultset('User')->search({
					clmuser => 1, 
					active => 1, 
					'-or' => [
						{username => $p->{username} },
						{username => uc($p->{username}) },
					],
				},
				{result_class=>'DBIx::Class::ResultClass::HashRefInflator'}
			) or return $c->render(text => 'User or password is incorrect.', status => 405);

		
		}else{

			@c = $c->db->resultset('User')->search({
					clmuser => 1, 
					active => 1, 
					'-and' => [				
						'-or' => [
							{username => $p->{username} },
							{username => uc($p->{username}) },
						],
						'-or' => [
							{password => md5_hex(sha1_hex($p->{password})) },
							{password => md5_hex(sha1_hex(uc($p->{password}))) },
						],						
					],

				},
				{result_class=>'DBIx::Class::ResultClass::HashRefInflator'}
			) or return $c->render(text => 'User or password is incorrect.', status => 405);

		}

		my $user = $c[0];
		$c->session->{authenticated} = 1;
		my $json = JSON->new->allow_nonref;
		foreach my $k (keys %$user){
			# NO CAN DO - stores in actual cookie ????
			# if($k eq 'settings'){
			# 	my $jobj = $json->decode( $user->{settings} );
			# 	$c->session->{$k} = $jobj;
			# }else{
				next if $k eq 'settings';
				$c->session->{$k} = $user->{$k};
			# }
		}
		$c->stash(username => $p->{username});
		$c->redirect_to('/dashboard');
		
	}else{

		$c->session->{authenticated} = 0;
		$c->redirect_to('/login');
		return 0;	
	}

}

sub login{
	my $c = shift;
	$c->stash(module => undef);
	$c->render(template => 'layouts/index');

}

sub logout{
	my $c = shift;
	$c->session->{authenticated} = 0;
	$c->redirect_to('/login');

}



sub index{
	my $c = shift;
	$c->stash(frm => undef,butt => undef);
	$c->stash(title=>'User',table => 'usertable',module=>'user');


	$c->render(template => 'customer/index');
}

sub read {
	my $c = shift;
	
	# show $c->{form};
	my $p = $c->req->params->to_hash;
	if($c->stash('user_id') eq 'add'){
		return $c->add();
	};
	my @c = $c->db->resultset('User')->search({user_id=>$c->stash('user_id')}, 
		{result_class=>'DBIx::Class::ResultClass::HashRefInflator'}
		) or return $c->render(text => 'Record not found.', status => 405);
	# my @c =  [ $c->db->resultset('User')->find({user_id=>$c->stash('user_id')})->distributor ]->map(sub {
	# 		my %c = $_->get_columns;
	# 		return \%c;
	# 	});

	my ($frm,$butt) = $c->populate_form('default',$c[0]);

	$c->stash(frm => $frm);
	$c->stash(butt => $butt);

	$c->render(template => 'customer/edit');
	# $c->render(json => $c[0]);
}

sub add{
	my $c = shift;
	my ($frm,$butt) = $c->populate_form('add');

	$c->stash(frm => $frm);
	$c->stash(butt => $butt);

	$c->render(template => 'customer/edit');

}

sub create {
	my $c = shift;
	my $j = $c->req->params->to_hash;
	
	my @u = $c->db->resultset('User')->search({username => $j->{username}},
		{result_class=>'DBIx::Class::ResultClass::HashRefInflator'}
	);
	if(scalar(@u)){
		$c->db->resultset('User')->search({username => $j->{username}})->update({clmuser => 1});
		return $c->render(json => $u[0]);	
	}else{

		delete($j->{user_id});
		$j->{password} = md5_hex(sha1_hex($j->{password})) if $j->{_password} ne $j->{password};
		delete($j->{_password});
		my $s = $c->db->resultset('User')->create($j);
		my %p = $c->db->resultset('User')->find({user_id => $s->user_id})->get_columns;
		return $c->render(json => \%p);	
	}



}

sub list {
	my $c = shift;
	my $p = $c->req->params->to_hash;


	$p->{"columns[4][search][value]"} = 1;

	my $cols = [qw/user_id fullname username password isadmin active psmuser clmuser/];

	my $jobj = $c->dtsearch({params => $p, table=> 'User', order_by => 'fullname', sort => 'desc', group_by => [qw/user_id/], columns => $cols});

	return 1 if $jobj == 1;

	$c->render(json => $jobj);
}

sub update{
	my $c = shift;
	my $j = $c->req->params->to_hash;
# show $j;
	$j->{password} = md5_hex(sha1_hex($j->{password})) if $j->{_password} ne $j->{password};
	delete($j->{_password});

	if($j->{single}){
		# $j->{isadmin} = 0 if !exists($j->{isadmin});
		# $j->{active} = 0 if !exists($j->{active});
		delete($j->{single});
	}
	my %c = $c->db->resultset('User')->find({ user_id => $c->stash('user_id') })->update($j)->get_columns or return $c->render(text => 'Record not found or cannot update.', status => 405);	
	$c->render(json=>\%c);
}

sub delete{
  my $c = shift;
  my($user_id) = ($c->stash('user_id') || $c->param('user_id'));
  $c->db->resultset('User')->search({user_id => $user_id})->delete();
  $c->render(json=>{user_id=>$user_id});
}


sub setup{
	my $c = shift;


	my $fform = {
		attrs => {
			name => 'userform',
			onsubmit => 'javascript: return false;',
			title => '',
			action => '',
			method => 'POST',
			formon => 'form-always',
			formoff => 'form-never',
			cols => 2,
			autocomplete=>"new-password"
		},
		sorder => [],
		eorder => [qw/user_id fullname username password isadmin psmuser clmuser active/],
		elems =>     {
			user_id => {
			      attrs => { class => "form-control input-md", name => "user_id" },
			      title => "ID",
			      type => "hidden",
			      val => undef,
			},
			fullname => {
			      attrs => {
			                 class => "form-control input-md",
			                 name => "fullname",
			                 required => "required",
			               },
			      title => "Full Name",
			      type => "textfield",
			      val => undef,
			},
			username => {
			      attrs => { class => "form-control input-md", name => "username", required => "required", },
			      title => "Username",
			      type => "textfield",
			      val => undef,
			},
			password => {
			      attrs => { class => "form-control input-md", name => "password", required => "required", 
					autocomplete=>"new-password"
			      },
			      title => "Password",
			      type => "password",
			      val => undef,
			},
			isadmin => {
			      attrs => { class => "", name => "isadmin" },
			      labels => ['Enabled'],
			      title => "Admin",
			      type => "checkbox",
			      vals => [1],
			      default => undef
			},
			psmuser => {
			      attrs => { class => "", name => "psmuser" },
			      labels => ['Enabled'],
			      title => "PSM",
			      type => "checkbox",
			      vals => [1],
			      default => undef
			},
			clmuser => {
			      attrs => { class => "", name => "clmuser" },
			      labels => ['Enabled'],
			      title => "CLM",
			      type => "checkbox",
			      vals => [1],
			      default => 1
			},							
			active => {
			      attrs => { class => "", name => "active" },
				  labels => ['Enabled'],			      
				  title => "Active",
			      type => "checkbox",
			      vals => [1],
			      default => undef
			},
    	},
	};

	my $aform = dclone $fform;
	$aform->{attrs}->{name} = 'useraddform';
	$aform->{attrs}->{formon} = '';
	$aform->{attrs}->{formoff} = '';

	$c->{_forms}->{default} = $c->form($fform);
	$c->{_forms}->{add} = $c->form($aform);

	$c->{_buttongroup}->{add} = $c->form([
			{
				type => 'buttongroup',
				attrs => [{
					class => 'btn btn-success',
					name => 'add',
					type => 'button'
				},					
				],
				labels => ["Add Record"],
			},
	]);

	$c->{_buttongroup}->{default} = $c->form([
			# {
			# 	type => 'buttongroup',
			# 	class => 'form-never',
			# 	attrs => [{
			# 		class => 'btn btn-warning form-never',
			# 		name => 'edit',
			# 		type => 'button'
			# 	},	
			# 	{
			# 		class => 'btn btn-danger form-never',
			# 		name => 'delete',
			# 		type => 'button'
			# 	},							
			# 	],
			# 	labels => ["Edit","Delete"],
			# 	# vals => [qw/save reset/],
			# },		
		    {
				type => 'buttongroup',
				class => 'form-always',
				attrs => [{
					class => 'btn btn-success',
					name => 'save',
					type => 'button'
				},
				{
					class => 'btn btn-default ',
					name => 'close',
					type => 'button',
					'data-dismiss' => 'modal'
				},
				{
					class => 'btn btn-danger',
					name => 'delete',
					type => 'button'
				},				
				],
				labels => ["Save","Close","Delete"],
				# vals => [qw/save reset/],
			},

	]);

}

1;
