# vim: ts=2
{
  description = "Nixos system config";

  inputs = {
    # base
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";

    # inputs for following
    systems = {
      url = "github:nix-systems/x86_64-linux"; # only evaluate for this system
    };
    flake-compat = {
      url = "github:edolstra/flake-compat";
      flake = false;
    };
    crane = {
      url = "github:ipetkov/crane";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        flake-compat.follows = "flake-compat";
        flake-utils.follows = "flake-utils";
        rust-overlay.follows = "rust-overlay";
      };
    };
    flake-utils = {
      url = "github:numtide/flake-utils";
      inputs = {
        systems.follows = "systems";
      };
    };
    rust-overlay = {
      url = "github:oxalica/rust-overlay";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        flake-utils.follows = "flake-utils";
      };
    };

    # nixos modules
    home-manager = {
      url = "github:nix-community/home-manager/master";
      inputs = {
        nixpkgs.follows = "nixpkgs";
      };
    };
    agenix = {
      url = "github:ryantm/agenix";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        home-manager.follows = "home-manager";
      };
    };
    ragenix = {
      url = "github:yaxitech/ragenix";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        agenix.follows = "agenix";
        flake-utils.follows = "flake-utils";
        rust-overlay.follows = "rust-overlay";
        crane.follows = "crane";
      };
    };
    impermanence = {
      url = "github:nix-community/impermanence";
      inputs = {
      };
    };
    nixos-generators = {
      url = "github:nix-community/nixos-generators";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    # my configs
    neovim_config = {
      url = "git+https://codeberg.org/soispha/neovim-config.git";
      flake = false;
    };
    templates = {
      url = "git+https://codeberg.org/ene/nixos-templates.git";
      inputs = {
      };
    };

    # my bins
    grades = {
      url = "git+https://codeberg.org/soispha/grades.git";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        crane.follows = "crane";
        flake-utils.follows = "flake-utils";
        rust-overlay.follows = "rust-overlay";
      };
    };
    video_pause = {
      url = "git+https://codeberg.org/soispha/video-pause.git";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        crane.follows = "crane";
        flake-utils.follows = "flake-utils";
      };
    };
    strip_js_comments = {
      url = "git+https://codeberg.org/ene/strip_js_comments.git";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        crane.follows = "crane";
        flake-utils.follows = "flake-utils";
      };
    };
    shell_library = {
      url = "git+https://codeberg.org/soispha/shell_library.git";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        flake-utils.follows = "flake-utils";
        systems.follows = "systems";
      };
    };
    river_init_lesser = {
      url = "git+https://codeberg.org/soispha/river_keymap_init.git";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        crane.follows = "crane";
        flake-utils.follows = "flake-utils";
        rust-overlay.follows = "rust-overlay";
        flake-compat.follows = "flake-compat";
      };
    };
    yambar_cpu = {
      url = "git+https://codeberg.org/soispha/yambar_cpu.git";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        crane.follows = "crane";
        flake-utils.follows = "flake-utils";
      };
    };
    yambar_memory = {
      url = "git+https://codeberg.org/soispha/yambar_memory.git";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        crane.follows = "crane";
        flake-utils.follows = "flake-utils";
      };
    };
    flake_update = {
      url = "git+https://codeberg.org/soispha/flake_update.git";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        systems.follows = "systems";
        flake-utils.follows = "flake-utils";
        shell_library.follows = "shell_library";
      };
    };

    # external resources
    user_js = {
      url = "github:arkenfox/user.js";
      flake = false;
    };
    snap-sync = {
      url = "github:qubidt/snap-sync";
      flake = false;
    };
  };

  outputs = {
    # core
    self,
    nixpkgs,
    # modules
    home-manager,
    nixos-generators,
    impermanence,
    agenix,
    ragenix,
    # external dependencies
    neovim_config,
    user_js,
    snap-sync,
    templates,
    # my binaries
    video_pause,
    strip_js_comments,
    shell_library,
    river_init_lesser,
    yambar_memory,
    yambar_cpu,
    grades,
    flake_update,
    ...
  }: let
    sysLib = shell_library.lib.${system};
    system = "x86_64-linux";
    pkgs = import nixpkgs (import ./system/nixpkgs {
      inherit (nixpkgs) lib;
      inherit system;
    });
    outputs = import ./flake {
      inherit
        # core
        self
        pkgs
        system
        sysLib
        nixpkgs
        # modules
        
        home-manager
        nixos-generators
        impermanence
        agenix
        ragenix
        # external dependencies
        
        neovim_config
        user_js
        snap-sync
        templates
        # my binaries
        
        video_pause
        strip_js_comments
        shell_library
        river_init_lesser
        yambar_memory
        yambar_cpu
        grades
        flake_update
        ;
    };
  in
    outputs;
}