#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <hamsandwich>

#define PLUGIN "SpecGuard"
#define VERSION "1.0"
#define AUTHOR "SpecGuard Team"

// Menu ID'leri
#define MENU_PCONTROL 1001
#define MENU_UNCHECK 1002

// Takım ID'leri
#define TEAM_SPECTATOR 1

// Global değişkenler
new g_ControlledPlayers[33]; // Kontrol altındaki oyuncular (1 = kontrol altında, 0 = serbest)
new g_MenuPage[33]; // Menu sayfa takibi
new g_OldTeam[33]; // Oyuncunun eski takımı (kontrol altına alınmadan önce)

// TS3 Adresi (placeholder - değiştirilebilir)
new const g_TS3Address[] = "ts3.serveradresiniz.com";

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR);
	
	// Komut kayıtları
	register_clcmd("say /pcontrol", "CmdPControl");
	register_clcmd("say_team /pcontrol", "CmdPControl");
	register_clcmd("pcontrol", "CmdPControl");
	
	register_clcmd("say /uncheck", "CmdUncheck");
	register_clcmd("say_team /uncheck", "CmdUncheck");
	register_clcmd("uncheck", "CmdUncheck");
	
	register_clcmd("say /bancontrol", "CmdBanControl");
	register_clcmd("say_team /bancontrol", "CmdBanControl");
	register_clcmd("bancontrol", "CmdBanControl");
	
	// Ham hook'ları
	RegisterHam(Ham_Spawn, "player", "OnPlayerSpawn", 1);
	
	// Chooseteam ve jointeam komutlarını hook'la (sadece kontrol altındaki oyuncular için engelle)
	register_clcmd("chooseteam", "CmdChooseTeam");
	register_clcmd("jointeam", "CmdChooseTeam");
	
	// Array'i sıfırla
	arrayset(g_ControlledPlayers, 0, sizeof(g_ControlledPlayers));
	arrayset(g_MenuPage, 0, sizeof(g_MenuPage));
	arrayset(g_OldTeam, 0, sizeof(g_OldTeam));
}

// /pcontrol komutu
public CmdPControl(id)
{
	// Yetki kontrolü
	if(!(get_user_flags(id) & ADMIN_LEVEL_A))
	{
		client_print(id, print_chat, "[SpecGuard] Bu komutu kullanmak için yetkiniz yok.");
		return PLUGIN_HANDLED;
	}
	
	// Aktif oyuncuları listele
	ShowPlayerListMenu(id, 0);
	
	return PLUGIN_HANDLED;
}

// /uncheck komutu
public CmdUncheck(id)
{
	// Yetki kontrolü
	if(!(get_user_flags(id) & ADMIN_LEVEL_A))
	{
		client_print(id, print_chat, "[SpecGuard] Bu komutu kullanmak için yetkiniz yok.");
		return PLUGIN_HANDLED;
	}
	
	// Kontrol altındaki oyuncuları listele
	ShowControlledPlayersMenu(id, 0);
	
	return PLUGIN_HANDLED;
}

// /bancontrol komutu - Kontrol altındaki oyuncuları banla
public CmdBanControl(id)
{
	// Yetki kontrolü
	if(!(get_user_flags(id) & ADMIN_LEVEL_A))
	{
		client_print(id, print_chat, "[SpecGuard] Bu komutu kullanmak için yetkiniz yok.");
		return PLUGIN_HANDLED;
	}
	
	// Kontrol altındaki oyuncuları listele ve banla
	ShowBanControlMenu(id, 0);
	
	return PLUGIN_HANDLED;
}

// Chooseteam komutu - Sadece kontrol altındaki oyuncular için engelle
public CmdChooseTeam(id)
{
	// Kontrol altındaysa engelle
	if(g_ControlledPlayers[id])
	{
		client_print(id, print_chat, "[SpecGuard] Kontrol altindayken takim degistiremezsiniz.");
		return PLUGIN_HANDLED;
	}
	
	// Kontrol altında değilse izin ver
	return PLUGIN_CONTINUE;
}

