local function stain_formspec(pos)
   local meta = minetest.get_meta(pos)
   local chitin_level = tonumber(meta:get_string('chitin_level'))
   local grounds_level = tonumber(meta:get_string('grounds_level'))
   local water_level = tonumber(meta:get_string('water_level'))
   local formspec =
   'size[8,8.5]'..
   'list[current_name;chitin;.5,0;1,1;]'..
   'label[1.5,0.25;Input chitin]'..
   'list[current_name;grounds;.5,1;1,1;]'..
   'label[1.5,1.25;Input coffee grounds]'..
   'list[current_name;water;.5,2;1,1;]'..
   'label[1.5,2.25;Input water]'..
   'list[current_name;brush;.5,3;1,1;]'..
   'label[1.5,3.25;Input brush]'..
   'list[current_name;output;4.5,3;1,1;]'..
   'image[3,.25;3,.5;stations_stain_bg.png^[lowpart:'..(chitin_level*5)..':stations_stain_fg.png^[transformR270]'..
   'image[3,1.25;3,.5;stations_stain_bg.png^[lowpart:'..(grounds_level*5)..':stations_stain_fg.png^[transformR270]'..
   'image[3,2.25;3,.5;stations_stain_bg.png^[lowpart:'..(water_level*5)..':stations_stain_fg.png^[transformR270]'..
   'item_image_button[6,0;1,1;furniture:stain_brush1;brush1; ]'..
   'item_image_button[6,1;1,1;furniture:stain_brush2;brush2; ]'..
   'item_image_button[6,2;1,1;furniture:stain_brush3;brush3; ]'..
   'item_image_button[7,0;1,1;furniture:stain_brush4;brush4; ]'..
   'item_image_button[7,1;1,1;furniture:stain_brush5;brush5; ]'..
   'item_image_button[7,2;1,1;furniture:stain_brush6;brush6; ]'..
   'item_image_button[7,3;1,1;furniture:stain_brush7;brush7; ]'..
   'list[current_player;main;0,4.5;8,4;]'..
   'listring[context;output]'..
   'listring[current_player;main]'
   return formspec
end

