;; -*- lexical-binding: t; -*-
;; TURN ON IN INIT FILE!!!!!

;; Make gc pauses faster by decreasing the threshold.
(setq gc-cons-threshold (* 2 1000 1000))

;; disable warnings from popping up, they are still logged
(setq warning-suppress-types '((comp)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; helper functions
;; Figure out if inside Termux
(require 'subr-x)
(setq kmn/is-termux
      (string-suffix-p "Android" (string-trim (shell-command-to-string "uname -a"))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; os specific config
(when (eq system-type 'windows-nt)
    ; Fix resolution of ~ to match other client paths
    (setenv "HOME" "C:/Users/mcros/Nextcloud")
    (setq default-directory "C:/Users/mcros/Nextcloud")

    ; add executables to path ahead of them being used by extensions / emacs stuff
    (add-to-list 'exec-path "C:/Users/mcros/OneDrive/Programs/PortableApps/sqlite3")
    (add-to-list 'exec-path "C:/Users/mcros/OneDrive/Programs/PortableApps/MultiMarkdown-Windows-6.6.0/bin")
)
(when kmn/is-termux
    ; setup storage locations -- cheat so mobile/desktop look alike for file urls
    ;(setq user-init-file "/data/data/com.termux/files/home/storage/shared/.emacs")
    ;(setq user-emacs-directory "/data/data/com.termux/files/home/storage/shared/.emacs.d/")
    ;(setenv "HOME" "/data/data/com.termux/files/home/storage/shared/")
    ;(load user-init-file)

    ; Fix resolution of ~ to match other client paths
    (setenv "HOME" "/data/data/com.termux/files/home/")
    (setq default-directory "/data/data/com.termux/files/home/")

    ; Better fonts
    (setq org-src-fontify-natively t)
    
    ; Setup xdg-open as the default for opening files (except for the few we want emacs to open native)
    ; xdg-open is linked to termux-open by default ; if you need 'more' look into tmux-open and adjust accordingly
    ; (add-to-list 'org-file-apps '("\\.doc.*" . "open %s"))
    (setq browse-url-browser-function 'browse-url-xdg-open)
    (setq org-file-apps
        '(;; default
            (auto-mode . emacs)
            ("\\.org" . emacs)
            ("\\.txt" . emacs)
            (".*" . "xdg-open %s")))
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; global config
(load "~/.emacs.d.profiles/common/_global.el")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; compile bytecode for this profile
(unless (was-compiled-p "~/.emacs.d.profiles/code")
      (byte-recompile-directory "~/.emacs.d.profiles/code" 0))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; additional packages
(add-to-list 'package-selected-packages
             '(zoom auctex-latexmk auctex json-mode python-mode powershell rust-mode origami go-mode yaml-mode dockerfile-mode lua-mode)
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; misc config
(set-default 'truncate-lines t)
; highlight current line
(global-hl-line-mode +1)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; activate helm after its fully configured (may be configured beyond global defaults in other profiles so we have to activate locally)
(helm-mode 1)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; projectile
(projectile-mode +1)
(define-key projectile-mode-map (kbd "C-c j") 'projectile-command-map)
(setq projectile-mode-line-function '(lambda () (format " [%s]" (projectile-project-name))))
;(setq projectile-project-search-path '("~/../src/"))

(require 'helm-projectile)
(helm-projectile-on)
(diminish 'projectile-mode)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; programming
; code folding
(require 'origami)

; lua
(autoload 'lua-mode "lua-mode" "Lua editing mode." t)
(add-to-list 'auto-mode-alist '("\\.lua$" . lua-mode))
(add-to-list 'interpreter-mode-alist '("lua" . lua-mode))
(setq lua-indent-level 4)

; dockerfile
(autoload 'dockerfile-mode "dockerfile-mode" "Dockerfile editing mode." t)
(add-to-list 'auto-mode-alist '("Dockerfile\\'" . dockerfile-mode))

; yaml
(autoload 'yaml-mode "yaml-mode" "YAML editing mode." t)
(add-to-list 'auto-mode-alist '("\\.ya?ml\\'" . yaml-mode))

; go
(autoload 'go-mode "go-mode" "go editing mode." t)
(add-to-list 'auto-mode-alist '("\\.go\\'" . go-mode))

; rust
(autoload 'rust-mode "rust-mode" "rust editing mode" t)
(add-to-list 'auto-mode-alist '("\\.rs\\'" . rust-mode))

; c/cpp
(autoload 'cc-mode "cc-mode" "c/cpp editing mode" t)
(add-to-list 'auto-mode-alist '("\\.h\\'" . cc-mode))
(add-to-list 'auto-mode-alist '("\\.c\\'" . cc-mode))
(add-to-list 'auto-mode-alist '("\\.cpp\\'" . cc-mode))

; shell
(autoload 'sh-script "sh-script" "shell script editing mode" t)
(add-to-list 'auto-mode-alist '("\\.sh\\'" . sh-script))

; makefile
(autoload 'make-mode "make-mode" "makefile editing mode" t)
(add-to-list 'auto-mode-alist '("Makefile\\'" . make-mode))

; powershell
(autoload 'powershell "powershell" "powershell editing mode" t)
(add-to-list 'auto-mode-alist '("\\.ps1\\'" . powershell))

; [la]tex
(use-package tex
  :ensure auctex)
(setq TeX-parse-self t)
(setq-default TeX-master nil)

; python
(autoload 'python-mode "python-mode" "python editing mode" t)
(add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode))

; json
(autoload 'json-mode "json-mode" "json editing mode" t)
(add-to-list 'auto-mode-alist '("\\.json\\'" . json-mode))