// Aktif oyuncuları gösteren menu
ShowPlayerListMenu(id, page)
{
	new menu = menu_create("Aktif Oyuncular - Kontrol Altina Al", "PlayerListMenuHandler");
	
	new players[32], num;
	get_players(players, num, "ch"); // Sadece bağlı oyuncular
	
	if(num == 0)
	{
		menu_additem(menu, "Aktif oyuncu yok", "", 0);
		menu_display(id, menu, 0);
		return;
	}
	
	new player, name[32], itemData[10];
	for(new i = 0; i < num; i++)
	{
		player = players[i];
		
		// Kontrol altında olanları atla
		if(g_ControlledPlayers[player])
			continue;
		
		get_user_name(player, name, charsmax(name));
		formatex(itemData, charsmax(itemData), "%d", player);
		
		menu_additem(menu, name, itemData, 0);
	}
	
	menu_setprop(menu, MPROP_BACKNAME, "Geri");
	menu_setprop(menu, MPROP_NEXTNAME, "Ileri");
	menu_setprop(menu, MPROP_EXITNAME, "Cikis");
	
	g_MenuPage[id] = page;
	menu_display(id, menu, page);
}

// Aktif oyuncu menu handler
public PlayerListMenuHandler(id, menu, item)
{
	if(item == MENU_EXIT)
	{
		menu_destroy(menu);
		return PLUGIN_HANDLED;
	}
	
	new data[10], name[64];
	new access, callback;
	menu_item_getinfo(menu, item, access, data, charsmax(data), name, charsmax(name), callback);
	
	new target = str_to_num(data);
	
	if(!is_user_connected(target))
	{
		client_print(id, print_chat, "[SpecGuard] Oyuncu baglantisi kesildi.");
		menu_destroy(menu);
		ShowPlayerListMenu(id, g_MenuPage[id]);
		return PLUGIN_HANDLED;
	}
	
	// Oyuncuyu kontrol altına al
	PutPlayerUnderControl(id, target);
	
	menu_destroy(menu);
	return PLUGIN_HANDLED;
}

// Kontrol altındaki oyuncuları gösteren menu
ShowControlledPlayersMenu(id, page)
{
	new menu = menu_create("Kontrol Altindaki Oyuncular - Serbest Birak", "ControlledPlayersMenuHandler");
	
	new players[32], num;
	get_players(players, num, "ch");
	
	new controlledCount = 0;
	new player, name[32], itemData[10];
	
	for(new i = 0; i < num; i++)
	{
		player = players[i];
		
		if(g_ControlledPlayers[player])
		{
			get_user_name(player, name, charsmax(name));
			formatex(itemData, charsmax(itemData), "%d", player);
			
			menu_additem(menu, name, itemData, 0);
			controlledCount++;
		}
	}
	
	if(controlledCount == 0)
	{
		menu_additem(menu, "Kontrol altinda oyuncu yok", "", 0);
		menu_display(id, menu, 0);
		return;
	}
	
	menu_setprop(menu, MPROP_BACKNAME, "Geri");
	menu_setprop(menu, MPROP_NEXTNAME, "Ileri");
	menu_setprop(menu, MPROP_EXITNAME, "Cikis");
	
	g_MenuPage[id] = page;
	menu_display(id, menu, page);
}

// Kontrol altındaki oyuncular menu handler
public ControlledPlayersMenuHandler(id, menu, item)
{
	if(item == MENU_EXIT)
	{
		menu_destroy(menu);
		return PLUGIN_HANDLED;
	}
	
	new data[10], name[64];
	new access, callback;
	menu_item_getinfo(menu, item, access, data, charsmax(data), name, charsmax(name), callback);
	
	new target = str_to_num(data);
	
	if(!is_user_connected(target))
	{
		client_print(id, print_chat, "[SpecGuard] Oyuncu baglantisi kesildi.");
		menu_destroy(menu);
		ShowControlledPlayersMenu(id, g_MenuPage[id]);
		return PLUGIN_HANDLED;
	}
	
	// Oyuncuyu serbest bırak
	ReleasePlayerFromControl(id, target);
	
	menu_destroy(menu);
	return PLUGIN_HANDLED;
}

// Ban kontrol menüsü
ShowBanControlMenu(id, page)
{
	new menu = menu_create("Kontrol Altindaki Oyuncular - Banla", "BanControlMenuHandler");
	
	new players[32], num;
	get_players(players, num, "ch");
	
	new controlledCount = 0;
	new player, name[32], itemData[10];
	
	for(new i = 0; i < num; i++)
	{
		player = players[i];
		
		if(g_ControlledPlayers[player])
		{
			get_user_name(player, name, charsmax(name));
			formatex(itemData, charsmax(itemData), "%d", player);
			
			menu_additem(menu, name, itemData, 0);
			controlledCount++;
		}
	}
	
	if(controlledCount == 0)
	{
		menu_additem(menu, "Kontrol altinda oyuncu yok", "", 0);
		menu_display(id, menu, 0);
		return;
	}
	
	menu_setprop(menu, MPROP_BACKNAME, "Geri");
	menu_setprop(menu, MPROP_NEXTNAME, "Ileri");
	menu_setprop(menu, MPROP_EXITNAME, "Cikis");
	
	g_MenuPage[id] = page;
	menu_display(id, menu, page);
}