minetest.register_node('stations:stain', {
   description = 'Stain Station',
   drawtype = 'mesh',
   mesh = 'stations_stain.obj',
   tiles = {'stations_stain.png'},
   use_texture_alpha = 'opaque',
   sounds = default.node_sound_wood_defaults(),
   paramtype2 = 'facedir',
   paramtype = 'light',
   selection_box = {
      type = 'fixed',
      fixed = {-.5, -.5, -.5, .5, .5, .5}},
   collision_box = {
      type = 'fixed',
      fixed = {-.5, -.5, -.5, .5, .5, .5}},
   groups = {oddly_breakable_by_hand = 1, choppy=3},
   on_construct = function(pos)
      local meta = minetest.get_meta(pos)
      local inv = meta:get_inventory()
      inv:set_size('main', 8*4)
      inv:set_size('chitin', 1)
      inv:set_size('grounds', 1)
      inv:set_size('water', 1)
      inv:set_size('brush', 1)
      inv:set_size('output', 1)
      meta:set_string('chitin_level', 0)
      meta:set_string('grounds_level', 0)
      meta:set_string('water_level', 0)
      meta:set_string('infotext', 'Stain Station')
      meta:set_string('formspec', stain_formspec(pos))
   end,
   can_dig = function(pos,player)
      local meta = minetest.get_meta(pos);
      local inv = meta:get_inventory()
      if inv:is_empty('chitin') and inv:is_empty('grounds') and inv:is_empty('water')
      and inv:is_empty('brush') and inv:is_empty('output') then
         return true
      else
         return false
      end
   end,
   allow_metadata_inventory_put = function(pos, listname, index, stack, player)
      local input = stack:get_name()
      if listname == 'chitin' then
         if input == 'stations:chitin' then
            return 1
         else
            return 0
         end
      elseif listname == 'grounds' then
         if input == 'stations:coffee_grounds' then
            return 1
         else
            return 0
         end
      elseif listname == 'water' then
         if input == 'bucket:bucket_river_water' or input == 'bucket:bucket_water'
         or input == 'earthbuild:clay_pot_river_water' or input == 'earthbuild:clay_pot_water' then
            return 1
         else
            return 0
         end
      elseif listname == 'brush' then
         if minetest.get_item_group(input, 'stain_brush') > 0 then
            return 99
         else
            return 0
         end
      elseif listname == 'output' then
         return 0
      end
   end,
   on_metadata_inventory_put = function(pos, listname, index, stack, player)
      local meta = minetest.get_meta(pos)
      local input = stack:get_name()
      local inv = meta:get_inventory()
      local chitin_level = tonumber(meta:get_string('chitin_level'))
      local grounds_level = tonumber(meta:get_string('grounds_level'))
      local water_level = tonumber(meta:get_string('water_level'))
      if listname == 'grounds' then
         if grounds_level + 2 <= 20 then
            meta:set_string('grounds_level', grounds_level+2)
            inv:set_stack('grounds', 1, '')
         end
      elseif listname == 'water' then
         if water_level + 10 <= 20 then
            meta:set_string('water_level', water_level+10)
            local vessel = string.sub(input, 1,3)
            if vessel == 'ear' then
               inv:set_stack('water', 1, 'earthbuild:clay_pot')
            elseif vessel == 'buc' then
               inv:set_stack('water', 1, 'bucket:bucket_empty')
            end
         end
      elseif listname == 'chitin' then
         if chitin_level + 2 <= 20 then
            meta:set_string('chitin_level', chitin_level+2)
            inv:set_stack('chitin', 1, '')
         end
      end
      meta:set_string('formspec', stain_formspec(pos))
   end,
   on_receive_fields = function(pos, formname, fields, sender)
      local meta = minetest.get_meta(pos)
      local inv = meta:get_inventory(pos)
      local chitin_level = tonumber(meta:get_string('chitin_level'))
      local grounds_level = tonumber(meta:get_string('grounds_level'))
      local water_level = tonumber(meta:get_string('water_level'))
      local brush = inv:get_stack('brush', 1)
      local brush_count = brush:get_count()
      local make_okay = false
      if chitin_level >= 1 and water_level >= 1 and brush_count >= 1 then
         if fields['brush1'] then
            if grounds_level >= 1 then
               inv:set_stack('output', 1, 'furniture:stain_brush1')
               meta:set_string('grounds_level', grounds_level-1)
               make_okay = true
            end
         elseif fields['brush2'] then
            if grounds_level >= 2 then
               inv:set_stack('output', 1, 'furniture:stain_brush2')
               meta:set_string('grounds_level', grounds_level-2)
               make_okay = true
            end
         elseif fields['brush3'] then
            if grounds_level >= 3 then
               inv:set_stack('output', 1, 'furniture:stain_brush3')
               meta:set_string('grounds_level', grounds_level-3)
               make_okay = true
            end
         elseif fields['brush4'] then
            if grounds_level >= 4 then
               inv:set_stack('output', 1, 'furniture:stain_brush4')
               meta:set_string('grounds_level', grounds_level-4)
               make_okay = true
            end
         elseif fields['brush5'] then
            if grounds_level >= 5 then
               inv:set_stack('output', 1, 'furniture:stain_brush5')
               meta:set_string('grounds_level', grounds_level-5)
               make_okay = true
            end
         elseif fields['brush6'] then
            if grounds_level >= 6 then
               inv:set_stack('output', 1, 'furniture:stain_brush6')
               meta:set_string('grounds_level', grounds_level-6)
               make_okay = true
            end
         elseif fields['brush7'] then
            if grounds_level >= 7 then
               inv:set_stack('output', 1, 'furniture:stain_brush7')
               meta:set_string('grounds_level', grounds_level-7)
               make_okay = true
            end
         end
         if make_okay == true then
            meta:set_string('chitin_level', chitin_level-1)
            meta:set_string('water_level', water_level-1)
            brush:take_item()
            inv:set_stack('brush',1,brush)
            meta:set_string('formspec', stain_formspec(pos))
         end
      end
   end,
})

