-- модуль реализует синий тотем
totems_widget = totems_widget or {}
totems_widget._totem_effect_create_functions = totems_widget._totem_effect_create_functions or {}
totems_widget._totem_load_options_functions = totems_widget._totem_load_options_functions or {}

-- настрйоки для синего тотема
totems_widget._blue_totem_options = {
	-- флаги действий тотема над фишкаи
	-- которые используются для настрйоки его работы для разной силы
	flags = {               
		simple_hit = 1,
		blow_hit = 2,
		turn_on_shield = 4
	},
	-- (заглушка) для отрисовки щитов если они есть
	shield_draw_pos = sf.misc.FloatVector(140, 470),  -- позиция текста и синфой о щитах
	start_lightning_pos = sf.misc.FloatVector(40, 40), -- позиция откуда ударяет молния из синего тотема
	steel_shield_id = "Стальной щит",                  -- названия щитов
	chain_shield_id = "Ледяной щит",
	hit_fly_speed = 400, -- скорость с которой молния будет лететь на поле
	shield_text = "",   -- итогове название щитов
	font = nil,          -- фонт для отрисовки
	slmple_hit = 0,  -- сила тряски для обычного удара
	blow_hit = 0     -- сила таряски для взрывающего удара    
	
}

-- функция загрузки специфичных для тотема параметров
totems_widget._totem_load_options_functions[s11.CFieldCap.CapTypeBlue] = function (_totems_info)

	local options = totems_widget._blue_totem_options
	options.start_lightning_pos = totems_widget.GetAbsOffset(StringToFloatVector(_totems_info.GetValue("start_lightning_pos").c_str()))
	options.shield_draw_pos = totems_widget.GetAbsOffset(StringToFloatVector(_totems_info.GetValue("shield_draw_pos").c_str()))
	options.hit_fly_speed = tonumber(_totems_info.GetValue("hit_fly_speed").c_str()) or 0
	
	local shake_info = g_App.GetSettings().GetChild("Constants", false).GetChild("shake_options", false).GetChild("blue_totem", false)
	
	options.slmple_hit = tonumber(shake_info.GetValue("slmple_hit").c_str())
	options.blow_hit = tonumber(shake_info.GetValue("blow_hit").c_str())
	
end

-- добавление эффект удара по фишке синим тотемом
-- _cell - ячейка по которой будет нанесен удар
-- _force - сила удара
-- _start_pos - начальаня позиция
-- _fly_speed - скорость полета
local HitCellEffect = function(_cell, _force, _start_pos, _fly_speed)
    local new_child_effect = 
    {
        Init = function(_self, _fly_speed, _start_pos, _cell, _force)
			--залочиваем ячейку, по которой бьет молния
			_cell.AddLock()
			_self._end_pos = game_helpers.GetFieldPos() + _cell.GetCapPos(true)
			_self._cell = _cell
			_self._force = _force or 0
			_self._start_pos = _start_pos
            _self._start_time = effects_widget.effects_timer.Get().GetTime()
            _self._total_time = CalcTimeForVector(_self._start_pos, _self._end_pos, _fly_speed)
            _self._end_time = _self._start_time + _self._total_time
			_self._blow_effect = "BlueTotemLightnigHit"
			local options = totems_widget._blue_totem_options
			_self._shake_force = options.slmple_hit
			if _self._force == 2 then
				_self._blow_effect = "BlueTotemLightnigHitExpl"
				_self._shake_force = options.blow_hit
			end
			_self._particle_effect = effects_widget.visual_effects:CreateEffect("BlueTotemLightning", _start_pos)            
        end,

        Draw = function(_self, _renderer)
			--if _self._fly_obj_pos ~= nil then
				--local pos = _self._fly_obj_pos
				--_renderer.RenderLine(pos - sf.misc.FloatVector(20,20), pos + sf.misc.FloatVector(20,20), 0xffffffff)
				--_renderer.RenderLine(pos - sf.misc.FloatVector(20,-20), pos + sf.misc.FloatVector(20,-20), 0xffffffff)
			--end
        end,

        Update = function(_self, _time)
            local koef = (_time - _self._start_time)/_self._total_time
            _self._fly_obj_pos = effects_widget.SimpleFlyFunction( _self._start_pos, _self._end_pos, koef)
			_self._particle_effect:SetPos(_self._fly_obj_pos)
            if _time > _self._end_time then
                _self:InstantApply()
            end
        end,

        InstantApply = function(_self)
            if not _self._is_dead then
				-- разлочиваемячейку и взрываем ее
				_self._cell.DecLock()
				game_window.game_field.BlowUpCell(_self._cell, _self._force, _self._shake_force)
				_self._particle_effect:Kill(false)
				game_window.game_field.AddCompositeEffect(_self._end_pos, _self._blow_effect)
			end

            _self._is_dead = true
        end,

		IsDead = function(_self)
			return _self._is_dead
		end,
    }
	new_child_effect:Init(_fly_speed, _start_pos, _cell, _force)
	effects_widget.add_effect(new_child_effect)
