{
  lib,
  ...
}:
let
  inherit (lib.nixvim) defaultNullOpts;
in
lib.nixvim.plugins.mkNeovimPlugin {
  name = "codeium-nvim";
  packPathName = "codeium.nvim";
  moduleName = "codeium";

  maintainers = with lib.maintainers; [
    GaetanLepage
    khaneliman
  ];

  # TODO: added 2024-09-03 remove after 24.11
  deprecateExtraOptions = true;
  optionsRenamedToSettings = [
    "configPath"
    "binPath"
    [
      "api"
      "host"
    ]
    [
      "api"
      "port"
    ]
    [
      "tools"
      "uname"
    ]
    [
      "tools"
      "uuidgen"
    ]
    [
      "tools"
      "curl"
    ]
    [
      "tools"
      "gzip"
    ]
    [
      "tools"
      "languageServer"
    ]
    "wrapper"
  ];

  # Register nvim-cmp association
  imports = [
    { cmpSourcePlugins.codeium = "codeium-nvim"; }
  ];

  settingsOptions = {
    config_path = defaultNullOpts.mkStr {
      __raw = "vim.fn.stdpath('cache') .. '/codeium/config.json'";
    } "The path to the config file, used to store the API key.";

    bin_path = defaultNullOpts.mkStr {
      __raw = "vim.fn.stdpath('cache') .. '/codeium/bin'";
    } "The path to the directory where the Codeium server will be downloaded to.";

    api = {
      host = defaultNullOpts.mkStr "server.codeium.com" ''
        The hostname of the API server to use.
      '';

      port = defaultNullOpts.mkNullableWithRaw' {
        # TODO: Added 2024-09-05; remove after 24.11
        type = with lib.types; lib.nixvim.transitionType ints.positive toString (strMatching "[0-9]+");
        pluginDefault = "443";
        description = ''
          The port of the API server to use.
        '';
      };
    };

    tools = {
      uname = defaultNullOpts.mkStr null "The path to the `uname` binary.";

      uuidgen = defaultNullOpts.mkStr null "The path to the `uuidgen` binary.";

      curl = defaultNullOpts.mkStr null "The path to the `curl` binary.";

      gzip = defaultNullOpts.mkStr null "The path to the `gzip` binary.";

      language_server = defaultNullOpts.mkStr null ''
        The path to the language server downloaded from the official source.
      '';
    };

    wrapper = defaultNullOpts.mkStr null ''
      The path to a wrapper script/binary that is used to execute any binaries not listed under
      tools.
      This is primarily useful for NixOS, where a FHS wrapper can be used for the downloaded
      codeium server.
    '';

    detect_proxy = defaultNullOpts.mkBool false "Whether to enable the proxy detection.";

    enable_chat = defaultNullOpts.mkBool false "Whether to enable the chat functionality.";

    enterprise_mode = defaultNullOpts.mkBool false "Whether to enable the enterprise mode.";
  };

  settingsExample = lib.literalExpression ''
    {
      enable_chat = true;
      tools = {
        curl = lib.getExe pkgs.curl;
        gzip = lib.getExe pkgs.gzip;
        uname = lib.getExe' pkgs.coreutils "uname";
        uuidgen = lib.getExe' pkgs.util-linux "uuidgen";
      };
    }
  '';
}
