# -*- Mode: perl; indent-tabs-mode: nil -*-
#
# Copyright (c) 2012 Frank Becker and others.
# 
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License v. 2.0 which is available at
# https://www.eclipse.org/legal/epl-2.0
# 
# SPDX-License-Identifier: EPL-2.0
#
# Contributors:
#     Frank Becker - initial API and implementation
#

package Bugzilla::Extension::Mylyn;
use strict;
use base qw(Bugzilla::Extension);
use constant MORE_SUB_CLASSES => qw(
    Bugzilla::Extension::Mylyn::Gerrit
    Bugzilla::Extension::Mylyn::Git
 );
# This code for this is in ./extensions/Mylyn/lib/Util.pm
use Bugzilla::Extension::Mylyn::Util;

use Bugzilla::Constants;
use Bugzilla::Error;
use Bugzilla::Product;
use Bugzilla::FlagType;

use Data::Dumper;

our $VERSION = '0.01';

<% if @custom_wf %>
use constant STATUS_WORKFLOW => (
	['IN_PROGRESS','UNCONFIRMED'],
	['CONFIRMED','VERIFIED'],
);
use constant STATUS_WORKFLOW_DELETE => (
	['IN_PROGRESS','CONFIRMED'],
);
<% end %>
<% if @custom_wf_and_status %>
use constant STATUS_WORKFLOW => (
	['VERIFIED','MODIFIED'],
	['ON_DEV','POST'],
	['MODIFIED','ON_DEV'],
);
use constant STATUS_WORKFLOW_DELETE => (
	['UNCONFIRMED','ASSIGNED'],
	['RESOLVED','UNCONFIRMED'],
	['VERIFIED','UNCONFIRMED'],
);
<% end %>

