/**
 * Author: dkanus
 * Home repo: https://www.insultplayers.ru/git/AcediaFramework/AcediaCore
 * License: GPL
 * Copyright 2021-2023 Anton Tarasenko
 *------------------------------------------------------------------------------
 * This file is part of Acedia.
 *
 * Acedia is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, version 3 of the License, or
 * (at your option) any later version.
 *
 * Acedia is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Acedia.  If not, see <https://www.gnu.org/licenses/>.
 */
class VotingPermissions extends AcediaConfig
    perobjectconfig
    config(AcediaCommands);

/// Determines the duration of the voting period, specified in seconds.
/// Zero or negative values mean unlimited voting period.
var public config float votingTime;

/// Determines whether spectators are allowed to vote.
var public config bool allowSpectatorVoting;
/// Determines how draw will be interpreted.
/// `true` means draw counts as a vote's success, `false` means draw counts as a vote's failure.
var public config bool drawEqualsSuccess;
/// Specifies which group(s) of players are allowed to see who makes what vote.
var public config array<string> allowedToVoteGroup;
/// Specifies which group(s) of players are allowed to see who makes what vote.
var public config array<string> allowedToSeeVotesGroup;
/// Specifies which group(s) of players are allowed to forcibly end voting.
var public config array<string> allowedToForceGroup;

protected function HashTable ToData() {
    local int i;
    local HashTable data;
    local ArrayList arrayOfTexts;

    data = __().collections.EmptyHashTable();
    data.SetFloat(P("votingTime"), votingTime);
    data.SetBool(P("allowSpectatorVoting"), allowSpectatorVoting);
    data.SetBool(P("drawEqualsSuccess"), drawEqualsSuccess);

    arrayOfTexts = _.collections.EmptyArrayList();
    for (i = 0; i < allowedToVoteGroup.length; i += 1) {
        arrayOfTexts.AddString(allowedToVoteGroup[i]);
    }
    data.SetItem(P("allowedToVoteGroup"), arrayOfTexts);
    _.memory.Free(arrayOfTexts);

    arrayOfTexts = _.collections.EmptyArrayList();
    for (i = 0; i < allowedToSeeVotesGroup.length; i += 1) {
        arrayOfTexts.AddString(allowedToSeeVotesGroup[i]);
    }
    data.SetItem(P("allowedToSeeVotesGroup"), arrayOfTexts);
    _.memory.Free(arrayOfTexts);

    arrayOfTexts = _.collections.EmptyArrayList();
    for (i = 0; i < allowedToForceGroup.length; i += 1) {
        arrayOfTexts.AddString(allowedToForceGroup[i]);
    }
    data.SetItem(P("allowedToForceGroup"), arrayOfTexts);
    _.memory.Free(arrayOfTexts);
    return data;
}

protected function FromData(HashTable source) {
    local int i;
    local ArrayList arrayOfTexts;

    if (source == none) {
        return;
    }
    votingTime = source.GetFloat(P("votingTime"), 30.0);
    allowSpectatorVoting = source.GetBool(P("allowSpectatorVoting"), false);
    drawEqualsSuccess = source.GetBool(P("drawEqualsSuccess"), false);

    allowedToVoteGroup.length = 0;
    arrayOfTexts = source.GetArrayList(P("allowedToVoteGroup"));
    for (i = 0; i < arrayOfTexts.GetLength(); i += 1) {
        allowedToVoteGroup[allowedToVoteGroup.length] = arrayOfTexts.GetString(i);
    }

    allowedToSeeVotesGroup.length = 0;
    arrayOfTexts = source.GetArrayList(P("allowedToSeeVotesGroup"));
    for (i = 0; i < arrayOfTexts.GetLength(); i += 1) {
        allowedToSeeVotesGroup[allowedToSeeVotesGroup.length] = arrayOfTexts.GetString(i);
    }
    _.memory.Free(arrayOfTexts);

    allowedToForceGroup.length = 0;
    arrayOfTexts = source.GetArrayList(P("allowedToForceGroup"));
    for (i = 0; i < arrayOfTexts.GetLength(); i += 1) {
        allowedToForceGroup[allowedToForceGroup.length] = arrayOfTexts.GetString(i);
    }
    _.memory.Free(arrayOfTexts);
}

protected function DefaultIt() {
    votingTime = 30.0;
    drawEqualsSuccess = false;
    allowSpectatorVoting = false;

    allowedToVoteGroup.length = 0;
    allowedToSeeVotesGroup.length = 0;
    allowedToForceGroup.length = 0;

    allowedToVoteGroup[0] = "all";
    allowedToSeeVotesGroup[0] = "all";
    allowedToForceGroup[0] = "admin";
    allowedToForceGroup[1] = "moderator";
}

defaultproperties {
    configName = "AcediaCommands"
    supportsDataConversion = true
    votingTime = 30.0
    drawEqualsSuccess = false
    allowSpectatorVoting = false
    allowedToVoteGroup(0) = "all"
    allowedToSeeVotesGroup(0) = "all"
    allowedToForceGroup(0) = "admin"
    allowedToForceGroup(1) = "moderator"
}