local helpers = require('personal.luasnip-helper-funcs')
local get_visual = helpers.get_visual

local line_begin = require("luasnip.extras.expand_conditions").line_begin

return
  {
    -- main function
    s({trig = "mm", snippetType="autosnippet"},
      fmta(
        [[
          public static void main(String[] args) {
              <>
          }
        ]],
        { i(0) }
      ),
      {condition = line_begin}
    ),
    -- CURLY BRACES
    s({trig = "fds", snippetType="autosnippet", priority=1000},
      fmta(
        [[
        {
            <>
        }
        ]],
        { d(1, get_visual) }
      )
    ),
    -- class
    s({trig = "pcc", snippetType="autosnippet"},
      fmta(
        [[
          public class <>
          {
              <>
          }
        ]],
        { i(1), i(0) }
      ),
      {condition = line_begin}
    ),
    -- constructor
    s({trig = "puu", snippetType="autosnippet"},
      fmta(
        [[
          public <>(<>) {
              <>
          }
        ]],
        { i(1), i(2), i(3) }
      ),
      {condition = line_begin}
    ),
    -- New object
    s({trig = "nn", snippetType="autosnippet"},
      fmta(
        [[
          <> <> = new <>(<>);
        ]],
        { i(1), i(2), rep(1), i(3) }
      ),
      {condition = line_begin}
    ),
    -- public function
    s({trig = "pff", snippetType="autosnippet"},
      fmta(
        [[
          public <> <>(<>) {
              <>
          }
        ]],
        { i(1), i(2), i(3), i(4) }
      ),
      {condition = line_begin}
    ),
    -- public static function
    s({trig = "psf", snippetType="autosnippet"},
      fmta(
        [[
          public static <> <>(<>) {
              <>
          }
        ]],
        { i(1), i(2), i(3), i(4) }
      ),
      {condition = line_begin}
    ),
    -- private function
    s({trig = "pvv", snippetType="autosnippet"},
      fmta(
        [[
          private <> <>(<>) {
              <>
          }
        ]],
        { i(1), i(2), i(3), i(4) }
      ),
      {condition = line_begin}
    ),
    -- if statement
    s({trig = "iff", snippetType="autosnippet"},
      fmta(
        [[
          if (<>) <>
        ]],
        { 
          i(1),
          c(2, {sn(nil, {t("{"), t({"", "    "}), i(1, ""), t({"", "}"})}), t("")}),
        }
      ),
      {condition = line_begin}
    ),
    -- for loop with int i counter and optional statement braces
    s({trig = "fii", snippetType="autosnippet"},
      fmta(
        [[
          for (int i = 0; i <>; i++) <>
        ]],
        { 
          i(1),
          c(2, {sn(nil, {t("{"), t({"", "    "}), i(1, ""), t({"", "}"})}), t("")}),
        }
      ),
      {condition = line_begin}
    ),
    -- for loop with int j counter and optional statement braces
    s({trig = "fjj", snippetType="autosnippet"},
      fmta(
        [[
          for (int j = 0; j <>; j++) <>
        ]],
        { 
          i(1),
          c(2, {sn(nil, {t("{"), t({"", "    "}), i(1, ""), t({"", "}"})}), t("")}),
        }
      ),
      {condition = line_begin}
    ),
    -- for loop with blank arguments
    s({trig = "frr", snippetType="autosnippet"},
      fmta(
        [[
          for (<>) <>
        ]],
        { 
          i(1),
          c(2, {sn(nil, {t("{"), t({"", "    "}), i(1, ""), t({"", "}"})}), t("")}),
        }
      ),
      {condition = line_begin}
    ),
    -- while loop
    s({trig = "wll", snippetType="autosnippet"},
      fmta(
        [[
          while (<>) <>
        ]],
        { 
          i(1),
          c(2, {sn(nil, {t("{"), t({"", "    "}), i(1, ""), t({"", "}"})}), t("")}),
        }
      ),
      {condition = line_begin}
    ),
    -- block comment
    s({trig = "cc", snippetType="autosnippet"},
      fmta(
        [[
          /**
          * <>
          */
        ]],
        { i(1) }
      ),
      {condition = line_begin}
    ),
    -- println using algs4 StdOut
    s({trig = "pp", snippetType="autosnippet"},
      fmta(
        [[
          StdOut.println(<>);
        ]],
        { d(1, get_visual) }
      ),
      {condition = line_begin}
    ),
    -- Integer.parseInt()
    s({trig = "ipi", snippetType="autosnippet"},
      fmta(
        [[
          Integer.parseInt(<>)
        ]],
        { d(1, get_visual) }
      )
    ),
    -- Double.parseDouble()
    s({trig = "dpd", snippetType="autosnippet"},
      fmta(
        [[
          Double.parseDouble(<>)
        ]],
        { d(1, get_visual) }
      )
    ),
    -- Import from algs4
    s({trig = ";ii", snippetType="autosnippet"},
      fmta(
        [[
          import edu.princeton.cs.algs4.<>;
        ]],
        { i(1) }
      ),
      {condition = line_begin}
    ),
    -- Import StdIn from algs4
    s({trig = ";in", snippetType="autosnippet"},
      {t("import edu.princeton.cs.algs4.StdIn;")},
      {condition = line_begin}
    ),
    -- Import StdOut from algs4
    s({trig = ";io", snippetType="autosnippet"},
      {t("import edu.princeton.cs.algs4.StdOut;")},
      {condition = line_begin}
    ),
    -- array length
    s({trig = ";l", wordTrig=false, snippetType="autosnippet"},
      fmta(
        [[
          .length
        ]],
        {}
      )
    ),
  }