// Ban kontrol menu handler
public BanControlMenuHandler(id, menu, item)
{
	if(item == MENU_EXIT)
	{
		menu_destroy(menu);
		return PLUGIN_HANDLED;
	}
	
	new data[10], name[64];
	new access, callback;
	menu_item_getinfo(menu, item, access, data, charsmax(data), name, charsmax(name), callback);
	
	new target = str_to_num(data);
	
	if(!is_user_connected(target))
	{
		client_print(id, print_chat, "[SpecGuard] Oyuncu baglantisi kesildi.");
		menu_destroy(menu);
		ShowBanControlMenu(id, g_MenuPage[id]);
		return PLUGIN_HANDLED;
	}
	
	// Yetki kontrolü - ban işlemi için
	if(!(get_user_flags(id) & ADMIN_LEVEL_A))
	{
		client_print(id, print_chat, "[SpecGuard] Ban islemi icin yetkiniz yok.");
		menu_destroy(menu);
		return PLUGIN_HANDLED;
	}
	
	// Oyuncuyu banla
	BanPlayer(id, target);
	
	menu_destroy(menu);
	return PLUGIN_HANDLED;
}

// Oyuncuyu kontrol altına alma fonksiyonu
PutPlayerUnderControl(admin, target)
{
	if(!is_user_connected(target))
		return;
	
	// Zaten kontrol altındaysa
	if(g_ControlledPlayers[target])
	{
		client_print(admin, print_chat, "[SpecGuard] Bu oyuncu zaten kontrol altinda.");
		return;
	}
	
	// Oyuncunun mevcut takımını kaydet
	g_OldTeam[target] = _:cs_get_user_team(target);
	
	// Kontrol listesine ekle
	g_ControlledPlayers[target] = 1;
	
	// Eğer oyuncu canlıysa öldür
	if(is_user_alive(target))
	{
		user_kill(target, 1);
	}
	
	// Spectator takımına aktar
	cs_set_user_team(target, CS_TEAM_SPECTATOR);
	
	// Kısa bir gecikme ile tekrar spectator'a gönder (güvenlik için)
	set_task(0.2, "ForceSpectator", target);
	
	// HTML MOTD gönder
	new adminName[32], targetName[32];
	get_user_name(admin, adminName, charsmax(adminName));
	get_user_name(target, targetName, charsmax(targetName));
	SendControlMOTD(target, adminName);
	
	// Bilgilendirme mesajları
	client_print(admin, print_chat, "[SpecGuard] %s kontrol altina alindi.", targetName);
	client_print(target, print_chat, "[SpecGuard] Kontrol altina alindiniz. Takim degistiremezsiniz.");
	
	client_print(admin, print_chat, "[SpecGuard] %s kontrol altina alindi.", targetName);
	client_print(target, print_chat, "[SpecGuard] Kontrol altina alindiniz. Takim degistiremezsiniz.");
}

// Oyuncuyu serbest bırakma fonksiyonu
ReleasePlayerFromControl(admin, target)
{
	if(!is_user_connected(target))
		return;
	
	// Kontrol altında değilse
	if(!g_ControlledPlayers[target])
	{
		client_print(admin, print_chat, "[SpecGuard] Bu oyuncu kontrol altinda degil.");
		return;
	}
	
	// Kontrol listesinden çıkar
	g_ControlledPlayers[target] = 0;
	
	// Eski takımına geri gönder
	if(g_OldTeam[target] > 0)
	{
		cs_set_user_team(target, CsTeams:g_OldTeam[target]);
	}
	else
	{
		// Eğer eski takım bilgisi yoksa CT takımına gönder
		cs_set_user_team(target, CS_TEAM_CT);
	}
	
	// Eski takım bilgisini sıfırla
	g_OldTeam[target] = 0;
	
	// Oyuncuyu spawn et (dirilt)
	if(!is_user_alive(target))
	{
		// Kısa bir gecikme ile spawn et (takım değişikliğinin tamamlanması için)
		set_task(0.3, "SpawnPlayer", target);
	}
	
	// HTML MOTD gönder
	SendReleaseMOTD(target);
	
	// Bilgilendirme mesajları
	new adminName[32], targetName[32];
	get_user_name(admin, adminName, charsmax(adminName));
	get_user_name(target, targetName, charsmax(targetName));
	
	client_print(admin, print_chat, "[SpecGuard] %s serbest birakildi.", targetName);
	client_print(target, print_chat, "[SpecGuard] Kontrol altindan cikarildiniz. Artik takim degistirebilirsiniz.");
}