sub install_before_final_checks {
	my ($self, $args) = @_;
	print "Mylyn Extension: install-before_final_checks hook\n" unless $args->{silent};

	my $dbh = Bugzilla->dbh;
	if (!$dbh->selectrow_array('SELECT 1 FROM profiles where userid > 1')) {
		print "create additional profiles...\n" unless $args->{silent};

		# create tests@mylyn.eclipse.org
		# add this user to group bz_canusewhineatothers
		my $testu = Bugzilla::User->create({ login_name    => 'tests@mylyn.eclipse.org', 
<% if  @envversionInternal >= "5.1" %>

											 email         => 'tests@mylyn.eclipse.org',
<% end %>
											 realname      => 'Mylyn Test',
											 cryptpassword => 'mylyntest' });
		my $private_group = new Bugzilla::Group({name => 'bz_canusewhineatothers'});		
		my $sth = $dbh->prepare( "INSERT INTO user_group_map
								 (user_id, group_id, isbless, grant_type)
								 VALUES (?, ?, ?, ?)");
		$sth->execute($testu->id, $private_group->id, 0, GRANT_DIRECT);

		# create guest@mylyn.eclipse.org		
		Bugzilla::User->create({ login_name    => 'guest@mylyn.eclipse.org', 
<% if  @envversionInternal >= "5.1" %>
		email         => 'guest@mylyn.eclipse.org',
<% end %>
		realname      => 'Mylyn guest',
		cryptpassword => 'mylyntest' });
	}

<% if  @api_key_enabled %>
		my ($testuser_id_admin)  = $dbh->selectrow_array(
			'SELECT userid FROM profiles WHERE login_name = ? ' ,
			undef, 'admin@mylyn.eclipse.org');
		my ($testuser_id_test)  = $dbh->selectrow_array(
			'SELECT userid FROM profiles WHERE login_name = ? ' ,
			undef, 'tests@mylyn.eclipse.org');
        if (!$dbh->selectrow_array('SELECT 1 FROM user_api_keys where user_id > 1')) {
			
		  my $sth = $dbh->prepare( "INSERT INTO user_api_keys
			  					 (user_id, api_key, description)
			  					 VALUES (?, ?, ?)");
		  $sth->execute($testuser_id_admin, 'XkjcuGGfDcoNx0U6uyMM8ZaNuBlEdjrmXd8In3no', 'Mylyn REST Connector Admin');
		  $sth->execute($testuser_id_test, 'wvkz2SoBMBQEKv6ishp1j7NY1R9l711g5w2afXc6', 'Mylyn REST Connector Test');
        }
<% end %>


	# create two new products
	if (!$dbh->selectrow_array('SELECT 1 FROM products where id > 1')) {
		print "create additional products...\n" unless $args->{silent};

		# Get the user who will be the owner of the Component.
		# We pick the tests@mylyn.eclipse.org, which is the
		# user Extension.pl just created.

		my ($testuser_id)  = $dbh->selectrow_array(
			'SELECT userid FROM profiles WHERE login_name = ? ' ,
			undef, 'tests@mylyn.eclipse.org');
		my $testuser = Bugzilla::User->new($testuser_id);

		my $product2 = Bugzilla::Product->create({
											name => 'Product with Spaces',
											description => 'Product with Spaces is the renamed Scratch Product.',
											version => Bugzilla::Version::DEFAULT_VERSION,
											classification => 'Unclassified',
											defaultmilestone => DEFAULT_MILESTONE,
						});
		Bugzilla::Component->create({ %{ ({
											name => 'Component 1',
											description => '1'
										}) },
										product => $product2,
            							initialowner => $testuser->login });
		Bugzilla::Component->create({ %{ ({
											name => 'Component 2',
											description => '2'
										}) },
										product => $product2,
										initialowner => $testuser->login });

		Bugzilla::Version->create({ <%= @VersionCreateName %> => 'a', product => $product2 });
		Bugzilla::Version->create({ <%= @VersionCreateName %> => 'b', product => $product2 });
		Bugzilla::Version->create({ <%= @VersionCreateName %> => 'c', product => $product2 });
		Bugzilla::Milestone->create({ <%= @VersionCreateName %> => 'M1.0', product => $product2 });
		Bugzilla::Milestone->create({ <%= @VersionCreateName %> => 'M2.0', product => $product2 });
		Bugzilla::Milestone->create({ <%= @VersionCreateName %> => 'M3.0', product => $product2 });

		my $product3 = Bugzilla::Product->create({
											name => 'ManualTest',
											description => 'Product for manual testing',
											version => Bugzilla::Version::DEFAULT_VERSION,
											classification => 'Unclassified',
											defaultmilestone => DEFAULT_MILESTONE,
											allows_unconfirmed => 0,
						});
		Bugzilla::Component->create({ %{ ({
											name => 'ManualC1',
											description => '1'
										}) },
										product => $product3,
									initialowner => $testuser->login });
		Bugzilla::Component->create({ %{ ({
											name => 'ManualC2',
											description => '2'
										}) },
										product => $product3,
									initialowner => $testuser->login });
 
		Bugzilla::Version->create({ <%= @VersionCreateName %> => 'R1', product => $product3 });
		Bugzilla::Version->create({ <%= @VersionCreateName %> => 'R1.1', product => $product3 });
		Bugzilla::Version->create({ <%= @VersionCreateName %> => 'R2.0', product => $product3 });
		Bugzilla::Milestone->create({ <%= @VersionCreateName %> => 'M1', product => $product3 });
		Bugzilla::Milestone->create({ <%= @VersionCreateName %> => 'M2', product => $product3 });
		Bugzilla::Milestone->create({ <%= @VersionCreateName %> => 'M3', product => $product3 });
	}

	# create the needed custon fields
	if (!$dbh->selectrow_array('SELECT 1 FROM fielddefs where name like "cf_%"')) {
		print "create additional fielddefs...\n" unless $args->{silent};
		Bugzilla::Field->create({ %{ ({
				description => 'free text custom field',
				type        => 1,
				sortkey     => 351,
				mailhead    => 1,
				enter_bug   => 1,
				obsolete    => 0,
				buglist     => 1,
			}) },
			name => 'cf_freetext', custom => 1
		});
		Bugzilla::Field->create({ %{ ({
				description => 'drop down custom field',
				type        => 2,
				sortkey     => 451,
				mailhead    => 1,
				enter_bug   => 1,
				obsolete    => 0,
				buglist     => 1,
			}) },
			name => 'cf_dropdown', custom => 1
		});

		# create the options for cf_dropdown		
		Bugzilla::Field::Choice->type('cf_dropdown')->create({
			value   => 'one', 
			sortkey => 0,
			is_open => 1,
		});
		Bugzilla::Field::Choice->type('cf_dropdown')->create({
			value   => 'two', 
			sortkey => 0,
			is_open => 1,
		});
		Bugzilla::Field::Choice->type('cf_dropdown')->create({
			value   => 'three', 
			sortkey => 0,
			is_open => 1,
		});
		
		Bugzilla::Field->create({ %{ ({
				description => 'large text box custom field',
				type        => 4,
				sortkey     => 551,
				mailhead    => 1,
				enter_bug   => 1,
				obsolete    => 0,
				buglist     => 1,
			}) },
			name => 'cf_largetextbox', custom => 1
		});
		Bugzilla::Field->create({ %{ ({
				description => 'multi selection box custom field',
				type        => 3,
				sortkey     => 651,
				mailhead    => 1,
				enter_bug   => 1,
				obsolete    => 0,
				buglist     => 1,
			}) },
			name => 'cf_multiselect', custom => 1
		});

		# create the options for cf_multiselect		
		Bugzilla::Field::Choice->type('cf_multiselect')->create({
			value   => 'Blue', 
			sortkey => 0,
			is_open => 1,
		});
		Bugzilla::Field::Choice->type('cf_multiselect')->create({
			value   => 'Green', 
			sortkey => 0,
			is_open => 1,
		});
		Bugzilla::Field::Choice->type('cf_multiselect')->create({
			value   => 'Red', 
			sortkey => 0,
			is_open => 1,
		});
		Bugzilla::Field::Choice->type('cf_multiselect')->create({
			value   => 'Yellow', 
			sortkey => 0,
			is_open => 1,
		});

		Bugzilla::Field->create({ %{ ({
				description => 'date time custom field',
				type        => 5,
				sortkey     => 751,
				mailhead    => 1,
				enter_bug   => 1,
				obsolete    => 0,
				buglist     => 1,
			}) },
			name => 'cf_datetime', custom => 1
		});
		Bugzilla::Field->create({ %{ ({
				description => 'bug id custom field',
				type        => 6,
				sortkey     => 851,
				mailhead    => 1,
				enter_bug   => 1,
				obsolete    => 0,
				buglist     => 1,
			}) },
			name => 'cf_bugid', custom => 1
		});
	}
#	if (!$dbh->selectrow_array('SELECT 1 FROM bug_status where value = "test"')) {
#		print "Anlegen von Status!!!!\n" unless $args->{silent};
#		Bugzilla::Status->create({ value => 'test', is_open => 0 });
#	}

	if (!$dbh->selectrow_array('SELECT 1 FROM flagtypes')) {
		print "create additional flagtypes...\n" unless $args->{silent};
		my $flagtype = Bugzilla::FlagType->insert_create_data({
			name        => 'BugFlag1',
			description => '1',
			target_type => 'bug',
			cc_list     => '',
			sortkey     => 1,
			is_active   => 1,
			is_requestable   => 0,
			is_requesteeble  => 0,
			is_multiplicable => 0,
		});
		# set the inclusion to __Any__:__Any__
		my $sth = $dbh->prepare("INSERT INTO flaginclusions
				(type_id, product_id, component_id) VALUES (?, ?, ?)");
		$sth->execute(bless($flagtype, 'Bugzilla::FlagType' )->id, undef, undef);

		$flagtype = Bugzilla::FlagType->insert_create_data({
			name        => 'BugFlag2',
			description => '2',
			target_type => 'bug',
			cc_list     => '',
			sortkey     => 1,
			is_active   => 1,
			is_requestable   => 1,
			is_requesteeble  => 0,
			is_multiplicable => 0,
		});
		# set the inclusion to __Any__:__Any__
		$sth = $dbh->prepare("INSERT INTO flaginclusions
				(type_id, product_id, component_id) VALUES (?, ?, ?)");
		$sth->execute(bless($flagtype, 'Bugzilla::FlagType' )->id, undef, undef);

		$flagtype = Bugzilla::FlagType->insert_create_data({
			name        => 'AttachmentFlag1',
			description => '1',
			target_type => 'attachment',
			cc_list     => '',
			sortkey     => 1,
			is_active   => 1,
			is_requestable   => 1,
			is_requesteeble  => 1,
			is_multiplicable => 1,
		});
		# set the inclusion to __Any__:__Any__
		$sth = $dbh->prepare("INSERT INTO flaginclusions
				(type_id, product_id, component_id) VALUES (?, ?, ?)");
		$sth->execute(bless($flagtype, 'Bugzilla::FlagType' )->id, undef, undef);

		$flagtype = Bugzilla::FlagType->insert_create_data({
			name        => 'AttachmentFlag2',
			description => '2',
			target_type => 'attachment',
			cc_list     => '',
			sortkey     => 1,
			is_active   => 1,
			is_requestable   => 1,
			is_requesteeble  => 1,
			is_multiplicable => 1,
		});
		# set the inclusion to __Any__:__Any__
		$sth = $dbh->prepare("INSERT INTO flaginclusions
				(type_id, product_id, component_id) VALUES (?, ?, ?)");
		$sth->execute(bless($flagtype, 'Bugzilla::FlagType' )->id, undef, undef);

		$flagtype = Bugzilla::FlagType->insert_create_data({
			name        => 'BugFlag3',
			description => '3',
			target_type => 'bug',
			cc_list     => '',
			sortkey     => 1,
			is_active   => 1,
			is_requestable   => 1,
			is_requesteeble  => 0,
			is_multiplicable => 1,
		});
		# set the inclusion to __Any__:__Any__
		$sth = $dbh->prepare("INSERT INTO flaginclusions
				(type_id, product_id, component_id) VALUES (?, ?, ?)");
		$sth->execute(bless($flagtype, 'Bugzilla::FlagType' )->id, undef, undef);

		$flagtype = Bugzilla::FlagType->insert_create_data({
			name        => 'BugFlag4',
			description => '4',
			target_type => 'bug',
			cc_list     => '',
			sortkey     => 1,
			is_active   => 1,
			is_requestable   => 1,
			is_requesteeble  => 1,
			is_multiplicable => 1,
		});
		# set the inclusion to __Any__:__Any__
		$sth = $dbh->prepare("INSERT INTO flaginclusions
				(type_id, product_id, component_id) VALUES (?, ?, ?)");
		$sth->execute(bless($flagtype, 'Bugzilla::FlagType' )->id, undef, undef);
	}

	if (!$dbh->selectrow_array('SELECT 1 FROM keyworddefs')) {
		print "create additional keyworddefs...\n" unless $args->{silent};
		Bugzilla::Keyword->create({ name => 'Keyword1', description => '1' });
		Bugzilla::Keyword->create({ name => 'Keyword2', description => '2' });
	}
<% if @custom_wf %>
	my %status_ids = @{ $dbh->selectcol_arrayref(
		'SELECT value, id FROM bug_status', {Columns=>[1,2]}) };
		my $old_id =  $status_ids{'IN_PROGRESS'};
		my $new_id = $status_ids{'UNCONFIRMED'};
    if (!$dbh->selectrow_array('SELECT 1 FROM status_workflow where old_status = '. $old_id . ' and new_status = '.$new_id)) {
		print "create additional status_workflow...\n" unless $args->{silent};
		my $sth_insert = $dbh->prepare('INSERT INTO status_workflow (old_status, new_status)
										VALUES (?, ?)');
		my $sth_delete = $dbh->prepare('DELETE FROM status_workflow
										WHERE old_status = ? AND new_status = ?');

		foreach my $pair (STATUS_WORKFLOW) {
			my $old_id = $pair->[0] ? $status_ids{$pair->[0]} : undef;
			my $new_id = $status_ids{$pair->[1]};
			$sth_insert->execute($old_id, $new_id);
		}
		foreach my $pair (STATUS_WORKFLOW_DELETE) {
			my $old_id = $pair->[0] ? $status_ids{$pair->[0]} : undef;
			my $new_id = $status_ids{$pair->[1]};
			$sth_delete->execute($old_id, $new_id);
		}
	}
<% end %>
<% if @custom_wf_and_status %>
	if (!$dbh->selectrow_array('SELECT 1 FROM bug_status where value = "ON_DEV"')) {
		print "Anlegen von Status!!!!\n" unless $args->{silent};
		Bugzilla::Status->create({ value => 'ON_DEV', is_open => 1 , sortkey => 800});
		Bugzilla::Status->create({ value => 'POST', is_open => 0 , sortkey => 900});
		Bugzilla::Status->create({ value => 'MODIFIED', is_open => 1 , sortkey => 1200});
	}
	my %status_ids = @{ $dbh->selectcol_arrayref(
		'SELECT value, id FROM bug_status', {Columns=>[1,2]}) };
		my $old_id =  $status_ids{'IN_PROGRESS'};
		my $new_id = $status_ids{'UNCONFIRMED'};
    if (!$dbh->selectrow_array('SELECT 1 FROM status_workflow where old_status = '. $old_id . ' and new_status = '.$new_id)) {
		print "create additional status_workflow...\n" unless $args->{silent};
		my $sth_insert = $dbh->prepare('INSERT INTO status_workflow (old_status, new_status)
										VALUES (?, ?)');
		my $sth_delete = $dbh->prepare('DELETE FROM status_workflow
										WHERE old_status = ? AND new_status = ?');
    	my $sth_delnul = $dbh->prepare('DELETE FROM status_workflow
                                    WHERE old_status IS NULL AND new_status = ?');
		foreach my $pair (STATUS_WORKFLOW) {
			my $old_id = $pair->[0] ? $status_ids{$pair->[0]} : undef;
			my $new_id = $status_ids{$pair->[1]};
			if (!$dbh->selectrow_array('SELECT 1 FROM status_workflow where old_status ='. $old_id . ' and new_status ='.$new_id)) {
				$sth_insert->execute($old_id, $new_id);
			}
		}
		foreach my $pair (STATUS_WORKFLOW_DELETE) {
			my $old_id = $pair->[0] ? $status_ids{$pair->[0]} : undef;
			my $new_id = $status_ids{$pair->[1]};
			$sth_delete->execute($old_id, $new_id);
		}
		my $new_id = $status_ids{'ASSIGNED'};
		$sth_delnul->execute($new_id);
	}
<% end %>
	
	print "Mylyn Extension: end of install-before_final_checks hook\n" unless $args->{silent};
}

sub bug_url_sub_classes {
    my ($self, $args) = @_;
    push @{ $args->{sub_classes} }, MORE_SUB_CLASSES;
}

__PACKAGE__->NAME;