minetest.register_node('stations:stain_locked', {
   description = 'Stain Station (locked)',
   drawtype = 'mesh',
   mesh = 'stations_stain.obj',
   tiles = {'stations_stain.png'},
   use_texture_alpha = 'opaque',
   sounds = default.node_sound_wood_defaults(),
   paramtype2 = 'facedir',
   paramtype = 'light',
   selection_box = {
      type = 'fixed',
      fixed = {-.5, -.5, -.5, .5, .5, .5}},
   collision_box = {
      type = 'fixed',
      fixed = {-.5, -.5, -.5, .5, .5, .5}},
   groups = {oddly_breakable_by_hand = 1, choppy=3},
   on_construct = function(pos)
      local meta = minetest.get_meta(pos)
      local inv = meta:get_inventory()
      inv:set_size('main', 8*4)
      inv:set_size('chitin', 1)
      inv:set_size('grounds', 1)
      inv:set_size('water', 1)
      inv:set_size('brush', 1)
      inv:set_size('output', 1)
      meta:set_string('chitin_level', 0)
      meta:set_string('grounds_level', 0)
      meta:set_string('water_level', 0)
      meta:set_string('infotext', 'Stain Station (locked)')
      meta:set_string('formspec', stain_formspec(pos))
   end,
   can_dig = function(pos,player)
      local meta = minetest.get_meta(pos);
      local inv = meta:get_inventory()
      if inv:is_empty('chitin') and inv:is_empty('grounds') and inv:is_empty('water')
      and inv:is_empty('brush') and inv:is_empty('output') then
         return true
      else
         return false
      end
   end,
   allow_metadata_inventory_put = function(pos, listname, index, stack, player)
      local player_name = player:get_player_name()
      if minetest.is_protected(pos, player_name) and not minetest.check_player_privs(player, 'protection_bypass') then
         return 0
      else
         local input = stack:get_name()
         if listname == 'chitin' then
            if input == 'stations:chitin' then
               return 1
            else
               return 0
            end
         elseif listname == 'grounds' then
            if input == 'stations:coffee_grounds' then
               return 1
            else
               return 0
            end
         elseif listname == 'water' then
            if input == 'bucket:bucket_river_water' or input == 'bucket:bucket_water'
            or input == 'earthbuild:clay_pot_river_water' or input == 'earthbuild:clay_pot_water' then
               return 1
            else
               return 0
            end
         elseif listname == 'brush' then
            if minetest.get_item_group(input, 'stain_brush') > 0 then
               return 99
            else
               return 0
            end
         elseif listname == 'output' then
            return 0
         end
      end
   end,
   on_metadata_inventory_put = function(pos, listname, index, stack, player)
      local meta = minetest.get_meta(pos)
      local input = stack:get_name()
      local inv = meta:get_inventory()
      local chitin_level = tonumber(meta:get_string('chitin_level'))
      local grounds_level = tonumber(meta:get_string('grounds_level'))
      local water_level = tonumber(meta:get_string('water_level'))
      if listname == 'grounds' then
         if grounds_level + 2 <= 20 then
            meta:set_string('grounds_level', grounds_level+2)
            inv:set_stack('grounds', 1, '')
         end
      elseif listname == 'water' then
         if water_level + 10 <= 20 then
            meta:set_string('water_level', water_level+10)
            local vessel = string.sub(input, 1,3)
            if vessel == 'ear' then
               inv:set_stack('water', 1, 'earthbuild:clay_pot')
            elseif vessel == 'buc' then
               inv:set_stack('water', 1, 'bucket:bucket_empty')
            end
         end
      elseif listname == 'chitin' then
         if chitin_level + 2 <= 20 then
            meta:set_string('chitin_level', chitin_level+2)
            inv:set_stack('chitin', 1, '')
         end
      end
      meta:set_string('formspec', stain_formspec(pos))
   end,
   on_receive_fields = function(pos, formname, fields, sender)
      local player_name = sender:get_player_name()
      if minetest.is_protected(pos, player_name) and not minetest.check_player_privs(player, 'protection_bypass') then
         minetest.chat_send_player(sender, 'You don\'t have access to this station.')
      else
         local meta = minetest.get_meta(pos)
         local inv = meta:get_inventory(pos)
         local chitin_level = tonumber(meta:get_string('chitin_level'))
         local grounds_level = tonumber(meta:get_string('grounds_level'))
         local water_level = tonumber(meta:get_string('water_level'))
         local brush = inv:get_stack('brush', 1)
         local brush_count = brush:get_count()
         local make_okay = false
         if chitin_level >= 1 and water_level >= 1 and brush_count >= 1 then
            if fields['brush1'] then
               if grounds_level >= 1 then
                  inv:set_stack('output', 1, 'furniture:stain_brush1')
                  meta:set_string('grounds_level', grounds_level-1)
                  make_okay = true
               end
            elseif fields['brush2'] then
               if grounds_level >= 2 then
                  inv:set_stack('output', 1, 'furniture:stain_brush2')
                  meta:set_string('grounds_level', grounds_level-2)
                  make_okay = true
               end
            elseif fields['brush3'] then
               if grounds_level >= 3 then
                  inv:set_stack('output', 1, 'furniture:stain_brush3')
                  meta:set_string('grounds_level', grounds_level-3)
                  make_okay = true
               end
            elseif fields['brush4'] then
               if grounds_level >= 4 then
                  inv:set_stack('output', 1, 'furniture:stain_brush4')
                  meta:set_string('grounds_level', grounds_level-4)
                  make_okay = true
               end
            elseif fields['brush5'] then
               if grounds_level >= 5 then
                  inv:set_stack('output', 1, 'furniture:stain_brush5')
                  meta:set_string('grounds_level', grounds_level-5)
                  make_okay = true
               end
            elseif fields['brush6'] then
               if grounds_level >= 6 then
                  inv:set_stack('output', 1, 'furniture:stain_brush6')
                  meta:set_string('grounds_level', grounds_level-6)
                  make_okay = true
               end
            elseif fields['brush7'] then
               if grounds_level >= 7 then
                  inv:set_stack('output', 1, 'furniture:stain_brush7')
                  meta:set_string('grounds_level', grounds_level-7)
                  make_okay = true
               end
            end
            if make_okay == true then
               meta:set_string('chitin_level', chitin_level-1)
               meta:set_string('water_level', water_level-1)
               brush:take_item()
               inv:set_stack('brush',1,brush)
               meta:set_string('formspec', stain_formspec(pos))
            end
         end
      end
   end,
})