// Kontrol altına alma MOTD mesajı
SendControlMOTD(id, const adminName[])
{
	new motd[2000];
	formatex(motd, charsmax(motd), "<html><head><meta charset='UTF-8'><title>Uyari</title><style>body{margin:0;padding:0;background:#0a0a0a;font-family:Arial,sans-serif;color:#fff}table{width:100%%;height:100vh;border:0;cellpadding:0;cellspacing:0}.main{background:#1a1a1a;border:3px solid #ff3333;padding:30px;text-align:center}.header{font-size:36px;font-weight:bold;color:#ff3333;margin:20px 0;text-shadow:2px 2px 4px #000}.subheader{font-size:20px;color:#ff6666;margin:15px 0}.content{font-size:16px;color:#ddd;line-height:24px;margin:20px 0;padding:20px;background:#2a2a2a;border:2px solid #ff3333}.admin{font-size:18px;color:#ffaa00;margin:15px 0;font-weight:bold}.ts3{font-size:22px;font-weight:bold;color:#fff;background:#ff3333;padding:15px 25px;margin:20px auto;display:inline-block;border:2px solid #ff6666}.footer{font-size:12px;color:#888;margin-top:30px}</style></head><body><table><tr><td align='center' valign='middle'><div class='main'><div class='header'>HILE SUPHELI / VEYA DIGER SEBEPLER YUZUNDEN</div><div class='subheader'>KONTROL ALTINA ALINDINIZ</div><div class='content'>Güvenlik sistemi sizi inceleme moduna aldı.<br><br>Oyuna devam edebilmek icin TeamSpeak 3 adresimize gelerek<br>AnyDesk / TeamViewer / Wargods veriniz.<br><br><div class='admin'>Islemi Uygulayan Yetkili: %s</div><div class='ts3'>TS3 Adresimiz: %s</div></div><div class='footer'>Bu islem guvenlik amacli yapilmistir.</div></div></td></tr></table></body></html>", adminName, g_TS3Address);
	show_motd(id, motd, "Kontrol Altina Alindi");
}

// Serbest bırakma MOTD mesajı
SendReleaseMOTD(id)
{
	new motd[2000];
	formatex(motd, charsmax(motd), "<html><head><meta charset='UTF-8'><title>Serbest Birakildi</title><style>body{margin:0;padding:0;background:#0a0a0a;font-family:Arial,sans-serif;color:#fff}table{width:100%%;height:100vh;border:0;cellpadding:0;cellspacing:0}.main{background:#1a1a1a;border:3px solid #33ff33;padding:30px;text-align:center}.header{font-size:36px;font-weight:bold;color:#33ff33;margin:20px 0;text-shadow:2px 2px 4px #000}.subheader{font-size:20px;color:#66ff66;margin:15px 0}.content{font-size:16px;color:#ddd;line-height:24px;margin:20px 0;padding:20px;background:#2a2a2a;border:2px solid #33ff33}.info{font-size:18px;color:#fff;margin:15px 0;padding:10px;background:#2a4a2a;border-left:4px solid #33ff33}.footer{font-size:12px;color:#888;margin-top:30px}</style></head><body><table><tr><td align='center' valign='middle'><div class='main'><div class='header'>KONTROL ALTINDAN CIKARILDINIZ</div><div class='subheader'>Kontrol islemi tamamlandi</div><div class='content'><div class='info'>✓ Artik normal sekilde oyuna devam edebilirsiniz</div><div class='info'>✓ Takim degistirebilirsiniz</div><div class='info'>✓ Oyuna katilabilirsiniz</div></div><div class='footer'>Iyi oyunlar dileriz!</div></div></td></tr></table></body></html>");
	show_motd(id, motd, "Serbest Birakildi");
}

// Oyuncu spawn olduğunda takım değiştirmeyi engelle
public OnPlayerSpawn(id)
{
	if(!is_user_alive(id))
		return HAM_IGNORED;
	
	// Kontrol altındaysa spectator'a geri gönder
	if(g_ControlledPlayers[id])
	{
		// Hemen öldür ve spectator'a gönder
		user_kill(id, 1);
		set_task(0.1, "ForceSpectator", id);
	}
	
	return HAM_IGNORED;
}

