-- convert databases to UTF-8
ALTER TABLE `wolfadmin`.`aliases`
    CONVERT TO
    CHARACTER SET 'utf8'
    COLLATE 'utf8_unicode_ci';

ALTER TABLE `wolfadmin`.`levels`
    CONVERT TO
    CHARACTER SET 'utf8'
    COLLATE 'utf8_unicode_ci';

ALTER TABLE `wolfadmin`.`maps`
    CONVERT TO
    CHARACTER SET 'utf8'
    COLLATE 'utf8_unicode_ci';

ALTER TABLE `wolfadmin`.`players`
    CONVERT TO
    CHARACTER SET 'utf8'
    COLLATE 'utf8_unicode_ci';

ALTER TABLE `wolfadmin`.`records`
    CONVERT TO
    CHARACTER SET 'utf8'
    COLLATE 'utf8_unicode_ci';

ALTER TABLE `wolfadmin`.`warns`
    CONVERT TO
    CHARACTER SET 'utf8'
    COLLATE 'utf8_unicode_ci';

-- create config table
CREATE TABLE IF NOT EXISTS `config` (
  `id` varchar(64) NOT NULL PRIMARY KEY,
  `value` longtext NOT NULL
);

-- rename warns to history
ALTER TABLE `warn`
    DROP FOREIGN KEY `warn_player`,
    DROP FOREIGN KEY `warn_admin`;
ALTER TABLE `warn`
    DROP INDEX `admin_idx`,
    DROP INDEX `player_idx`;

ALTER TABLE `warn`
    CHANGE COLUMN `reason` `reason` VARCHAR(128) NOT NULL AFTER `datetime`,
    CHANGE COLUMN `player_id` `victim_id` INT(10) UNSIGNED NOT NULL,
    CHANGE COLUMN `admin_id` `invoker_id` INT(10) UNSIGNED NOT NULL,
    ADD COLUMN `type` VARCHAR(16) NOT NULL AFTER `invoker_id`,
    ADD INDEX `history_victim_idx` (`victim_id` ASC),
    ADD INDEX `history_invoker_idx` (`invoker_id` ASC),
    RENAME TO `history`;

ALTER TABLE `history`
    ADD CONSTRAINT `history_victim`
        FOREIGN KEY (`victim_id`)
        REFERENCES `player` (`id`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION,
    ADD CONSTRAINT `history_invoker`
        FOREIGN KEY (`invoker_id`)
        REFERENCES `player` (`id`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION;

UPDATE `history` SET `type`='warn' WHERE `type` IS NULL;

INSERT INTO `history` (`id`, `victim_id`, `invoker_id`, `type`, `datetime`, `reason`) SELECT `id`, `player_id`, `admin_id`, 'level' AS `type`, `datetime`, `level` FROM `level`;

DROP TABLE `level`;

-- create acl tables
CREATE TABLE IF NOT EXISTS `level` (
    `id` int(11) NOT NULL,
    `name` varchar(64) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `level_permission` (
    `level_id` int(11) NOT NULL,
    `permission` varchar(32) NOT NULL,
    PRIMARY KEY (`level_id`,`permission`),
    CONSTRAINT `level_permission_level` FOREIGN KEY (`level_id`) REFERENCES `level` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `player_permission` (
  `player_id` int(10) unsigned NOT NULL,
  `permission` varchar(32) NOT NULL,
  PRIMARY KEY (`player_id`,`permission`),
  CONSTRAINT `player_permission_level` FOREIGN KEY (`player_id`) REFERENCES `player` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- insert database version in config
INSERT INTO `config` (`id`, `value`) VALUES ('schema_version', '1.2.0');

-- populate acl
-- add levels
INSERT INTO `level` (`id`, `name`) VALUES (0, 'Guest');
INSERT INTO `level` (`id`, `name`) VALUES (1, 'Regular');
INSERT INTO `level` (`id`, `name`) VALUES (2, 'VIP');
INSERT INTO `level` (`id`, `name`) VALUES (3, 'Admin');
INSERT INTO `level` (`id`, `name`) VALUES (4, 'Senior Admin');
INSERT INTO `level` (`id`, `name`) VALUES (5, 'Server Owner');

-- add permissions for level 0
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (0, 'admintest');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (0, 'help');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (0, 'time');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (0, 'greeting');

-- add permissions for level 1
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (1, 'admintest');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (1, 'help');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (1, 'time');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (1, 'greeting');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (1, 'listmaps');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (1, 'listsprees');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (1, 'listrules');

-- add permissions for level 2
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (2, 'admintest');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (2, 'help');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (2, 'time');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (2, 'greeting');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (2, 'listplayers');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (2, 'listteams');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (2, 'listmaps');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (2, 'listsprees');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (2, 'listrules');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (2, 'spec999');

-- add permissions for level 3
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'admintest');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'help');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'time');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'greeting');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'listplayers');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'listteams');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'listmaps');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'listsprees');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'listrules');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'listhistory');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'listbans');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'liststats');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'adminchat');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'put');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'dropweapons');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'warn');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'mute');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'voicemute');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'spec999');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'balance');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'cointoss');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'pause');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'nextmap');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'restart');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'botadmin');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'enablevote');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'noinactivity');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'novote');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'nocensor');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (3, 'novotelimit');