end

-- функция создания эффекта синего тотема
totems_widget._totem_effect_create_functions[s11.CFieldCap.CapTypeBlue] = function ()
    local new_child_effect = 
    {
		_HitCellEffect = HitCellEffect,
		_options = totems_widget._blue_totem_options,

        Init = function(_self, _work_info)
			_self._end_time = totems_widget._totem_work_time + totems_widget.effects_timer.Get().GetTime()
			-- находим стальные и залоченые ячейки
			local steel_list = {}
			local chain_list = {}
			for i = 0,s11.ConstsFieldSizeX-1 do
				for j = 0,s11.ConstsFieldSizeY-1 do
					local cell = game_window.game_field.GetCell(i, j)
					local cap = cell.GetCap()
					-- находим свободные ячейки с фишками
					if cell.IsFree() and cap then
						-- если фишка стальная или залоченая
						-- то запоминаем ячеку в соответсвующий список
						if cap.IsSteel() then
							table.insert(steel_list, cell)
						end
						if cap.IsChain() then
							table.insert(chain_list, cell)
						end
					end
				end
			end

			-- передаем в функцию создания эффектов
			-- списки ячееки, флаги настроек рабоыт для ячеек в списке, функцию активации щита
			-- обрабатываем стальные фишки
			_self:_CreateHitCellEffects(steel_list, 
                                        _work_info.perk1, 
                                        game_window.game_field.SetSteelShield)
			-- обрабатываем залоченые фишки
			_self:_CreateHitCellEffects(chain_list, 
                                        _work_info.perk2, 
                                        game_window.game_field.SetChainShield)

        end,
		
		-- функция обработки ячеек 
		-- _cell_list - список обрабатываемх ячеек
		-- _flags - флаги определяющие что с нимим делать
		-- _shield_function - функция, которая активирует щит если нужно
		_CreateHitCellEffects = function(_self, _cell_list, _flags, _shield_function)
			-- если установлен флаг щита то вызываем функцию его активации
			if __and(_flags, totems_widget._blue_totem_options.flags.turn_on_shield) ~= 0 then
				_shield_function(true)
				-- обновляем отображение щитов
				--totems_widget._UpdateShieldInfo(game_window.game_field)
			end
			-- если ячеек на обработки нет то выходим
			if #_cell_list == 0 then return end
			
			local force = -1
			-- если установлен флаг простого разрушения, то сила взрыва = 0
			if __and(_flags, totems_widget._blue_totem_options.flags.simple_hit) ~= 0 then
				force = 0
			end
			-- если установлен флаг разрушения-взрыва, то сила взрыва = 2
			if __and(_flags, totems_widget._blue_totem_options.flags.blow_hit) ~= 0 then
				force = 2
			end
			-- если силы нет то выходим не доавбив эффектов
			if force == -1 then return end
			-- иначе обходим ячейки в списке и добавляем для них эффекты удара по ним
			for _,cell in pairs(_cell_list) do
				_self._HitCellEffect(cell, force, _self._options.start_lightning_pos, _self._options.hit_fly_speed)
			end
		end,
		
        Draw = function(_self, _renderer)
        end,

        Update = function(_self, _time)
            if _time > _self._end_time then
                _self:InstantApply()
            end
        end,

        InstantApply = function(_self)
            _self._is_dead = true
        end,
		
		IsDead = function(_self)
			return _self._is_dead
		end
    }
    return new_child_effect
end