// Oyuncuyu zorla spectator yap
public ForceSpectator(id)
{
	if(!is_user_connected(id))
		return;
	
	if(g_ControlledPlayers[id])
	{
		// Eğer hala canlıysa öldür
		if(is_user_alive(id))
		{
			user_kill(id, 1);
		}
		
		// Spectator takımına aktar
		cs_set_user_team(id, CS_TEAM_SPECTATOR);
	}
}

// Oyuncuyu spawn et (dirilt)
public SpawnPlayer(id)
{
	if(!is_user_connected(id))
		return;
	
	// Kontrol altında değilse spawn et
	if(!g_ControlledPlayers[id])
	{
		if(!is_user_alive(id))
		{
			// CS 1.6'da spawn için Ham_Spawn hook'u kullan
			ExecuteHam(Ham_Spawn, id);
			
			// Ek güvenlik: Eğer hala ölüyse tekrar dene
			if(!is_user_alive(id))
			{
				set_task(0.2, "SpawnPlayer", id);
			}
		}
	}
}

// Oyuncu bağlantısı kesildiğinde temizlik ve otomatik ban
public client_disconnected(id)
{
	// Kontrol altındaysa otomatik banla (yetki kontrolü yapılmaz, otomatik işlem)
	if(g_ControlledPlayers[id])
	{
		BanControlledPlayer(id);
	}
	
	g_ControlledPlayers[id] = 0;
	g_MenuPage[id] = 0;
	g_OldTeam[id] = 0;
}

// Manuel ban işlemi (yetki kontrolü ile)
BanPlayer(admin, target)
{
	if(!is_user_connected(target))
		return;
	
	// Yetki kontrolü
	if(!(get_user_flags(admin) & ADMIN_LEVEL_A))
	{
		client_print(admin, print_chat, "[SpecGuard] Ban islemi icin yetkiniz yok.");
		return;
	}
	
	// Kontrol altında değilse
	if(!g_ControlledPlayers[target])
	{
		client_print(admin, print_chat, "[SpecGuard] Bu oyuncu kontrol altinda degil.");
		return;
	}
	
	// Ban işlemini yap
	BanControlledPlayer(target);
	
	// Kontrol listesinden çıkar
	g_ControlledPlayers[target] = 0;
	g_OldTeam[target] = 0;
	
	// Bilgilendirme
	new adminName[32], targetName[32];
	get_user_name(admin, adminName, charsmax(adminName));
	get_user_name(target, targetName, charsmax(targetName));
	
	client_print(admin, print_chat, "[SpecGuard] %s kalici olarak banlandi.", targetName);
}

// Kontrol altındaki oyuncuyu kalıcı olarak banla
// Not: Bu fonksiyon otomatik olarak çağrıldığı için yetki kontrolü yapılmaz
// Manuel ban işlemleri için BanPlayer fonksiyonu kullanılmalıdır
BanControlledPlayer(id)
{
	if(!is_user_connected(id))
		return;
	
	new authid[35], ip[16], name[32];
	get_user_authid(id, authid, charsmax(authid));
	get_user_ip(id, ip, charsmax(ip), 1);
	get_user_name(id, name, charsmax(name));
	
	// Steam ID ban (kalıcı - 0 dakika = süresiz)
	if(strlen(authid) > 0 && !equal(authid, "STEAM_ID_PENDING") && !equal(authid, "STEAM_ID_LAN"))
	{
		server_cmd("banid 0 %s kick", authid);
		server_cmd("writeid");
	}
	
	// IP ban (kalıcı - 0 dakika = süresiz)
	if(strlen(ip) > 0)
	{
		server_cmd("addip 0 %s", ip);
		server_cmd("writeip");
	}
	
	// Log kaydı
	new logFile[128];
	get_configsdir(logFile, charsmax(logFile));
	format(logFile, charsmax(logFile), "%s/specguard_bans.log", logFile);
	
	new timeString[32];
	get_time("%Y-%m-%d %H:%M:%S", timeString, charsmax(timeString));
	
	new logData[256];
	format(logData, charsmax(logData), "[%s] KALICI BAN: Isim: %s | Steam ID: %s | IP: %s^n", 
		timeString, name, authid, ip);
	
	write_file(logFile, logData);
	
	// Sunucuya mesaj
	server_print("[SpecGuard] %s (Steam ID: %s | IP: %s) kontrol altindan cikti ve kalici olarak banlandi.", name, authid, ip);
}


