use strict;
use warnings;
use lib qw(lib);

use Test::More "no_plan";

use QA::Util;

my ($sel, $config) = get_selenium();

log_in($sel, $config, 'admin');
set_parameters($sel, { "Bug Fields"              => {"usevotes-on"           => undef,
                                                     "useclassification-off" => undef},
                       "Administrative Policies" => {"allowbugdeletion-on"   => undef}
                     });

# Create a new product, so that we can safely play with vote settings.

add_product($sel);
$sel->type_ok("product", "Eureka");
$sel->type_ok("description", "A great new product");
$sel->click_ok("allows_unconfirmed");
$sel->type_ok("votesperuser", 10);
$sel->type_ok("maxvotesperbug", 5);
$sel->type_ok("votestoconfirm", 3);
$sel->click_ok('//input[@type="submit" and @value="Add"]');
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Product Created");
$sel->click_ok("link=add at least one component");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Add component to the Eureka product");
$sel->type_ok("component", "Pegasus");
$sel->type_ok("description", "A constellation in the north hemisphere.");
$sel->type_ok("initialowner", $config->{permanent_user}, "Setting the default owner");
$sel->click_ok("create");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Component Created");
my $text = trim($sel->get_text("message"));
ok($text =~ qr/The component Pegasus has been created/, "Component 'Pegasus' created");

# Create a new bug with the NEW status.

file_bug_in_product($sel, 'Eureka');
# NEW must be the default bug status for users with editbugs privs.
$sel->selected_label_is("bug_status", "NEW");
$sel->type_ok("short_desc", "Aries");
$sel->type_ok("comment", "1st constellation");
$sel->click_ok("commit");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_like(qr/Bug \d+ Submitted/);
my $bug1_id = $sel->get_value('//input[@name="id" and @type="hidden"]');

# Now vote for this bug.

$sel->click_ok("link=vote");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Change Votes");
# No comment :-/
my $full_text = trim($sel->get_body_text());
# OK, this is not the most robust regexp, but that's better than nothing.
ok($full_text =~ /only 5 votes allowed per bug in this product/,
   "Notice about the number of votes allowed per bug displayed");
$sel->type_ok("bug_$bug1_id", 4);
$sel->click_ok("change");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Change Votes");
$full_text = trim($sel->get_body_text());
# OK, we may get a false positive if another product has the exact same numbers,
# but I have no better idea to check this information.
ok($full_text =~ /4 votes used out of 10 allowed/, "Display the number of votes used");

# File a new bug, now as UNCONFIRMED. We will confirm it by popular votes.

file_bug_in_product($sel, 'Eureka');
$sel->select_ok("bug_status", "UNCONFIRMED");
$sel->type_ok("short_desc", "Taurus");
$sel->type_ok("comment", "2nd constellation");
$sel->click_ok("commit");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_like(qr/Bug \d+ Submitted/);
my $bug2_id = $sel->get_value('//input[@name="id" and @type="hidden"]');

# Put enough votes on this bug to confirm it by popular votes.

$sel->click_ok("link=vote");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Change Votes");
$sel->type_ok("bug_$bug2_id", 5);
$sel->click_ok("change");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Change Votes");
$sel->is_text_present_ok("Bug $bug2_id confirmed by number of votes");

# File a third bug, again as UNCONFIRMED. We will confirm it
# by decreasing the number required to confirm bugs by popular votes.

file_bug_in_product($sel, 'Eureka');
$sel->select_ok("bug_status", "UNCONFIRMED");
$sel->type_ok("short_desc", "Gemini");
$sel->type_ok("comment", "3rd constellation");
$sel->click_ok("commit");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_like(qr/Bug \d+ Submitted/);
my $bug3_id = $sel->get_value('//input[@name="id" and @type="hidden"]');

# Vote for this bug, but remain below the threshold required
# to confirm the bug by popular votes.
# We also change votes set on other bugs for testing purposes.

$sel->click_ok("link=vote");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Change Votes");
$sel->type_ok("bug_$bug1_id", 2);
$sel->type_ok("bug_$bug3_id", 2);
$sel->click_ok("change");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Change Votes");
# Illegal change: max is 5 votes per bug!
$sel->type_ok("bug_$bug2_id", 15);
$sel->click_ok("change");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Illegal Vote");
$text = trim($sel->get_text("error_msg"));
ok($text =~ /You may only use at most 5 votes for a single bug in the Eureka product, but you are trying to use 15/,
   "Too many votes per bug");

