; This file is part of OpenTTD.
; OpenTTD 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 2.
; OpenTTD 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 OpenTTD. If not, see <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
;

; These are settings that are company-wide. Meaning that if 1 player in a
; company changes them, it changes for all players.

[pre-amble]
static void UpdateAllServiceInterval(int32_t new_value);
static bool CanUpdateServiceInterval(VehicleType type, int32_t &new_value);
static void UpdateServiceInterval(VehicleType type, int32_t new_value);
static std::pair<StringParameter, StringParameter> SettingsValueAbsolute(const IntSettingDesc &sd, int32_t value);
static std::pair<StringParameter, StringParameter> ServiceIntervalSettingsValueText(const IntSettingDesc &sd, int32_t value);
static int32_t GetDefaultServiceInterval(const IntSettingDesc &sd, VehicleType type);
static std::tuple<int32_t, uint32_t> GetServiceIntervalRange(const IntSettingDesc &sd);

static const SettingVariant _company_settings_table[] = {
[post-amble]
};
[templates]
SDT_BOOL = SDT_BOOL(CompanySettings, $var,        SettingFlags({$flags}), $def,                        $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $def_cb, $from, $to, $cat, $extra, $startup),
SDT_VAR  =  SDT_VAR(CompanySettings, $var, $type, SettingFlags({$flags}), $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $def_cb, $range_cb, $from, $to, $cat, $extra, $startup),

[validation]
SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for CompanySettings.$var exceeds storage size");

[defaults]
flags    = SettingFlag::PerCompany
interval = 0
str      = STR_NULL
strhelp  = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT
strval   = STR_NULL
pre_cb   = nullptr
post_cb  = nullptr
str_cb   = nullptr
help_cb  = nullptr
val_cb   = nullptr
def_cb   = nullptr
range_cb = nullptr
load     = nullptr
from     = SL_MIN_VERSION
to       = SL_MAX_VERSION
cat      = SC_ADVANCED
extra    = 0
startup  = false



[SDT_BOOL]
var      = engine_renew
def      = true
str      = STR_CONFIG_SETTING_AUTORENEW_VEHICLE
strhelp  = STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT
cat      = SC_BASIC

[SDT_VAR]
var      = engine_renew_months
type     = SLE_INT16
flags    = SettingFlag::PerCompany
def      = 6
min      = -12
max      = 12
str      = STR_CONFIG_SETTING_AUTORENEW_MONTHS
strhelp  = STR_CONFIG_SETTING_AUTORENEW_MONTHS_HELPTEXT
strval   = STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_BEFORE
val_cb   = SettingsValueAbsolute

[SDT_VAR]
var      = engine_renew_money
type     = SLE_UINT
flags    = SettingFlag::PerCompany, SettingFlag::GuiCurrency
def      = 100000
min      = 0
max      = 2000000
str      = STR_CONFIG_SETTING_AUTORENEW_MONEY
strhelp  = STR_CONFIG_SETTING_AUTORENEW_MONEY_HELPTEXT
strval   = STR_JUST_CURRENCY_LONG

[SDT_BOOL]
var      = renew_keep_length
def      = false

[SDT_BOOL]
var      = vehicle.servint_ispercent
def      = false
str      = STR_CONFIG_SETTING_SERVINT_ISPERCENT
strhelp  = STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT
post_cb  = UpdateAllServiceInterval

[SDT_VAR]
var      = vehicle.servint_trains
type     = SLE_UINT16
flags    = SettingFlag::PerCompany, SettingFlag::GuiZeroIsSpecial
def      = DEF_SERVINT_DAYS_TRAINS
min      = MIN_SERVINT_MINUTES
max      = MAX_SERVINT_DAYS
interval = 1
str      = STR_CONFIG_SETTING_SERVINT_TRAINS
strhelp  = STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT
strval   = STR_CONFIG_SETTING_SERVINT_VALUE_DAYS
pre_cb   = [](auto &new_value) { return CanUpdateServiceInterval(VEH_TRAIN, new_value); }
post_cb  = [](auto new_value) { UpdateServiceInterval(VEH_TRAIN, new_value); }
def_cb   = [](auto &sd) { return GetDefaultServiceInterval(sd, VEH_TRAIN); }
val_cb   = ServiceIntervalSettingsValueText
range_cb = GetServiceIntervalRange

[SDT_VAR]
var      = vehicle.servint_roadveh
type     = SLE_UINT16
flags    = SettingFlag::PerCompany, SettingFlag::GuiZeroIsSpecial
def      = DEF_SERVINT_DAYS_ROADVEH
min      = MIN_SERVINT_MINUTES
max      = MAX_SERVINT_DAYS
interval = 1
str      = STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES
strhelp  = STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES_HELPTEXT
strval   = STR_CONFIG_SETTING_SERVINT_VALUE_DAYS
pre_cb   = [](auto &new_value) { return CanUpdateServiceInterval(VEH_ROAD, new_value); }
post_cb  = [](auto new_value) { UpdateServiceInterval(VEH_ROAD, new_value); }
def_cb   = [](auto &sd) { return GetDefaultServiceInterval(sd, VEH_ROAD); }
val_cb   = ServiceIntervalSettingsValueText
range_cb = GetServiceIntervalRange

[SDT_VAR]
var      = vehicle.servint_ships
type     = SLE_UINT16
flags    = SettingFlag::PerCompany, SettingFlag::GuiZeroIsSpecial
def      = DEF_SERVINT_DAYS_SHIPS
min      = MIN_SERVINT_MINUTES
max      = MAX_SERVINT_DAYS
interval = 1
str      = STR_CONFIG_SETTING_SERVINT_SHIPS
strhelp  = STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT
strval   = STR_CONFIG_SETTING_SERVINT_VALUE_DAYS
pre_cb   = [](auto &new_value) { return CanUpdateServiceInterval(VEH_SHIP, new_value); }
post_cb  = [](auto new_value) { UpdateServiceInterval(VEH_SHIP, new_value); }
def_cb   = [](auto &sd) { return GetDefaultServiceInterval(sd, VEH_SHIP); }
val_cb   = ServiceIntervalSettingsValueText
range_cb = GetServiceIntervalRange

[SDT_VAR]
var      = vehicle.servint_aircraft
type     = SLE_UINT16
flags    = SettingFlag::PerCompany, SettingFlag::GuiZeroIsSpecial
def      = DEF_SERVINT_DAYS_AIRCRAFT
min      = MIN_SERVINT_MINUTES
max      = MAX_SERVINT_DAYS
interval = 1
str      = STR_CONFIG_SETTING_SERVINT_AIRCRAFT
strhelp  = STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT
strval   = STR_CONFIG_SETTING_SERVINT_VALUE_DAYS
pre_cb   = [](auto &new_value) { return CanUpdateServiceInterval(VEH_AIRCRAFT, new_value); }
post_cb  = [](auto new_value) { UpdateServiceInterval(VEH_AIRCRAFT, new_value); }
def_cb   = [](auto &sd) { return GetDefaultServiceInterval(sd, VEH_AIRCRAFT); }
val_cb   = ServiceIntervalSettingsValueText
range_cb = GetServiceIntervalRange
