#!/usr/bin/env perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*-
#
# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is the Bugzilla Bug Tracking System.
#
# The Initial Developer of the Original Code is Terry Weissman.
# Portions created by Terry Weissman are
# Copyright (C) 2000 Terry Weissman. All
# Rights Reserved.
#
# Contributor(s): Terry Weissman <terry@mozilla.org>

use strict;
use lib qw(. lib);

use Bugzilla;
use Bugzilla::Constants;
use Bugzilla::Util;
use Bugzilla::Error;
use Bugzilla::Keyword;
use Bugzilla::Token;

my $cgi = Bugzilla->cgi;
my $dbh = Bugzilla->dbh;
my $template = Bugzilla->template;
my $vars = {};

#
# Preliminary checks:
#

my $user = Bugzilla->login(LOGIN_REQUIRED);

print $cgi->header();

$user->in_group('editkeywords')
  || ThrowUserError("auth_failure", {group  => "editkeywords",
                                     action => "edit",
                                     object => "keywords"});

my $action = trim($cgi->param('action')  || '');
my $key_id = $cgi->param('id');
my $token  = $cgi->param('token');

$vars->{'action'} = $action;


if ($action eq "") {
    $vars->{'keywords'} = Bugzilla::Keyword->get_all_with_bug_count();

    print $cgi->header();
    $template->process("admin/keywords/list.html.tmpl", $vars)
      || ThrowTemplateError($template->error());

    exit;
}
    

if ($action eq 'add') {
    $vars->{'token'} = issue_session_token('add_keyword');

    print $cgi->header();

    $template->process("admin/keywords/create.html.tmpl", $vars)
      || ThrowTemplateError($template->error());

    exit;
}

#
# action='new' -> add keyword entered in the 'action=add' screen
#
if ($action eq 'new') {
    check_token_data($token, 'add_keyword');
    my $name = $cgi->param('name') || '';
    my $desc = $cgi->param('description')  || '';

    my $keyword = Bugzilla::Keyword->create(
        { name => $name, description => $desc });

    delete_token($token);

    print $cgi->header();

    $vars->{'message'} = 'keyword_created';
    $vars->{'name'} = $keyword->name;
    $vars->{'keywords'} = Bugzilla::Keyword->get_all_with_bug_count();

    $template->process("admin/keywords/list.html.tmpl", $vars)
      || ThrowTemplateError($template->error());
    exit;
}


#
# action='edit' -> present the edit keywords from
#
# (next action would be 'update')
#

if ($action eq 'edit') {
    my $keyword = new Bugzilla::Keyword($key_id)
        || ThrowCodeError('invalid_keyword_id', { id => $key_id });

    $vars->{'keyword'} = $keyword;
    $vars->{'token'} = issue_session_token('edit_keyword');

    print $cgi->header();
    $template->process("admin/keywords/edit.html.tmpl", $vars)
      || ThrowTemplateError($template->error());
    exit;
}


#
# action='update' -> update the keyword
#

if ($action eq 'update') {
    check_token_data($token, 'edit_keyword');
    my $keyword = new Bugzilla::Keyword($key_id)
        || ThrowCodeError('invalid_keyword_id', { id => $key_id });

    $keyword->set_name($cgi->param('name'));
    $keyword->set_description($cgi->param('description'));
    my $changes = $keyword->update();

    delete_token($token);

    print $cgi->header();

    $vars->{'message'} = 'keyword_updated';
    $vars->{'keyword'} = $keyword;
    $vars->{'changes'} = $changes;
    $vars->{'keywords'} = Bugzilla::Keyword->get_all_with_bug_count();

    $template->process("admin/keywords/list.html.tmpl", $vars)
      || ThrowTemplateError($template->error());
    exit;
}

if ($action eq 'del') {
    my $keyword =  new Bugzilla::Keyword($key_id)
        || ThrowCodeError('invalid_keyword_id', { id => $key_id });

    $vars->{'keyword'} = $keyword;
    $vars->{'token'} = issue_session_token('delete_keyword');

    print $cgi->header();
    $template->process("admin/keywords/confirm-delete.html.tmpl", $vars)
      || ThrowTemplateError($template->error());
    exit;
}

if ($action eq 'delete') {
    check_token_data($token, 'delete_keyword');
    my $keyword =  new Bugzilla::Keyword($key_id)
        || ThrowCodeError('invalid_keyword_id', { id => $key_id });

    $dbh->do('DELETE FROM keywords WHERE keywordid = ?', undef, $keyword->id);
    $dbh->do('DELETE FROM keyworddefs WHERE id = ?', undef, $keyword->id);

    delete_token($token);

    print $cgi->header();

    $vars->{'message'} = 'keyword_deleted';
    $vars->{'keywords'} = Bugzilla::Keyword->get_all_with_bug_count();

    $template->process("admin/keywords/list.html.tmpl", $vars)
      || ThrowTemplateError($template->error());
    exit;
}

ThrowCodeError("action_unrecognized", $vars);
