local actions = require "fzf-lua.actions"
local remap   = vim.keymap.set
local opts    = { noremap=true, unique=true, silent=true }

require'fzf-lua'.setup {
  fzf_bin       = "fzf-tmux",
  fzf_tmux_opts = { ["-p"] = "90%,90%" },
  winopts = {
    height     = 0.90,
    width      = 0.90,
    row        = 0.35,
    col        = 0.50,
    border     = { '╭', '─', '╮', '│', '╯', '─', '╰', '│' },
    fullscreen = false,
    preview = {
      default      = 'bat'      ,
      border       = 'border'   ,
      wrap         = 'wrap'     ,
      hidden       = 'nohidden' ,
      vertical     = 'down:45%' ,
      horizontal   = 'right:60%',
      layout       = 'flex'     ,
      flip_columns = 120        ,
      title        = false      ,
      scrollbar    = false      ,
      scrolloff    = '-2'       ,
      scrollchars  = {'█', '' } ,
      delay        = 100        ,
      winopts = {
        number         = true    ,
        relativenumber = false   ,
        cursorline     = true    ,
        cursorlineopt  = 'both'  ,
        cursorcolumn   = false   ,
        signcolumn     = 'no'    ,
        list           = false   ,
        foldenable     = false   ,
        foldmethod     = 'manual',
      },
    },
  },
  keymap = {
    fzf = {
      ["Ctrl-d"]  = "half-page-down"   ,
      ["Ctrl-u"]  = "half-page-up"     ,
      ["Ctrl-a"]  = "beginning-of-line",
      ["Ctrl-e"]  = "end-of-line"      ,
      ["Ctrl-n"]  = "preview-down"     ,
      ["Ctrl-p"]  = "preview-up"       ,
      ["Ctrl-f"]  = "preview-page-down",
      ["Ctrl-b"]  = "preview-page-up"  ,
      ["Ctrl-z"]  = "abort"            ,
      ["Ctrl-t"]  = "toggle-all"       ,
    },
  },
  actions = {
    files = {
      ["default"] = actions.file_edit_or_qf,
      ["Ctrl-s"]  = actions.file_split     ,
      ["Ctrl-v"]  = actions.file_vsplit    ,
      ["Ctrl-t"]  = actions.file_tabedit   ,
      ["Ctrl-q"]  = actions.file_sel_to_qf ,
    },
    buffers = {
      ["default"] = actions.buf_edit   ,
      ["Ctrl-s"]  = actions.buf_split  ,
      ["Ctrl-v"]  = actions.buf_vsplit ,
      ["Ctrl-t"]  = actions.buf_tabedit,
    }
  },
  fzf_opts = {
    ['--ansi']         = ''       ,
    ['--prompt']       = '> '     ,
    ['--info']         = 'inline' ,
    ['--height']       = '100%'   ,
    ['--layout']       = 'reverse',
    ["--border"]       = "rounded",
    ["--no-separator"] = ""       ,
  },
  previewers = {
    bat = {
      theme = 'Monokai Extended Bright',
    },
  },
  files = {
    multiprocess = true ,
    git_icons    = false,
    file_icons   = false,
    color_icons  = false,
  },
  git = {
    files = {
      prompt       = 'GitFiles❯ ',
      cmd          = 'git ls-files --exclude-standard',
      multiprocess = true ,
      git_icons    = false,
      file_icons   = false,
      color_icons  = false,
    },
    status = {
      prompt      = 'GitStatus❯ ',
      cmd         = "git status -s",
      previewer   = "git_diff",
      file_icons  = false,
      git_icons   = false,
      color_icons = false,
      actions = {
        ["right"] = { actions.git_unstage, actions.resume },
        ["left"]  = { actions.git_stage, actions.resume   },
      },
    },
    commits  = {
      prompt  = 'Commits❯ ',
      cmd     = "git log --decorate --pretty=oneline --abbrev-commit --color",
      preview = "git show --color=always {1}",
      actions = {
        ["default"] = actions.git_buf_split  ,
        ["Ctrl-s"]  = actions.git_buf_split  ,
        ["Ctrl-v"]  = actions.git_buf_vsplit ,
        ["Ctrl-t"]  = actions.git_buf_tabedit,
      },
    },
    bcommits = {
      prompt  = 'BCommits❯ ',
      cmd     = "git log --decorate --pretty=oneline --abbrev-commit --color",
      preview = "git show --color=always {1}",
      actions = {
        ["default"] = actions.git_buf_split  ,
        ["Ctrl-s"]  = actions.git_buf_split  ,
        ["Ctrl-v"]  = actions.git_buf_vsplit ,
        ["Ctrl-t"]  = actions.git_buf_tabedit,
      },
    },
    branches = {
      prompt  = 'Branches❯ ',
      cmd     = "git branch --all --color",
      preview = "git log --decorate --graph --pretty=oneline --abbrev-commit --color {1}",
      actions = {
        ["default"] = actions.git_switch,
      },
    },
    stash = {
      prompt  = 'Stash> ',
      cmd     = "git --no-pager stash list",
      preview = "git --no-pager stash show --patch --color {1}",
      actions = {
        ["default"] = actions.git_stash_apply,
        ["ctrl-x"]  = { actions.git_stash_drop, actions.resume },
      },
    },
  },
  grep = {
    prompt         = 'Rg❯ '      ,
    input_prompt   = 'Grep For❯ ',
    multiprocess   = true        ,
    git_icons      = false       ,
    file_icons     = false       ,
    color_icons    = false       ,
    rg_glob        = true        ,
  },
  args = {
    prompt     = 'Args❯ ',
    files_only = true    ,
    actions    = { ["Ctrl-x"] = actions.arg_del }
  },
  oldfiles = {
    prompt   = 'History❯ ',
    cwd_only = false      ,
  },
  buffers = {
    prompt        = 'Buffers❯ ',
    file_icons    = false      ,
    color_icons   = false      ,
    sort_lastused = true       ,
    actions = {
      ["Ctrl-x"] = { actions.buf_del, actions.resume },
    }
  },
  tabs = {
    prompt      = 'Tabs❯ ',
    tab_title   = "Tab"   ,
    tab_marker  = "<<"    ,
    file_icons  = false   ,
    color_icons = false   ,
    actions = {
      ["default"] = actions.buf_switch,
      ["Ctrl-x"]  = { actions.buf_del, actions.resume },
    },
  },
  lines = {
    previewer       = "builtin",
    prompt          = 'Lines❯ ',
    show_unlisted   = false    ,
    no_term_buffers = true     ,
  },
  blines = {
    previewer       = "builtin" ,
    prompt          = 'BLines❯ ',
    show_unlisted   = false     ,
    no_term_buffers = true      ,
  },
  quickfix = {
    file_icons = false,
    git_icons  = false,
  },
  lsp = {
    prompt_postfix   = 'Lsp❯ ',
    cwd_only         = false  ,
    async_or_timeout = 5000   ,
    file_icons       = false  ,
    git_icons        = false  ,
  },
  diagnostics ={
    prompt       = 'Diagnostics❯ ',
    cwd_only     = false          ,
    file_icons   = false          ,
    git_icons    = false          ,
    diag_icons   = false          ,
    icon_padding = ''             ,
  },
  manpages = { previewer = { _ctor = false } },
}

