{ stdenv, buildGoPackage, fetchFromGitHub, pkgconfig, alsaLib,
  coreutils, dbus-factory, dde-api, dde-daemon, dde-dock,
  dde-file-manager, dde-polkit-agent, dde-session-ui, deepin,
  deepin-desktop-base, deepin-desktop-schemas, deepin-turbo,
  dde-kwin, glib, gnome3, go, go-dbus-factory, go-gir-generator,
  go-lib, gtk3, jq, kmod, libX11, libXi, libcgroup, pciutils, psmisc,
  pulseaudio, systemd, xorg, wrapGAppsHook }:

buildGoPackage rec {
  name = "${pname}-${version}";
  pname = "startdde";
  version = "5.0.1";

  goPackagePath = "pkg.deepin.io/dde/startdde";

  src = fetchFromGitHub {
    owner = "linuxdeepin";
    repo = pname;
    rev = version;
    sha256 = "1xydmglydksy7hjlavf5pbfy0s0lndgavh8x3kg2mg7d36mbra43";
  };

  goDeps = ./deps.nix;

  outputs = [ "out" ];

  nativeBuildInputs = [
    pkgconfig
    dbus-factory
    jq
    wrapGAppsHook
    deepin.setupHook
  ];

  buildInputs = [
    dde-api
    go-dbus-factory
    go-gir-generator
    go-lib
    alsaLib
    dde-daemon
    dde-dock
    dde-file-manager
    dde-kwin
    dde-polkit-agent
    dde-session-ui
    deepin-desktop-schemas
    deepin-turbo
    glib
    gnome3.dconf
    gnome3.gnome-keyring
    gnome3.libgnome-keyring
    gtk3
    kmod
    libX11
    libXi
    libcgroup
    pciutils
    psmisc
    pulseaudio
    systemd
    xorg.xdriinfo
  ];

  postPatch = ''
    searchHardCodedPaths  # debugging

    # Commented lines below indicates a doubt about how to fix the hard coded path

     fixPath $out                    /etc/X11                                  Makefile
    #fixPath ?                       /etc/xdg/autostop                         autostop/autostop.go
     fixPath ${coreutils}            /bin/ls                                   copyfile_test.go
     fixPath $out                    /usr/share/startdde/auto_launch.json      launch_group.go
    #fixPath ?                       /usr/bin/kwin_no_scale                    main.go  # not found on deepin linux and archlinux
     fixPath $out                    /usr/share/startdde/memchecker.json       memchecker/config.go
     fixPath $out                    /usr/bin/startdde                         misc/00deepin-dde-env
     fixPath ${dde-file-manager}     /usr/bin/dde-file-manager                 misc/auto_launch/chinese.json
     fixPath ${deepin-turbo}         /usr/lib/deepin-turbo/booster-dtkwidget   misc/auto_launch/chinese.json
     fixPath ${dde-daemon}           /usr/lib/deepin-daemon/dde-session-daemon misc/auto_launch/chinese.json misc/auto_launch/default.json
     fixPath ${dde-dock}             /usr/bin/dde-dock                         misc/auto_launch/chinese.json misc/auto_launch/default.json
     fixPath ${dde-file-manager}     /usr/bin/dde-desktop                      misc/auto_launch/chinese.json misc/auto_launch/default.json
     fixPath $out                    /usr/bin/startdde                         misc/deepin-session
    #fixPath ?                       /usr/lib/lightdm/config-error-dialog.sh   misc/deepin-session  # provided by lightdm on deepin linux
    #fixPath ?                       /usr/sbin/lightdm-session                 misc/deepin-session  # provided by lightdm on deepin linux
     fixPath ${dde-session-ui}       /usr/bin/dde-lock                         session.go
     fixPath ${dde-session-ui}       /usr/bin/dde-shutdown                     session.go
     fixPath ${dde-session-ui}       /usr/lib/deepin-daemon/dde-osd            session.go
     fixPath ${deepin-desktop-base}  /etc/deepin-version                       session.go
     fixPath ${gnome3.gnome-keyring} /usr/bin/gnome-keyring-daemon             session.go
     fixPath ${pulseaudio}           /usr/bin/pulseaudio                       sound_effect.go
    #fixPath ?                       /usr/lib/UIAppSched.hooks                 startmanager.go  # not found anything about this
     fixPath ${dde-session-ui}       /usr/lib/deepin-daemon/dde-welcome        utils.go
     fixPath ${dde-polkit-agent}     /usr/lib/polkit-1-dde/dde-polkit-agent    watchdog/dde_polkit_agent.go
    #fixPath ?                       /var/log/Xorg.0.log                       wm/driver.go
    #fixPath ?                       /etc/deepin-wm-switcher/config.json       wm/switcher_config.go  # not present on nixos, deepin linux and archlinux

    substituteInPlace wm/driver.go      --replace '/sbin/lsmod'                   "${kmod}/bin/lsmod"

    substituteInPlace session.go        --replace 'LookPath("cgexec"'             'LookPath("${libcgroup}/bin/cgexec"'
    substituteInPlace vm.go             --replace 'Command("dde-wm-chooser"'      'Command("${dde-session-ui}/bin/dde-wm-chooser"'
    substituteInPlace vm.go             --replace 'Command("systemd-detect-virt"' 'Command("${systemd}/bin/systemd-detect-virt"'
    substituteInPlace wm/card_info.go   --replace 'Command("lspci"'               'Command("${pciutils}/bin/lspci"'
    substituteInPlace wm/driver.go      --replace 'Command("lspci"'               'Command("${pciutils}/bin/lspci"'
    substituteInPlace wm/driver.go      --replace 'Command("xdriinfo"'            'Command("${xorg.xdriinfo}/bin/xdriinfo"'
    substituteInPlace wm/platform.go    --replace 'Command("gsettings"'           'Command("${glib}/bin/gsettings"'
    substituteInPlace wm/platform.go    --replace 'Command("uname"'               'Command("${coreutils}/bin/uname"'
    substituteInPlace wm/switcher.go    --replace 'Command("killall"'             'Command("${psmisc}/bin/killall"'
  '';

  buildPhase = ''
    make -C go/src/${goPackagePath}
  '';

  installPhase = ''
    make install PREFIX="$out" -C go/src/${goPackagePath}
    rm -rf $out/share/lightdm  # this is uselesss for NixOS
    remove-references-to -t ${go} $out/bin/* $out/sbin/*
  '';

  postFixup = ''
    searchHardCodedPaths $out  # debugging
  '';

  passthru = {
    updateScript = deepin.updateScript { inherit name; };
    providedSessions = [ "deepin" ];
  };

  meta = with stdenv.lib; {
    description = "Starter of deepin desktop environment";
    homepage = "https://github.com/linuxdeepin/startdde";
    license = licenses.gpl3;
    platforms = platforms.linux;
    maintainers = with maintainers; [ romildo ];
  };
}
