(in-package #:nyxt-user) ; While implicit, this allows SLY to know which package we are in.

(dolist (file (list (nyxt-init-file "slynk.lisp"))))

(load-after-system :slynk (nyxt-init-file "slynk.lisp"))
;; (defvar *chris-prompt-keymap (make-keymap "chris-prompt-map"))
;; (define-key *chris-prompt-keymap*
;;   "escape" 'cancel-input
;;   "C-j" 'select-next
;;   "C-k" 'select-previous)

;; (define-mode chris-prompt-mode ()
;;   "Dummy mode for the custom key bindings in `*chris-prompt-keymap*'."
;;   ((keymap-scheme (keymap:make-scheme
;;                    scheme:vi-insert *chris-prompt-keymap*))
;;    (visible-in-status-p nil)))

;; Always restore history and don't ask
(define-configuration browser
    ((session-restore-prompt :always-restore)))

(define-configuration (prompt-buffer)
    ((default-modes (append '(vi-insert-mode
                              ) %slot-default%))))

;; Create a function to launch mpv with given url
(defun mpv (url)
    "MPV launches with given url using the fast profile."
  (uiop:run-program (list "mpv" "--profile=fast" url)))

;; Create a function to download videos with youtube-dl in alacritty
(defun youtube-dl (url)
    "Download videos and audio with youtube-dl in alacritty for feedback"
  (uiop:run-program (list "alacritty" "-e" "youtube-dl" "-o ~/Videos/%(title)s.%(ext)s" url)))

;; Let's create a function to hint videos, convert the url to a sting, and play them in MPV
(define-command hint-mpv (&key nyxt/web-mode::annotate-visible-only-p)
    "Show a set of element hints, and copy the URL of the user inputted one."
  (nyxt/web-mode:query-hints "Copy element URL"
                             (lambda (nyxt/web-mode::result)
                              ;; this converts the url to a string to be used in mpv
                               (let* ((url (format nil "~a"
                                                   (url (first nyxt/web-mode::result)))))
                             ;; here we take that string and pipe it into mpv
                                     (mpv url)))
                             :annotate-visible-only-p
                             nyxt/web-mode::annotate-visible-only-p))

;; Let's create a function to hint videos, convert the url to a sting, and download with ytdl
(define-command hint-ytdl (&key nyxt/web-mode::annotate-visible-only-p)
    "Show a set of element hints, and copy the URL of the user inputted one."
  (nyxt/web-mode:query-hints "Copy element URL"
                             (lambda (nyxt/web-mode::result)
                              ;; this converts the url to a string to be used in mpv
                               (let* ((url (format nil "~a"
                                                   (url (first nyxt/web-mode::result)))))
                             ;; here we take that string and pipe it into mpv
                                     (youtube-dl url)))
                             :annotate-visible-only-p
                             nyxt/web-mode::annotate-visible-only-p))

;; These are my own keys that are layered over vi-normal. A lot of these
;; are similar to qutebrowser.
(defvar *chris-keymap* (make-keymap "chris-map"))
(define-key *chris-keymap*
  "K" 'switch-buffer-next
  "J" 'switch-buffer-previous
  "b" 'switch-buffer
  "v" 'hint-mpv
  "C-v v" 'hint-ytdl
  "d" 'delete-current-buffer
  "D" 'delete-buffer
  "r" 'reload-current-buffer
  "R" 'reload-buffers)

(define-mode chris-mode ()
  "Dummy mode for the custom key bindings in `*chris-keymap*'."
  ((keymap-scheme (keymap:make-scheme
                   scheme:vi-normal *chris-keymap*))
   (visible-in-status-p nil)))

(define-configuration buffer
  ((default-modes (append '(vi-normal-mode
                            auto-mode
                            reduce-tracking-mode
                            force-https-mode
                            chris-mode)
                   %slot-default%))))

(define-configuration buffer
    ((search-engines
      (list
      (make-instance 'search-engine
                      :shortcut "s"
                      :search-url "https://search.tfcconnection.org/?q=~a"
                      :fallback-url "https://search.tfcconnection.org")))))

(define-configuration status-buffer
  ((style
    (str:concat
     %slot-default%
     (cl-css:css
      '((body
         :background "#282a36"
         :color "#e2e4e5"
         :line-height "1fr")
        ("#container"
         :grid-template-columns "0px 4fr 0px 2fr 0px 0px")
        ("#controls"
         :background-color "#282a36"
         :color "#f3f99d"
         :width "0px"
         :padding-left "0px"
         :hidden)
        ("#url"
         :background-color "#282a36"
         :color "#5af78e")
        ("#modes"
         :background-color "#282a36"
         :color "#f3f99d")
        ("#tabs"
         :background-color "#282a36"
         :color "#5af78e")
        (".tab"
         :background-color "#282a36"
         :color "#9aedfe")
        (".tab:hover"
         :background-color "#282a36"
         :color "#f1f1f0")
        (".button"
         :background-color "#282a36"
         :color "#5af78e")
        (".button:hover"
         :background-color "#282a36"
         :color "#f1f1f0")
        (".arrow"
         :width "0px"
         :height "0px")
        (".arrow-right"
         :background-color "#282a36"
         :color "#5af78e")
        (".arrow-left"
         :background-color "#282a36"
         :color "#5af78e")
        ))))))

(define-configuration internal-buffer
  ((style
    (str:concat
     %slot-default%
     (cl-css:css
      '((body
         :background "#282a36"
         :color "#e2e4e5")
        (.button
         :color "#e2e4e5")))))))

(define-configuration window
  ((message-buffer-style
    (str:concat
     %slot-default%
     (cl-css:css
      '((body
         :background-color "#282a36"
         :color "#e2e4e5")))))))

(define-configuration prompt-buffer
  ((style
    (str:concat
     %slot-default%
     (cl-css:css
      '((body
         :background-color "#282a36"
         :color "#e2e4e5")
        ("#prompt-area"
         :background-color "#282a36"
         :color "#57c7ff")
        ("#prompt"
         :background-color "#282a36"
         :color "#e2e4e5")
        ("#input"
         :background-color "#282a36"
         :color "#e2e4e5")
        ("#suggestions"
         :background-color "#282a36"
         :color "#e2e4e5")
        (.source
         :margin-left "5px")
        (.source-name
         :background-color "#282a36"
         :color "#e2e4e5")
        (.source-content
         :background-color "#282a36"
         :color "#e2e4e5")
        ;; (".source-content td"
        ;;  :background-color "#282a36"
        ;;  :color "#e2e4e5")
        (".source-content th"
         :background-color "#43454f"
         :color "#e2e4e5")
        ("#selection"
         :background-color "#57c7ff"
         :color "#34353e")
        (.marked
         :background-color "#5af78e"
         :color "#34353e")
        (.selected
         :background-color "#57c7ff"
         :color "#34353e")
        (.button
         :color "#e2e4e5")))))))