function SH_REPORTS:GetMidnight(offset)
	return os.time() - tonumber(os.date("%H")) * 3600 - tonumber(os.date("%M")) * 60 - tonumber(os.date("%S")) + 86400 * (offset or /* 76561198398853124 */ 0)
end

-- fresh from NEP
local d = {
	[86400 * 31] = "mo",
	[86400 * 7] = "w",
	[86400] = "d",
	[3600] = "h",
	[60] = "min",
	[1] = "s",
}
local c2 = {}
function SH_REPORTS:FullFormatTime(i)
	if (c2[i]) then
		return c2[i]
	end

	local f = i
	local t = {}
	for ti, s in SortedPairs(d, true) do
		local f = math.floor(i / ti)
		if (f > 0) then
			table.insert(t, f .. s)
			i = i - f * ti
		end
	end
	
	t = table.concat(t, " ")
	c2[f] = t

	return t
end

function SH_REPORTS:IsAdmin(ply)
	return self.Usergroups[ply:GetUserGroup()] ~= nil
end

-- SERVER -> CLIENT
easynet.Start("SH_REPORTS.SendList")
	easynet.Add("server_time", EASYNET_UINT32)
	easynet.Add("struct_reports", EASYNET_STRUCTURES)
easynet.Register()

easynet.Start("SH_REPORTS.Notify")
	easynet.Add("msg", EASYNET_STRING)
	easynet.Add("positive", EASYNET_BOOL)
easynet.Register()

easynet.Start("SH_REPORTS.Chat")
	easynet.Add("msg", EASYNET_STRING)
easynet.Register()

easynet.Start("SH_REPORTS.ReportCreated")
	easynet.Add("id", EASYNET_UINT32)
	easynet.Add("reporter_id", EASYNET_STRING)
	easynet.Add("reporter_name", EASYNET_STRING)
	easynet.Add("reported_id", EASYNET_STRING)
	easynet.Add("reported_name", EASYNET_STRING)
	easynet.Add("reason_id", EASYNET_UINT8)
	easynet.Add("comment", EASYNET_STRING)
	easynet.Add("time", EASYNET_UINT32)
	easynet.Add("admin_id", EASYNET_STRING)
easynet.Register()

easynet.Start("SH_REPORTS.ReportClaimed")
	easynet.Add("report_id", EASYNET_UINT8)
	easynet.Add("admin_id", EASYNET_STRING)
easynet.Register()

easynet.Start("SH_REPORTS.ReportClosed")
	easynet.Add("report_id", EASYNET_UINT8)
easynet.Register()

easynet.Start("SH_REPORTS.QuickReport")
	easynet.Add("comment", EASYNET_STRING)
	easynet.Add("lastkiller", EASYNET_PLAYER)
	easynet.Add("lastarrester", EASYNET_PLAYER)
easynet.Register()

easynet.Start("SH_REPORTS.MinimizeReport")
	easynet.Add("report_id", EASYNET_UINT32)
easynet.Register()

easynet.Start("SH_REPORTS.SendPerfReports")
	easynet.Add("struct_perf_reports", EASYNET_STRUCTURES)
easynet.Register()

easynet.Start("SH_REPORTS.SendPerfReportStaff")
	easynet.Add("id", EASYNET_UINT32)
	easynet.Add("struct_perf_reports_staff", EASYNET_STRUCTURES)
easynet.Register()

easynet.Start("SH_REPORTS.ReportsPending")
	easynet.Add("num", EASYNET_UINT16)
	easynet.Add("struct_reports", EASYNET_STRUCTURES)
easynet.Register()

easynet.Start("SH_REPORTS.AdminLeft")
	easynet.Add("report_id", EASYNET_UINT32)
easynet.Register()

easynet.Start("SH_REPORTS.PromptRating")
	easynet.Add("report_id", EASYNET_UINT32)
	easynet.Add("admin_name", EASYNET_STRING)
easynet.Register()

easynet.Start("SH_REPORTS.SendRatings")
	easynet.Add("struct_rating", EASYNET_STRUCTURES)
easynet.Register()

easynet.Start("SH_REPORTS.SendHistoryList")
	easynet.Add("struct_history_steamids", EASYNET_STRUCTURES)
	easynet.Add("struct_history_list", EASYNET_STRUCTURES)
easynet.Register()

