{
  lib,
  config,
  ...
} @ input: {
  options = {
    services.syncthing = {
      configuration = (import ./configuration-type.nix) input;
      deviceName = lib.mkOption {
        type = lib.types.string;
      };
    };
  };

  config = {
    services.syncthing.settings = {
      devices =
        lib.attrsets.mapAttrs (name: deviceConfig: {
          id = deviceConfig.id;
        })
        config.services.syncthing.configuration.devices;
      folders =
        lib.attrsets.mapAttrs (folderName: folder: {
          id = folder.folder.id;
          label = folder.folder.label;
          path = folder.path;
          devices = lib.attrsets.mapAttrsToList (_: device: device.name) (
            lib.attrsets.filterAttrs (
              deviceName: device:
                lib.lists.any
                (
                  deviceFolder: deviceFolder.folder.id == folder.folder.id
                ) (
                  lib.attrsets.mapAttrsToList (_: deviceFolder: deviceFolder) device.folders
                )
            )
            config.services.syncthing.configuration.devices
          );
        })
        config.services.syncthing.configuration.devices.${config.services.syncthing.deviceName}.folders;
    };
  };
}