-- Buffers and Files
remap('n', '<Leader>b' , ':FzfLua buffers<CR>'                   , opts)
remap('n', '<Leader>B' , ':FzfLua oldfiles<CR>'                  , opts)
remap('n', '<Leader>fF', ':FzfLua files<CR>'                     , opts)
remap('n', '<Leader>fl', ':FzfLua blines<CR>'                    , opts)
remap('n', '<Leader>fL', ':FzfLua lines<CR>'                     , opts)
remap('n', '<Leader>fq', ':cclose<CR>:FzfLua quickfix<CR>'       , opts)
remap('n', '<Leader>fQ', ':lclose<CR>:FzfLua loclist<CR>'        , opts)

-- Git
remap('n', '<Leader>ff', ':FzfLua git_files<CR>'                 , opts)
remap('n', '<Leader>/' , ':FzfLua git_status<CR>'                , opts)
remap('n', '<Leader>fb', ':FzfLua git_branches<CR>'              , opts)
remap('n', '<Leader>fc', ':FzfLua git_bcommits<CR>'              , opts)
remap('x', '<Leader>fc', '<cmd>FzfLua git_bcommits<CR>'          , opts)
remap('n', '<Leader>fC', ':FzfLua git_commits<CR>'               , opts)
remap('n', '<Leader>ft', ':FzfLua git_stash<CR>'                 , opts)

-- Grep
remap('n', '<Leader>fg' , ':FzfLua grep<CR>'                     , opts)
remap('n', '<Leader>f/' , ':FzfLua live_grep<CR>'                , opts)
remap('n', '<Leader>f\\', ':FzfLua live_grep_resume<CR>'         , opts)
remap('n', '<Leader>fs' , ':FzfLua grep_cword<CR>'               , opts)
remap('n', '<Leader>fS' , ':FzfLua grep_cWORD<CR>'               , opts)
remap('x', '<Leader>fs' , ':<C-u>FzfLua grep_visual<CR>'         , opts)
remap('n', '<Leader>fr' , ':FzfLua grep_last<CR>'                , opts)
remap('n', '<Leader>fR' , ':FzfLua live_grep_glob<CR>'           , opts)

-- Misc
remap('n', '<Leader>fh', ':FzfLua command_history<CR>'           , opts)
remap('n', '<Leader>fH', ':FzfLua search_history<CR>'            , opts)
remap('n', '<Leader>fm', ':FzfLua marks<CR>'                     , opts)
remap('n', '<Leader>fM', ':FzfLua man_pages<CR>'                 , opts)
remap('n', '<Leader>fo', ':FzfLua changes<CR>'                   , opts)
remap('n', '<Leader>fO', ':FzfLua jumps<CR>'                     , opts)
remap('n', '<Leader>fk', ':FzfLua keymaps<CR>'                   , opts)

-- LSP
remap('n', '<Leader>lr', ':FzfLua lsp_references<CR>'            , opts)
remap('n', '<Leader>ld', ':FzfLua lsp_definitions<CR>'           , opts)
remap('n', '<Leader>lD', ':FzfLua lsp_declarations<CR>'          , opts)
remap('n', '<Leader>lt', ':FzfLua lsp_typedefs<CR>'              , opts)
remap('n', '<Leader>li', ':FzfLua lsp_implementations<CR>'       , opts)
remap('n', '<Leader>ls', ':FzfLua lsp_document_symbols<CR>'      , opts)
remap('n', '<Leader>lw', ':FzfLua lsp_workspace_symbols<CR>'     , opts)
remap('n', '<Leader>lW', ':FzfLua lsp_live_workspace_symbols<CR>', opts)
remap('n', '<Leader>la', ':FzfLua lsp_code_actions<CR>'          , opts)
remap('n', '<Leader>le', ':FzfLua lsp_document_diagnostics<CR>'  , opts)
remap('n', '<Leader>lE', ':FzfLua lsp_workspace_diagnostics<CR>' , opts)