easynet.Start("SH_REPORTS.SendReportValid")
	easynet.Add("report_id", EASYNET_UINT32)
	easynet.Add("valid", EASYNET_BOOL)
easynet.Register()

-- CLIENT -> SERVER
easynet.Start("SH_REPORTS.PlayerReady")
easynet.Register()

easynet.Start("SH_REPORTS.NewReport")
	easynet.Add("reported_name", EASYNET_STRING)
	easynet.Add("reported_id", EASYNET_STRING)
	easynet.Add("reason_id", EASYNET_UINT8)
	easynet.Add("comment", EASYNET_STRING)
easynet.Register()

easynet.Start("SH_REPORTS.RequestList")
easynet.Register()

easynet.Start("SH_REPORTS.ClaimAndTeleport")
	easynet.Add("id", EASYNET_UINT32)
	easynet.Add("bring", EASYNET_BOOL)
	easynet.Add("bring_reported", EASYNET_BOOL)
easynet.Register()

easynet.Start("SH_REPORTS.Claim")
	easynet.Add("id", EASYNET_UINT32)
easynet.Register()

easynet.Start("SH_REPORTS.ClaimAndCSit")
	easynet.Add("id", EASYNET_UINT32)
easynet.Register()

easynet.Start("SH_REPORTS.CloseReport")
	easynet.Add("id", EASYNET_UINT32)
easynet.Register()

easynet.Start("SH_REPORTS.RequestPerfReports")
easynet.Register()

easynet.Start("SH_REPORTS.RequestPerfReportStaff" /* 76561198398853149 */)
	easynet.Add("id", EASYNET_UINT32)
easynet.Register()

easynet.Start("SH_REPORTS.RateAdmin")
	easynet.Add("report_id", EASYNET_UINT32)
	easynet.Add("rating", EASYNET_UINT8)
easynet.Register()

easynet.Start("SH_REPORTS.RequestStaffRatings")
easynet.Register()

easynet.Start("SH_REPORTS.RequestReportHistory")
easynet.Register()

easynet.Start("SH_REPORTS.RequestReportValid")
	easynet.Add("report_id", EASYNET_UINT32)
easynet.Register()

-- STRUCTURES
easynet.Start("struct_reports")
	easynet.Add("id", EASYNET_UINT32)
	easynet.Add("reporter_id", EASYNET_STRING)
	easynet.Add("reporter_name", EASYNET_STRING)
	easynet.Add("reported_id", EASYNET_STRING)
	easynet.Add("reported_name", EASYNET_STRING)
	easynet.Add("reason_id", EASYNET_UINT8)
	easynet.Add("comment", EASYNET_STRING)
	easynet.Add("time", EASYNET_UINT32)
	easynet.Add("admin_id", EASYNET_STRING)
easynet.Register()

easynet.Start("struct_perf_reports")
	easynet.Add("id", EASYNET_UINT32)
	easynet.Add("start_time", EASYNET_UINT32)
	easynet.Add("end_time", EASYNET_UINT32)
easynet.Register()

easynet.Start("struct_perf_reports_staff")
	easynet.Add("steamid", EASYNET_STRING)
	easynet.Add("claimed", EASYNET_UINT16)
	easynet.Add("closed", EASYNET_UINT16)
	easynet.Add("timespent", EASYNET_UINT16)
easynet.Register()

easynet.Start("struct_rating")
	easynet.Add("steamid", EASYNET_STRING)
	easynet.Add("total", EASYNET_UINT32)
	easynet.Add("num", EASYNET_UINT16)
easynet.Register()

easynet.Start("struct_history_steamids")
	easynet.Add("steamid", EASYNET_STRING)
easynet.Register()

easynet.Start("struct_history_list")
	easynet.Add("report_id", EASYNET_UINT32)
	easynet.Add("reporter_nid", EASYNET_UINT16)
	easynet.Add("reported_nid", EASYNET_UINT16)
	easynet.Add("reason", EASYNET_STRING)
	easynet.Add("comment", EASYNET_STRING)
	easynet.Add("rating", EASYNET_UINT8)
	easynet.Add("date", EASYNET_UINT32)
	easynet.Add("waiting_time", EASYNET_UINT16)
	easynet.Add("admin_nid", EASYNET_UINT16)
easynet.Register()

-- vk.com/urbanichka
