# TV next to acr1. Raspberry Pi 4 with PoE hat.
#
# This is an aarch64 machine. You'll probably have to use a remote builder to
# cross compile for it. See //ops/README.md for information about how to set
# that up.

{ config, pkgs, ... }:

let
  nixos-hardware = builtins.fetchGit {
    url = "https://github.com/NixOS/nixos-hardware.git";
    rev = "3bf48d3587d3f34f745a19ebc968b002ef5b5c5a";
  };

in {
  imports =
    [ # Include the results of the hardware scan.
      ./hardware-configuration.nix
      "${nixos-hardware}/raspberry-pi/4"
    ];

  boot.loader.grub.enable = false;
  boot.loader.generic-extlinux-compatible.enable = true;

  networking.hostName = "tv1";
  networking.domain = "waw.hackerspace.pl";
  time.timeZone = "Europe/Warsaw";

  nixpkgs.overlays = [
    (self: super: {
      signage = self.callPackage ./signage.nix {};
    })
  ];

  # Enable sound.
  sound.enable = true;
  services.pipewire = {
    enable = true;
    alsa.enable = true;
    pulse.enable = true;
  };

  services.dbus.enable = true;

  programs.sway = {
    enable = true;
    wrapperFeatures.gtk = true;
    extraSessionCommands = ''
      export WLR_LIBINPUT_NO_DEVICES=1
      export WLR_NO_HARDWARE_CURSORS=1
    '';
  };
  hardware.raspberry-pi."4".fkms-3d.enable = true;
  hardware.raspberry-pi."4".poe-hat.enable = true;

  services.greetd = {
    enable = true;
    settings = rec {
      initial_session = let
         sway = builtins.elemAt config.services.xserver.displayManager.sessionPackages 0;
        in {
        command = "${sway}/bin/sway";
        user = "kiosk";
      };
      default_session = initial_session;
    };
  };


  users.users.root = {
    openssh.authorizedKeys.keys = [
      "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG599UildOrAq+LIOQjKqtGMwjgjIxozI1jtQQRKHtCP q3k@mimeomia"
      "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFhaCaC/CVYv6hphqmEdKaPrIn+Q946+myvL9SSnzFZk vuko@eagle"
      "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICTR292kx/2CNuWYIsZ6gykQ036aBGrmheIuZa6S1D2x implr@thonk"
      "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGfIRe1nH6vwjQTjqHNnkKAdr1VYqGEeQnqInmf3A6UN ar@khas"
      "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQb3YQoiYFZLKwvHYKbu1bMqzNeDCAszQhAe1+QI5SLDOotclyY/vFmOReZOsmyMFl71G2d7d+FbYNusUnNNjTxRYQ021tVc+RkMdLJaORRURmQfEFEKbai6QSFTwErXzuoIzyEPK0lbsQuGgqT9WaVnRzHJ2Q/4+qQbxAS34PuR5NqEkmn4G6LMo3OyJ5mwPkCj9lsqz4BcxRaMWFO3mNcwGDfSW+sqgc3E8N6LKrTpZq3ke7xacpQmcG5DU9VO+2QVPdltl9jWbs3gXjmF92YRNOuKPVfAOZBBsp8JOznfx8s9wDgs7RwPmDpjIAJEyoABqW5hlXfqRbTnfnMvuR informatic@InformaticPC"
      "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDVQI/uYdp3km0NBSK7s80VAw7k6zH2Y5hYg1fkPfTjN7/hPCvyuIvSYYNdb6APWevUcw5+1Mpv0YMc+GOFCsJEXnSAcppNhZTPM6ic6HeaIHEC5QBv6qMWbCNLf5M9ZqYdBHEIeCYg0VGJMzgkSor7sk3gEwnKgCMaJ0Bmqv++qtBOLKhCgUn3KTORAn2BAtkXEe8ASfkdWWPMoq20eshsV26h4N4C2bvAgm7ucFtziOtp7TpGY5L8snv7twAeriMkifLbF7J3vy+l6qYBb990HkRadAHAYtt0viPEjTzkFlTubxMPqrmFh4xK8HdKawAw8KFy0SYBqQnKU9oiZ5biyLJvFzaLn+YJL4BcM3A8DRvdeaHiD4PnEJh8bWHCBER5hhGYcNZhA+qBxPYXFjYEiAfsXxD1AYNVep6lpnPtK0vvcPKSxr5eLBM8ZoSofKtA0Xa+7ySuAnzWSdy9EspLNzA8TSFUhQcsZmsUE1cPeLoS2+8I9QFDwQbyPAwWKpfCkLaWd1cK4J1KPn6XzH8iARifX4F/oAEzmfYz5yXrGJQV6HhNAntKXt8dsZhME3kYVgHB/8Ls8PRwAe/9N92JR+DjdDvGKLoPf3BqOq4fq6JcrUT6FPRtGCz0bl4Cgnsb+UY1d2Ue2I7Wcpuqgv5HLY0beTE6CSEfDNmPad/EPw== cz3"
    ];
  };
  users.groups.kiosk = {};
  users.users.kiosk = {
    isNormalUser = true;
    group = "kiosk";
    extraGroups = [ "users" "lp" "dialout" "tty" ];
  };

  environment.systemPackages = with pkgs; [
    (let 
       config = pkgs.writeText "config.lua" ''
         return {
           displayTime = 2,
           transitionTime = 0.5,
           showProgress = true,
           nodes = {
             {'nodes.weather', displayTime = 10},
             {'nodes.newdash', displayTime = 10},
             {'nodes.misery', displayTime = 10},
           },
           environment = os.getenv('ENV') or 'prod',
           renderWidth = 1280,
           renderHeight = 720,
         }
       '';
    in pkgs.writeScriptBin "signage-wrapped" ''
      #!/usr/bin/env bash
      SIGNAGE_CONFIG=${config} ${signage}/bin/signage
    '')
    firefox foot wayvnc
    vim rxvt-unicode-unwrapped.terminfo

    alacritty 
    wayland glib dracula-theme gnome3.adwaita-icon-theme
    swaylock swayidle grim slurp wl-clipboard bemenu mako
  ];

  services.openssh.enable = true;

  system.stateVersion = "22.05"; # Did you read the comment?

}