-- add permissions for level 4
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'admintest');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'help');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'time');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'greeting');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'listplayers');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'listteams');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'listmaps');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'listsprees');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'listrules');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'listhistory');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'listwarns');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'listbans');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'listaliases');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'liststats');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'finger');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'adminchat');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'put');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'dropweapons');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'rename');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'freeze');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'disorient');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'burn');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'slap');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'gib');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'throw');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'glow');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'pants');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'pop');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'warn');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'mute');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'voicemute');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'kick');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'ban');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'spec999');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'balance');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'lockplayers');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'lockteam');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'shuffle');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'swap');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'cointoss');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'pause');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'nextmap');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'restart');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'botadmin');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'enablevote');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'cancelvote');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'passvote');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'news');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'noinactivity');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'novote');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'nocensor');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'nobalance');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'novotelimit');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'noreason');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'teamcmds');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (4, 'silentcmds');

-- add permissions for level 5
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'admintest');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'help');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'time');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'greeting');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'listplayers');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'listteams');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'listmaps');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'listsprees');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'listrules');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'listhistory');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'listwarns');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'listbans');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'listaliases');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'liststats');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'finger');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'adminchat');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'put');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'dropweapons');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'rename');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'freeze');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'disorient');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'burn');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'slap');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'gib');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'throw');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'glow');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'pants');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'pop');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'warn');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'mute');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'voicemute');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'kick');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'ban');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'spec999');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'balance');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'lockplayers');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'lockteam');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'shuffle');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'swap');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'cointoss');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'pause');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'nextmap');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'restart');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'botadmin');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'enablevote');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'cancelvote');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'passvote');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'news');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'uptime');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'setlevel');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'readconfig');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'noinactivity');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'novote');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'nocensor');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'nobalance');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'novotelimit');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'noreason');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'perma');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'teamcmds');
INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'silentcmds');

INSERT INTO `level_permission`(`level_id`, `permission`) VALUES (5, 'spy');

-- update player table
ALTER TABLE `player`
    ADD COLUMN `level_id` INT NOT NULL AFTER `ip`,
    ADD COLUMN `lastseen` INT UNSIGNED NOT NULL AFTER `level_id`,
    ADD COLUMN `seen` INT UNSIGNED NOT NULL AFTER `lastseen`,
    ADD INDEX `player_level_idx` (`level_id` ASC);
ALTER TABLE `player`
    ADD CONSTRAINT `player_level`
        FOREIGN KEY (`level_id`)
        REFERENCES `level` (`id`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION;

-- set level of console
UPDATE `player` SET `level_id`=5 WHERE `guid`='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';

-- set last seen information
UPDATE `player` SET `lastseen`=(SELECT MAX(`lastused`) AS `lastused` FROM `alias` AS `a` WHERE `a`.`player_id`=`player`.`id`);
UPDATE `player` SET `seen`=(SELECT SUM(`used`) AS `used` FROM `alias` AS `a` WHERE `a`.`player_id`=`player`.`id`);

-- create mute and ban tables
CREATE TABLE IF NOT EXISTS `mute` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `victim_id` int(10) unsigned NOT NULL,
    `invoker_id` int(10) unsigned NOT NULL,
    `type` smallint(5) unsigned NOT NULL,
    `issued` int(10) unsigned NOT NULL,
    `expires` int(10) unsigned NOT NULL,
    `duration` int(10) unsigned NOT NULL,
    `reason` varchar(128) CHARACTER SET utf8 NOT NULL,
    PRIMARY KEY (`id`),
    KEY `mute_victim_idx` (`victim_id`),
    KEY `mute_invoker_idx` (`invoker_id`),
    CONSTRAINT `mute_invoker` FOREIGN KEY (`invoker_id`) REFERENCES `player` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
    CONSTRAINT `mute_victim` FOREIGN KEY (`victim_id`) REFERENCES `player` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE IF NOT EXISTS `ban` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `victim_id` int(10) unsigned DEFAULT NULL,
    `invoker_id` int(10) unsigned NOT NULL,
    `issued` int(10) unsigned NOT NULL,
    `expires` int(10) unsigned NOT NULL,
    `duration` int(10) unsigned NOT NULL,
    `reason` varchar(128) CHARACTER SET utf8 NOT NULL,
    PRIMARY KEY (`id`),
    KEY `ban_victim_idx` (`victim_id`),
    KEY `ban_invoker_idx` (`invoker_id`),
    CONSTRAINT `ban_invoker` FOREIGN KEY (`invoker_id`) REFERENCES `player` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
    CONSTRAINT `ban_victim` FOREIGN KEY (`victim_id`) REFERENCES `player` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- update existing tables to UTF-8
ALTER TABLE `alias`
    CHARACTER SET = utf8, COLLATE = utf8_unicode_ci;

ALTER TABLE `player`
    CHARACTER SET = utf8, COLLATE = utf8_unicode_ci;

ALTER TABLE `map`
    CHARACTER SET = utf8, COLLATE = utf8_unicode_ci;

ALTER TABLE `record`
    CHARACTER SET = utf8, COLLATE = utf8_unicode_ci;
