{lib, config, pkgs, ... }:

with lib;

let
  cfg = config.services.sdtdserver;
  gamePath = "/var/lib/sdtdserver";
  gameOptions = {
    ServerPort="26900";
    ServerVisibility="2";
    ServerName="Serveur des loutres";
    ServerPassword="";
    ServerMaxPlayerCount="16";
    ServerReservedSlots="0";
    ServerReservedSlotsPermission="100";
    ServerAdminSlots="0";
    ServerAdminSlotsPermission="0";
    ServerDescription="Un serveur idiot anti gilets jaunes";
    ServerWebsiteURL="";
    ServerDisabledNetworkProtocols="";
    GameWorld="Navezgane";
    WorldGenSeed="Lakeu";
    WorldGenSize="4096";
    GameName="Lakeu";
    GameDifficulty="2";
    GameMode="GameModeSurvival";
    ZombiesRun="0";
    ZombieMove="0";
    ZombieMoveNight="3";
    ZombieFeralMove="3";
    ZombieBMMove="3";
    BuildCreate="false";
    DayNightLength="60";
    DayLightLength="18";
    PlayerKillingMode="3";
    PersistentPlayerProfiles="false";
    PlayerSafeZoneLevel="5";
    PlayerSafeZoneHours="5";
    ControlPanelEnabled="false";
    ControlPanelPort="8080";
    ControlPanelPassword="CHANGEME";
    TelnetEnabled="false";
    TelnetPort="8081";
    TelnetPassword="";
    TelnetFailedLoginLimit="10";
    TelnetFailedLoginsBlocktime="10";
    TerminalWindowEnabled="false";
    AdminFileName="serveradmin.xml";
    DropOnDeath="0";
    DropOnQuit="0";
    BloodMoonEnemyCount="8";
    EnemySpawnMode="true";
    EnemyDifficulty="0";
    BlockDurabilityModifier="100";
    LootAbundance="100";
    LootRespawnDays="30";
    LandClaimSize="41";
    LandClaimDeadZone="30";
    LandClaimExpiryTime="3";
    LandClaimDecayMode="0";
    LandClaimOnlineDurabilityModifier="4";
    LandClaimOfflineDurabilityModifier="4";
    PartySharedKillRange="100";
    AirDropFrequency="72";
    AirDropMarker="false";
    MaxSpawnedZombies="60";
    MaxSpawnedAnimals="50";
    EACEnabled="true";
    HideCommandExecutionLog="0";
    MaxUncoveredMapChunksPerPlayer="131072";
    BedrollDeadZoneSize="15";
    ServerLoginConfirmationText="Prout";
  };
  gameConfig = builtins.toFile "serverconfig.xml" ''
    <?xml version="1.0"?>
    <ServerSettings>
    ${concatStrings (
      mapAttrsToList (name: value:
       "  <property name=\"${name}\"	value=\"${value}\"/>\n"
    ) gameOptions)}
    </ServerSettings>
  '';
in
{
  options.services.sdtdserver = {
    enable = mkEnableOption "Activation du serveur dédié 7 Days to Die";
  };

  config = mkIf cfg.enable {

    systemd.services.sdtdserver = {
      description = "Serveur dédié 7 Days to Die";
      requires = ["network-online.target"];
      wantedBy = ["multi-user.target"];
      environment = { HOME = gamePath; };
      serviceConfig = {
        DynamicUser = true;
        StateDirectory = "sdtdserver";
      };
      preStart = let
        libPath = with pkgs; lib.makeLibraryPath [
          stdenv.cc.cc.lib
        ];
      in ''
        ${pkgs.steamcmd}/bin/steamcmd +login anonymous +force_install_dir ${gamePath} +app_update 294420 validate +quit
        install -m666 ${gameConfig} ${gamePath}/serverconfig.xml
      '';
      script = ''
        ${pkgs.steam-run}/bin/steam-run ${gamePath}/7DaysToDieServer.x86_64 -quit -batchmode -nographics -dedicated -configfile=serverconfig.xml
      '';
    };

    networking.firewall = {
      allowedTCPPorts = [ 26900 ];
      allowedUDPPorts = [ 26900 26901 26902 ];
    };

  };

}