# XXX - We cannot use go_back_ok() here, because Firefox complains about
# POST data not being stored in its cache. As a workaround, we go to
# the bug we just visited and click the 'vote' link again.

$sel->type_ok("quicksearch_top", $bug3_id);
$sel->click_ok("find_top");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_like(qr/^Bug $bug3_id /);
$sel->click_ok("link=vote");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Change Votes");

# Illegal change: max is 10 votes for this product!
$sel->type_ok("bug_$bug2_id", 5);
$sel->type_ok("bug_$bug1_id", 5);
$sel->click_ok("change");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Illegal Vote");
$text = trim($sel->get_text("error_msg"));
ok($text =~ /You tried to use 12 votes in the Eureka product, which exceeds the maximum of 10 votes for this product/,
   "Too many votes for this product");

# Decrease the confirmation threshold so that $bug3 becomes confirmed.

edit_product($sel, 'Eureka');
$sel->type_ok("votestoconfirm", 2);
$sel->click_ok("submit");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Updating Product 'Eureka'");
$full_text = trim($sel->get_body_text());
ok($full_text =~ /Updated number of votes needed to confirm a bug from 3 to 2/,
   "Confirming the new number of votes to confirm");
$sel->is_text_present_ok("Bug $bug3_id confirmed by number of votes");

# Decrease the number of votes per bug so that $bug2 is updated.

$sel->click_ok("link='Eureka'");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Edit Product 'Eureka'");
$sel->type_ok("maxvotesperbug", 4);
$sel->click_ok("submit");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Updating Product 'Eureka'");
$full_text = trim($sel->get_body_text());
ok($full_text =~ /Updated maximum votes per bug from 5 to 4/, "Confirming the new number of votes per bug");
$sel->is_text_present_ok("removed votes for bug $bug2_id from " . $config->{admin_user_login}, undef,
                         "Removed votes from the admin");

# Go check that $bug2 has been correctly updated.

$sel->click_ok("link=$bug2_id");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_like(qr/Bug $bug2_id /);
$text = trim($sel->get_text("votes_container"));
ok($text =~ /4 votes/, "4 votes remaining");

# Decrease the number per user. Bugs should keep at least one vote,
# i.e. not all votes are removed (which was the old behavior).

edit_product($sel, "Eureka");
$sel->type_ok("votesperuser", 5);
$sel->click_ok("submit");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Updating Product 'Eureka'");
$full_text = trim($sel->get_body_text());
ok($full_text =~ /Updated votes per user from 10 to 5/, "Confirming the new number of votes per user");
$sel->is_text_present_ok("removed votes for bug");

# Go check that $bug3 has been correctly updated.

$sel->click_ok("link=$bug3_id");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_like(qr/Bug $bug3_id /);
$text = trim($sel->get_text("votes_container"));
ok($text =~ /2 votes/, "2 votes remaining");

# Now disable UNCONFIRMED.

edit_product($sel, "Eureka");
$sel->click_ok("allows_unconfirmed");
$sel->click_ok("submit");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Updating Product 'Eureka'");
$full_text = trim($sel->get_body_text());
ok($full_text =~ /The product no longer allows the UNCONFIRMED status/, "Disable UNCONFIRMED");

# File a new bug. UNCONFIRMED must not be listed as a valid bug status.

file_bug_in_product($sel, "Eureka");
ok(!scalar(grep {$_ eq "UNCONFIRMED"} $sel->get_select_options("bug_status")), "UNCONFIRMED not listed");
$sel->type_ok("short_desc", "Cancer");
$sel->type_ok("comment", "4th constellation");
$sel->click_ok("commit");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_like(qr/Bug \d+ Submitted/);
my $bug4_id = $sel->get_value('//input[@name="id" and @type="hidden"]');

# Now delete the 'Eureka' product.

go_to_admin($sel);
$sel->click_ok("link=Products");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Select product");
$sel->click_ok('//a[contains(@href, "  editproducts.cgi?action=del&product=Eureka")]');
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Delete Product 'Eureka'");
$full_text = trim($sel->get_body_text());
ok($full_text =~ /There are 4 bugs entered for this product/, "Display warning about existing bugs");
ok($full_text =~ /Pegasus: A constellation in the north hemisphere/, "Display product description");
$sel->click_ok("delete");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Product Deleted");
logout($sel);
