{pkgs, ...}:
let
  baseExtensions = pkgs.nix4vscode.forVscode [
    # QOL
    "mhutchie.git-graph"
    "redhat.vscode-yaml"
    "github.copilot"
    "github.copilot-chat"
    # Nix environment selector
    "arrterian.nix-env-selector"
    # continue.continue
  ];


  baseSettings = {
    # visual
    "window.titleBarStyle" = "native";
    "window.customTitleBarVisibility" = "never";
    "window.menuBarVisibility" = "hidden";

    "window.autoDetectColorScheme" = true;
    "workbench.preferredDarkColorTheme" = "Default Dark Modern";
    "workbench.preferredLightColorTheme" = "Default Light Modern";

    "editor.fontFamily" = "'FiraCode Nerd Font Mono', 'monospace', monospace";
    "terminal.integrated.fontFamily" = "FiraCode Nerd Font Mono";
    "workbench.iconTheme" = "vs-seti";

    # telemetry
    "telemetry.telemetryLevel" = "off";
    "redhat.telemetry.enabled" = false;

    # editor QOL
    "security.workspace.trust.untrustedFiles" = "open";
    "editor.wordWrap" = "on";
    "editor.suggestSelection" = "first";
    "editor.renderWhitespace" = "none";
    "editor.acceptSuggestionOnEnter" = "off";
    "editor.fontLigatures" = true;
    "editor.inlineSuggest.enabled" = true;
    "editor.bracketPairColorization.enabled" = true;
    "editor.unicodeHighlight.nonBasicASCII" = false;
    "editor.unicodeHighlight.invisibleCharacters" = false;
    "editor.unicodeHighlight.ambiguousCharacters" = false;

    "files.autoSave" = "onWindowChange";
    "files.autoSaveDelay" = 1000;
    "files.insertFinalNewline" = true;
    "files.trimTrailingWhitespace" = true;

    "explorer.confirmDelete" = false;
    "explorer.confirmDragAndDrop" = false;
    "terminal.integrated.enableMultiLinePasteWarning" = false;
    "update.showReleaseNotes" = false;
    "terminal.external.linuxExec" = "kitty";
    "workbench.startupEditor" = "newUntitledFile";

    # Extension management
    "extensions.autoCheckUpdates" = false;
    "extensions.autoUpdate" = false;
    "extensions.ignoreRecommendations" = true;

    # git
    "git.ignoreMissingGitWarning" = true;
    "git.confirmSync" = false;
    "git.enableSmartCommit" = true;
    "git.autofetch" = true;
    "diffEditor.renderSideBySide" = false;
    "diffEditor.hideUnchangedRegions.enabled" = true;
    "diffEditor.ignoreTrimWhitespace" = false;

    # Copilot
    "github.copilot.editor.enableAutoCompletions" = true;
    "github.copilot.advanced" = {};
    "github.copilot.enable" = {
        "*" = true;
    };

    # Python
    "python.terminal.activateEnvironment" = false; # let nix-shell handle this
  };

  baseKeybindings = [
    # comment/uncomment line
    {
      key = "ctrl+[Backslash]"; # was ctrl+# but vscode reads the key differently apparently
      command = "editor.action.commentLine";
      when = "editorTextFocus";
    }
  ];

in
{
  programs.vscode = {
    enable = true;

    profiles.default = {
      userSettings = baseSettings // {
        "window.newWindowProfile" = "development";
      };
      extensions = [];
    };

    profiles.development = {
      extensions = baseExtensions ++ pkgs.nix4vscode.forVscode [
        # python
        "ms-python.python"
        "ms-python.isort"
        "ms-python.debugpy"
        "ms-python.vscode-pylance"

        # nix language
        "jnoortheen.nix-ide"

        # Flutter and co
        "dart-code.flutter"
        "dart-code.dart-code"

      ];

      keybindings = baseKeybindings;

      userSettings = baseSettings;
    };


    profiles.science = {
      extensions = baseExtensions ++ pkgs.nix4vscode.forVscode [
        # python + jupyter
        "ms-python.python"
        "ms-python.isort"
        "ms-python.debugpy"
        "ms-python.vscode-pylance"
        "ms-toolsai.vscode-jupyter-slideshow"
        "ms-toolsai.jupyter"
        "ms-toolsai.jupyter-hub"
        "ms-toolsai.jupyter-renderers"
        # Typst
        "myriad-dreamin.tinymist"
      ];

      keybindings = baseKeybindings ++ [
        # run code cell in jupyter
        {
          key = "ctrl+enter";
          command = "jupyter.runcurrentcell";
          when = "editorTextFocus && isWorkspaceTrusted && jupyter.hascodecells && !editorHasSelection && !isCompositeNotebook && !notebookEditorFocused";
        }
      ];

      userSettings = baseSettings // {
        "jupyter.disableJupyterAutoStart" = true;
        "jupyter.askForKernelRestart" = false;
        "workbench.editorAssociations" = {
            "*.ipynb" = "jupyter-notebook";
        };
        "notebook.cellToolbarLocation" = {
            "default" = "right";
            "jupyter-notebook" = "left";
        };
        "jupyter.widgetScriptSources" = [
            "jsdelivr.com"
            "unpkg.com"
        ];

        # Typst
        "[typst]" = {
            "editor.wordSeparators" = "`~!@#$%^&*()=+[{]}\\|;:'\",.<>/?";
        };
        "[typst-code]" = {
            "editor.wordSeparators" = "`~!@#$%^&*()=+[{]}\\|;:'\",.<>/?";
        };
        "tinymist.fontPaths" = [
            "./font"
        ];
        "workbench.colorCustomizations" = {
          "statusBar.background" = "#003f9293";
        };
      };
    };
  };
}
