# An "impure" template thx to `pyproject.nix`,
# https://pyproject-nix.github.io/pyproject.nix/templates.html#impure
# https://github.com/pyproject-nix/pyproject.nix/blob/master/templates/impure/flake.nix
{
  description = "An impure `piker` overlay using `uv` with Nix(OS)";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
  };

  outputs =
    { nixpkgs, ... }:
    let
      inherit (nixpkgs) lib;
      forAllSystems = lib.genAttrs lib.systems.flakeExposed;
    in
    {
      devShells = forAllSystems (
        system:
        let
          pkgs = nixpkgs.legacyPackages.${system};

          # do store-path extractions
          qt6baseStorePath = lib.getLib pkgs.qt6.qtbase;
          # ?TODO? can remove below since manual linking not needed?
          # qt6QtWaylandStorePath = lib.getLib pkgs.qt6.qtwayland;

          # XXX NOTE XXX, for now we overlay specific pkgs via
          # a major-version-pinned-`cpython`
          cpython = "python313";
          pypkgs = pkgs."${cpython}Packages";
        in
        {
          default = pkgs.mkShell {

            packages = with pkgs; [
              # XXX, ensure sh completions active!
              bashInteractive
              bash-completion

              # dev utils
              ruff
              pypkgs.ruff

              qt6.qtwayland
              qt6.qtbase

              uv
              python313  # ?TODO^ how to set from `cpython` above?
              pypkgs.pyqt6
              pypkgs.pyqt6-sip
              pypkgs.qtpy
              pypkgs.qdarkstyle
              pypkgs.rapidfuzz
            ];

            shellHook = ''
              # unmask to debug **this** dev-shell-hook
              # set -e

              # set qt-base/plugin path(s)
              QTBASE_PATH="${qt6baseStorePath}/lib"
              QT_PLUGIN_PATH="${qt6baseStorePath}/lib/qt-6/plugins"
              QT_QPA_PLATFORM_PLUGIN_PATH="$QT_PLUGIN_PATH/platforms"

              # link in Qt cc lib paths from <nixpkgs>
              LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$QTBASE_PATH"
              LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$QT_PLUGIN_PATH"
              LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$QT_QPA_PLATFORM_PLUGIN_PATH"

              # link-in c++ stdlib for various AOT-ext-pkgs (numpy, etc.)
              LD_LIBRARY_PATH="${pkgs.stdenv.cc.cc.lib}/lib:$LD_LIBRARY_PATH"

              export LD_LIBRARY_PATH

              # RUNTIME-SETTINGS
              #
              # ------ Qt ------
              # XXX, unmask to debug qt .so linking/loading deats
              # export QT_DEBUG_PLUGINS=1
              #
              # ALSO, for *modern linux* DEs,
              # - maybe set wayland-mode (TODO, parametrtize this!)
              #  * a chosen wayland-mode shell-integration
              export QT_QPA_PLATFORM="wayland"
              export QT_WAYLAND_SHELL_INTEGRATION="xdg-shell"

              # ------ uv ------
              # - always use the ./py313/ venv-subdir
              export UV_PROJECT_ENVIRONMENT="py313"
              # sync project-env with all extras
              uv sync --dev --all-extras --no-group lint

              # ------ TIPS ------
              # NOTE, to launch the py-venv installed `xonsh` (like @goodboy)
              # run the `nix develop` cmd with,
              # >> nix develop -c uv run xonsh
            '';
          };
        }
      );
    };
}
