/* global React, Ico, Button, Label, Card, Avatar, tierFor, ovrBand */
// NEXT XI · v4 — Admin dashboard + child registry

const { useState: useS4, useEffect: useE4 } = React;

// ────────────────────────────────────────────────────────────
// CHILD REGISTRY — maps child-link codes to player records
// ────────────────────────────────────────────────────────────
const CHILD_REGISTRY = {
  'EFE-4821':  { name:'EFE YILDIZ',    initials:'EY', position:'CAM', age:'U16', ovr: 82, xp: 3420, club:'Galatasaray Akademi' },
  'MERT-7203': { name:'MERT KARA',     initials:'MK', position:'ST',  age:'U16', ovr: 85, xp: 4280, club:'Galatasaray Akademi' },
  'ALI-9145':  { name:'ALİ ŞAHİN',     initials:'AŞ', position:'LW',  age:'U14', ovr: 74, xp: 1820, club:'Galatasaray Akademi' },
};
const DEFAULT_CHILD_KEY = 'EFE-4821';

// ────────────────────────────────────────────────────────────
// ADMIN DASHBOARD — primary role screen (not a modal overlay)
// Tabs: Pending · Coaches · Parents · Teams
// ────────────────────────────────────────────────────────────
// Mock data for demo mode (no Firebase profile)
const MOCK_PENDING = [
  { uid:'m1', displayName:'Kerem Yılmaz', email:'kerem@demo.tr', role:'player', position:'ST', ageGroup:'U16' },
  { uid:'m2', displayName:'Selin Arslan', email:'selin@demo.tr', role:'player', position:'CAM', ageGroup:'U14' },
  { uid:'m3', displayName:'Koç Ahmet',    email:'ahmet@demo.tr', role:'coach'  },
];
const MOCK_COACH_CODES = [
  { code:'COACH-2026', email:'ahmet@academy.tr', status:'active',  created:'12 May' },
  { code:'COACH-3147', email:'mehmet@academy.tr', status:'claimed', created:'13 May' },
];
const MOCK_PARENT_CODES = [
  { code:'EFE-4821',  playerName:'Efe Yıldız', status:'active',  created:'10 May' },
  { code:'MERT-7203', playerName:'Mert Kara',  status:'claimed', created:'13 May' },
];

const AdminDashboardScreen = ({ lang, onToast, onSettings, profile, onProfileUpdate }) => {
  const langKey = lang === 'ru' ? 'ru' : lang === 'en' ? 'en' : 'tr';
  const isTr   = langKey === 'tr';
  const isRu   = langKey === 'ru';
  const say = (tr, en, ru) => isRu ? (ru ?? tr ?? en ?? '') : isTr ? (tr ?? en ?? ru ?? '') : (en ?? tr ?? ru ?? '');
  const isMock = !profile;

  // Sport type — read from profile (or default football)
  const sportType   = profile?.sportType || window.NXT_THEME?.sportType || 'football';
  const sportTh     = window.getSportTheme ? window.getSportTheme(sportType) : null;
  const isSwimming  = sportTh?.sportType === 'swimming';
  const playerLabel = isRu ? (isSwimming ? 'Пловец' : 'Спортсмен') : isTr ? (sportTh?.playerLabel || 'Sporcu') : (isSwimming ? 'Swimmer' : 'Athlete');
  const playerLabelPl = isRu ? (isSwimming ? 'Пловцы' : 'Спортсмены') : isTr ? (sportTh?.playerLabelPlural || 'Sporcular') : (isSwimming ? 'Swimmers' : 'Athletes');
  const coachLabel  = isRu ? (isSwimming ? 'Инструктор' : 'Тренер') : isTr ? (sportTh?.coachLabel || 'Koç') : (isSwimming ? 'Instructor' : 'Coach');
  const coachLabelPl  = isRu ? (isSwimming ? 'Инструкторы' : 'Тренеры') : isTr ? (sportTh?.coachLabelPlural || 'Koçlar') : (isSwimming ? 'Instructors' : 'Coaches');
  const teamLabel   = isRu ? (isSwimming ? 'Группа' : 'Команда') : isTr ? (sportTh?.teamLabel || 'Takım') : (isSwimming ? 'Group' : 'Team');
  const teamLabelPl   = isRu ? (isSwimming ? 'Группы' : 'Команды') : isTr ? (sportTh?.teamLabelPlural || 'Takımlar') : (isSwimming ? 'Groups' : 'Teams');

  const [tab, setTab] = useS4('pending');

  // ownerAdmin: created the academy; can invite/remove other admins
  const isOwnerAdmin = !isMock && profile?.academyRole === 'owner';

  // ── Admin management state (Yöneticiler tab) ──────────────
  const [adminInviteEmail,   setAdminInviteEmail]   = useS4('');
  const [adminInviteLoading, setAdminInviteLoading] = useS4(false);
  const [adminInviteMsg,     setAdminInviteMsg]     = useS4(null); // { type:'ok'|'err', text }
  const [adminInvites,       setAdminInvites]       = useS4([]);

  // ── Pending users ──────────────────────────────────────────
  const [realPending, setRealPending] = useS4([]);
  const pending = isMock && isSwimming
    ? [
        { uid:'m1', displayName:'Deniz Kaya', email:'deniz@demo.tr', role:'player', position:'Serbest', ageGroup:'Grup A' },
        { uid:'m2', displayName:'Elif Demir', email:'elif@demo.tr', role:'player', position:'Sırtüstü', ageGroup:'Grup A' },
        { uid:'m3', displayName:'Eğitmen Ahmet', email:'ahmet@academy.tr', role:'coach' },
      ]
    : (isMock ? MOCK_PENDING : realPending);
  const pendingAdmins  = pending.filter(u => u.role === 'admin' || u.role === 'superAdmin');
  const pendingCoaches = pending.filter(u => u.role === 'coach');
  const pendingParents = pending.filter(u => u.role === 'parent');
  const pendingPlayers = pending.filter(u => u.role === 'player');

  // ── Approved users (registered members) ───────────────────
  const [allUsers, setAllUsers] = useS4([]);
  const registeredCoaches = isMock ? [] : allUsers.filter(u => u.role === 'coach');
  const registeredParents = isMock ? [] : allUsers.filter(u => u.role === 'parent');
  const registeredPlayers = isMock ? [] : allUsers.filter(u => u.role === 'player' && u.status === 'approved');

  // ── Invite codes (real-time) ───────────────────────────────
  const [allCodes,   setAllCodes]   = useS4([]);
  const coachCodes       = isMock ? MOCK_COACH_CODES  : allCodes.filter(c => c.type === 'coach');
  const parentCodes      = isMock ? MOCK_PARENT_CODES : allCodes.filter(c => c.type === 'parent');
  const playerInviteCodes = isMock ? [] : allCodes.filter(c => c.type === 'player');

  // ── Input state ────────────────────────────────────────────
  const [coachEmail,           setCoachEmail]           = useS4('');
  const [coachLoading,         setCoachLoading]         = useS4(false);
  const [selectedPlayer,       setSelectedPlayer]       = useS4(null);
  const [parentEmail,          setParentEmail]          = useS4('');
  const [parentLoading,        setParentLoading]        = useS4(false);
  // ── Player invite state ─────────────────────────────────
  const [playerInviteName,     setPlayerInviteName]     = useS4('');
  const [playerInviteTeam,     setPlayerInviteTeam]     = useS4('');
  const [playerInviteCoach,    setPlayerInviteCoach]    = useS4('');
  const [playerInviteEmail,    setPlayerInviteEmail]    = useS4('');
  const [playerInviteLoading,  setPlayerInviteLoading]  = useS4(false);

  // ── Teams ──────────────────────────────────────────────────
  const MOCK_TEAMS = [
    { id:'m1', name:'U16 Elit',    ageGroup:'U16', players:['Efe Yıldız','Mert Kara','Burak Aslan','Can Demir'], coach:'Koç Ahmet' },
    { id:'m2', name:'U14 Gelişim', ageGroup:'U14', players:['Ali Şahin','Deniz Öz'],                             coach:'Koç Selin' },
  ];
  const [realTeams,    setRealTeams]    = useS4([]);
  const [teamsLoading, setTeamsLoading] = useS4(!isMock && !!profile?.academyId);
  const teams = isMock && isSwimming
    ? [
        { id:'m1', name:'Grup A', ageGroup:'Grup A', players:['Efe Yıldız','Deniz Kaya','Elif Demir','Mert Kara'], coach:'Eğitmen Ahmet' },
        { id:'m2', name:'Grup B', ageGroup:'Grup B', players:['Zeynep Arslan','Lina Öz','Burak Aslan','Ada Şahin'], coach:'Eğitmen Selin' },
      ]
    : (isMock ? MOCK_TEAMS : realTeams);
  const [newTeamName,  setNewTeamName]  = useS4('');
  const [teamCreating, setTeamCreating] = useS4(false);
  const [teamError,    setTeamError]    = useS4('');
  const [assignTarget, setAssignTarget] = useS4(null);
  const [assignPlayer, setAssignPlayer] = useS4(null);
  const [assigning,    setAssigning]    = useS4(false);
  const [editingTeamId, setEditingTeamId] = useS4(null);
  const [editTeamName,  setEditTeamName]  = useS4('');
  const [teamActionLoading, setTeamActionLoading] = useS4('');
  const [teamActionError,   setTeamActionError]   = useS4('');
  const [teamActionErrorTeamId, setTeamActionErrorTeamId] = useS4(null);
  const [coachTeamSaving, setCoachTeamSaving] = useS4('');
  const [coachTeamError, setCoachTeamError] = useS4('');
  const [approvalDrafts, setApprovalDrafts] = useS4({});
  const [academyNameInput,  setAcademyNameInput]  = useS4(profile?.academyName || '');
  const [academySportType,  setAcademySportType]  = useS4(profile?.sportType || 'football');
  const [academyCreating,   setAcademyCreating]   = useS4(false);
  const [academyError,      setAcademyError]      = useS4('');
  const needsAcademySetup = !isMock &&
    (profile.role === 'admin' || profile.role === 'superAdmin') &&
    !profile.academyId;

  // ── Firestore listeners ────────────────────────────────────
  useE4(() => {
    if (isMock || !window.NX || needsAcademySetup) {
      if (needsAcademySetup) setTeamsLoading(false);
      return;
    }
    let pendingUnsub, usersUnsub;
    if (profile.role === 'superAdmin') {
      pendingUnsub = window.NX.onPendingUsers(users => setRealPending(users));
      usersUnsub   = window.NX.onAllApprovedUsers(users => setAllUsers(users));
    } else if (profile.academyId) {
      pendingUnsub = window.NX.onPendingUsersByAcademy(profile.academyId, profile.academyName, users => setRealPending(users));
      usersUnsub   = window.NX.onApprovedUsersByAcademy(profile.academyId, users => setAllUsers(users));
    }
    const teamsUnsub  = profile.academyId
      ? window.NX.onTeamsByAcademy(profile.academyId, ts => { setRealTeams(ts); setTeamsLoading(false); })
      : null;
    const invitesUnsub = (profile.academyId && window.NX.onAdminInvitesByAcademy)
      ? window.NX.onAdminInvitesByAcademy(profile.academyId, inv => setAdminInvites(inv))
      : null;
    return () => { pendingUnsub?.(); usersUnsub?.(); teamsUnsub?.(); invitesUnsub?.(); };
  }, [isMock, profile?.uid, profile?.academyId, needsAcademySetup]);

  // ── Admin management (Yöneticiler tab) ────────────────────
  const registeredAdmins = isMock ? [] : allUsers.filter(u => u.role === 'admin' && u.status === 'approved');

  const handleInviteAdmin = async () => {
    const email = adminInviteEmail.trim().toLowerCase();
    if (!email || !profile?.academyId) return;
    setAdminInviteLoading(true);
    setAdminInviteMsg(null);
    try {
      const existing = await window.NX.getUserByEmail(email);
      if (existing) {
        await window.NX.updateUserProfile(existing.uid, {
          role:        'admin',
          academyRole: 'admin',
          academyId:   profile.academyId,
          academyName: profile.academyName,
          sportType:   profile.sportType,
          status:      'approved',
        });
        setAdminInviteMsg({ type:'ok', text: say(`${email} yönetici yapıldı`, `${email} is now an admin`, `${email} теперь администратор`) });
      } else {
        await window.NX.createAdminInvite({
          email,
          academyId:   profile.academyId,
          academyName: profile.academyName,
          invitedBy:   profile.uid,
        });
        setAdminInviteMsg({ type:'ok', text: say(`${email} için davet oluşturuldu`, `Invite created for ${email}`, `Приглашение создано для ${email}`) });
      }
      setAdminInviteEmail('');
    } catch (e) {
      setAdminInviteMsg({ type:'err', text: say('İşlem başarısız', 'Operation failed', 'Ошибка операции') + (e?.code ? `: ${e.code}` : '') });
    } finally { setAdminInviteLoading(false); }
  };

  const handleRemoveAdmin = async (user) => {
    if (!isOwnerAdmin) return;
    if (user.academyRole === 'owner') {
      onToast && onToast({ msg: say('Sahip yönetici kaldırılamaz', 'Cannot remove owner admin', 'Нельзя удалить владельца') });
      return;
    }
    const confirmed = window.confirm(
      isTr ? `${user.displayName || user.email} yönetici erişimini kaldır?`
           : isRu ? `Убрать права администратора у ${user.displayName || user.email}?`
           : `Remove admin access for ${user.displayName || user.email}?`
    );
    if (!confirmed) return;
    try {
      await window.NX.updateUserProfile(user.uid, {
        academyId:   null,
        academyRole: null,
        status:      'pending',
      });
      onToast && onToast({ msg: say('Yönetici erişimi kaldırıldı', 'Admin access removed', 'Доступ администратора удалён') });
    } catch (e) {
      onToast && onToast({ msg: say('Hata oluştu', 'Error', 'Ошибка') + (e?.code ? `: ${e.code}` : '') });
    }
  };

  // ── Approve / Reject ───────────────────────────────────────
  const setApprovalDraft = (uid, patch) =>
    setApprovalDrafts(prev => ({ ...prev, [uid]: { ...(prev[uid] || {}), ...patch } }));

  const approvePending = async (user) => {
    if (isMock) { onToast && onToast({ msg: say('Demo: Onaylandı', 'Demo: Approved', 'Демо: одобрено') }); return; }
    const draft = approvalDrafts[user.uid] || {};
    const extra = { academyId: profile.academyId || user.academyId || null };
    if (profile.academyName || user.academyName) extra.academyName = profile.academyName || user.academyName;
    if (profile.sportType) extra.sportType = profile.sportType;

    if (user.role === 'player') {
      const team = teams.find(t => t.id === draft.teamId);
      const coach = registeredCoaches.find(c => c.uid === draft.coachUid);
      if (team) {
        extra.teamId = team.id;
        extra.teamName = team.name;
        extra.ageGroup = team.ageGroup || user.ageGroup || null;
      }
      if (coach) {
        extra.coachUid = coach.uid;
        extra.coachName = coach.displayName || coach.email || null;
      }
    }

    if (user.role === 'parent') {
      const player = registeredPlayers.find(p => p.uid === draft.playerUid);
      if (player) {
        extra.playerUid = player.uid;
        extra.linkedPlayerName = player.displayName || player.email || null;
      }
    }

    try {
      await window.NX.approveUser(user.uid, extra);
      setApprovalDrafts(prev => {
        const next = { ...prev };
        delete next[user.uid];
        return next;
      });
      onToast && onToast({ msg: say('Kullanıcı onaylandı', 'User approved', 'Пользователь одобрен'), code: say('Hesap aktif', 'Account active', 'Аккаунт активен') });
    } catch (e) {
      onToast && onToast({ msg: say('Hata oluştu', 'An error occurred', 'Произошла ошибка') });
    }
  };
  const rejectPending = async (uid) => {
    if (isMock) { onToast && onToast({ msg: say('Demo: Reddedildi', 'Demo: Rejected', 'Демо: отклонено') }); return; }
    try {
      await window.NX.rejectUser(uid);
      onToast && onToast({ msg: say('Kayıt reddedildi', 'Registration rejected', 'Заявка отклонена') });
    } catch (e) {
      onToast && onToast({ msg: say('Hata oluştu', 'An error occurred', 'Произошла ошибка') });
    }
  };

  const createAcademySetup = async () => {
    if (isMock || academyCreating) return;
    const name = academyNameInput.trim();
    setAcademyError('');
    if (!name) {
      setAcademyError(say('Akademi adını girin.', 'Enter an academy name.', 'Введите название академии.'));
      return;
    }
    setAcademyCreating(true);
    try {
      const { id: academyId, academyCode } = await window.NX.createAcademy(profile.uid, name, academySportType);
      const patch = { academyId, academyName: name, sportType: academySportType, academyCode, academyRole: 'owner' };
      await window.NX.updateUserProfile(profile.uid, patch);
      onProfileUpdate && onProfileUpdate(patch);
      setTeamsLoading(false);
      onToast && onToast({ msg: say('Akademi hazır', 'Academy is ready', 'Академия готова') });
    } catch (e) {
      const msg = e?.code
        ? `${say('Akademi oluşturulamadı', 'Academy could not be created', 'Не удалось создать академию')}: ${e.code}`
        : say('Akademi oluşturulamadı. Lütfen tekrar deneyin.', 'Academy could not be created. Please try again.', 'Не удалось создать академию. Попробуйте ещё раз.');
      setAcademyError(msg);
      onToast && onToast({ msg });
    } finally {
      setAcademyCreating(false);
    }
  };

  // ── Invite code generation ─────────────────────────────────
  const genCoach = async () => {
    if (!coachEmail.trim()) return;
    const code = 'COACH-' + Math.floor(1000 + Math.random()*9000);
    if (isMock) {
      setAllCodes(prev => [...prev, { code, type:'coach', email:coachEmail.trim(), status:'active', created: say('Bugün', 'Today', 'Сегодня') }]);
      setCoachEmail('');
      onToast && onToast({ msg: say('Demo: Davet oluşturuldu', 'Demo: Invite created', 'Демо: приглашение создано'), code });
      return;
    }
    if (!profile.academyId) {
      onToast && onToast({ msg: say('Önce akademi kurulumunu tamamlayın', 'Finish academy setup first', 'Сначала завершите настройку академии') });
      return;
    }
    setCoachLoading(true);
    try {
      await window.NX.createInviteCode({
        code, type:'coach', academyId: profile.academyId, createdBy: profile.uid, email: coachEmail.trim(),
      });
      setCoachEmail('');
      onToast && onToast({ msg: say(`${coachLabel} daveti oluşturuldu`, `${isSwimming ? 'Instructor' : 'Coach'} invite created`, `Приглашение для роли "${coachLabel}" создано`), code });
    } catch (e) {
      onToast && onToast({ msg: say('Hata', 'Error', 'Ошибка') });
    } finally { setCoachLoading(false); }
  };

  const revokeCode = async (code) => {
    if (isMock) {
      setAllCodes(prev => prev.filter(c => c.code !== code));
      onToast && onToast({ msg: say('İptal edildi', 'Revoked', 'Отозвано') });
      return;
    }
    try {
      await window.NX.revokeInviteCode(code);
      onToast && onToast({ msg: say('Davet iptal edildi', 'Invite revoked', 'Приглашение отозвано') });
    } catch (e) {
      onToast && onToast({ msg: say('Hata', 'Error', 'Ошибка') });
    }
  };

  const genParent = async () => {
    if (!selectedPlayer) return;
    const initials = selectedPlayer.displayName
      .split(' ').map(s => s[0]).join('').toUpperCase().replace(/[^A-Z]/g,'').slice(0,4);
    const code = `${initials || 'CHLD'}-${Math.floor(1000 + Math.random()*9000)}`;
    if (isMock) {
      setAllCodes(prev => [...prev, {
        code, type:'parent', playerName: selectedPlayer.displayName,
        status:'active', created: say('Bugün', 'Today', 'Сегодня'),
      }]);
      setSelectedPlayer(null); setParentEmail('');
      onToast && onToast({ msg: say('Demo: Kod oluşturuldu', 'Demo: Code created', 'Демо: код создан'), code });
      return;
    }
    if (!profile.academyId) {
      onToast && onToast({ msg: say('Önce akademi kurulumunu tamamlayın', 'Finish academy setup first', 'Сначала завершите настройку академии') });
      return;
    }
    setParentLoading(true);
    try {
      await window.NX.createInviteCode({
        code,
        type:        'parent',
        academyId:   profile.academyId,
        createdBy:   profile.uid,
        playerName:  selectedPlayer.displayName,
        playerUid:   selectedPlayer.uid,
        email:       parentEmail.trim() || null,
      });
      setSelectedPlayer(null); setParentEmail('');
      onToast && onToast({ msg: say('Veli kodu oluşturuldu', 'Parent code created', 'Код родителя создан'), code });
    } catch (e) {
      onToast && onToast({ msg: say('Hata', 'Error', 'Ошибка') });
    } finally { setParentLoading(false); }
  };

  const genPlayer = async () => {
    if (!playerInviteName.trim() || !profile.academyId) return;
    const initials = playerInviteName.trim().split(/\s+/).map(s => s[0]).join('').toUpperCase()
      .replace(/[^A-Z]/g,'').slice(0, 4) || 'PLAY';
    const code = `${initials}-${Math.floor(1000 + Math.random() * 9000)}`;
    setPlayerInviteLoading(true);
    try {
      await window.NX.createInviteCode({
        code,
        type:       'player',
        academyId:  profile.academyId,
        createdBy:  profile.uid,
        playerName: playerInviteName.trim(),
        teamId:     playerInviteTeam  || null,
        coachUid:   playerInviteCoach || null,
        email:      playerInviteEmail.trim() || null,
      });
      setPlayerInviteName(''); setPlayerInviteTeam('');
      setPlayerInviteCoach(''); setPlayerInviteEmail('');
      onToast && onToast({ msg: say(`${playerLabel} daveti oluşturuldu`, `${isSwimming ? 'Swimmer' : 'Player'} invite created`, `Приглашение для роли "${playerLabel}" создано`), code });
    } catch (e) {
      onToast && onToast({ msg: say('Hata', 'Error', 'Ошибка') });
    } finally { setPlayerInviteLoading(false); }
  };

  const genTeam = async () => {
    setTeamError('');
    if (!newTeamName.trim()) return;
    if (!profile.academyId) {
      const msg = say('Önce akademi kurulumunu tamamlayın.', 'Finish academy setup first.', 'Сначала завершите настройку академии.');
      setTeamError(msg);
      onToast && onToast({ msg });
      return;
    }
    setTeamCreating(true);
    try {
      const name = newTeamName.trim();
      const teamId = await window.NX.createTeam({
        name:      newTeamName.trim(),
        academyId: profile.academyId,
        adminUid:  profile.uid,
      });
      setRealTeams(prev => prev.some(t => t.id === teamId)
        ? prev.map(t => t.id === teamId ? { ...t, name, academyId: profile.academyId, adminUid: profile.uid } : t)
        : [{ id: teamId, name, academyId: profile.academyId, adminUid: profile.uid }, ...prev]);
      setTeamsLoading(false);
      setNewTeamName('');
      onToast && onToast({ msg: say(`${teamLabel} oluşturuldu`, `${isSwimming ? 'Group' : 'Team'} created`, `${teamLabel} создана`) });
    } catch (e) {
      const msg = e?.code
        ? `${say(`${teamLabel} oluşturulamadı`, `${isSwimming ? 'Group' : 'Team'} could not be created`, `${teamLabel} не создана`)}: ${e.code}`
        : say(`${teamLabel} oluşturulamadı. Lütfen tekrar deneyin.`, `${isSwimming ? 'Group' : 'Team'} could not be created. Please try again.`, `${teamLabel} не создана. Попробуйте ещё раз.`);
      setTeamError(msg);
      onToast && onToast({ msg });
    } finally { setTeamCreating(false); }
  };

  const doAssignPlayer = async (team) => {
    if (!assignPlayer) return;
    setTeamActionError('');
    setTeamActionErrorTeamId(null);
    setAssigning(true);
    try {
      const payload = {
        teamId:   team.id,
        teamName: team.name,
      };
      if (team.ageGroup) payload.ageGroup = team.ageGroup;
      await window.NX.assignPlayerToTeam(assignPlayer.uid, payload);
      setAllUsers(prev => prev.map(u => u.uid === assignPlayer.uid
        ? { ...u, teamId: team.id, teamName: team.name }
        : u));
      setAssignPlayer(null); setAssignTarget(null);
      onToast && onToast({ msg: say(`${playerLabel} ${teamLabel.toLowerCase()}a eklendi`, `${isSwimming ? 'Swimmer added to group' : 'Player added to team'}`, `${playerLabel} добавлен`) });
    } catch (e) {
      const msg = say(`${playerLabel} eklenemedi`, `${isSwimming ? 'Swimmer' : 'Player'} could not be added`, `${playerLabel} не добавлен`);
      setTeamActionError(e?.code ? `${msg}: ${e.code}` : msg);
      setTeamActionErrorTeamId(team.id);
      onToast && onToast({ msg });
    } finally { setAssigning(false); }
  };

  const startEditTeam = (team) => {
    setEditingTeamId(team.id);
    setEditTeamName(team.name || '');
    setAssignTarget(null);
    setAssignPlayer(null);
    setTeamActionError('');
    setTeamActionErrorTeamId(null);
  };

  const saveTeamName = async (team, teamPlayers = []) => {
    const name = editTeamName.trim();
    if (!name || teamActionLoading) return;
    setTeamActionError('');
    setTeamActionErrorTeamId(null);
    setTeamActionLoading(`rename:${team.id}`);
    try {
      await window.NX.updateTeam(team.id, { name });
      await Promise.all(teamPlayers.map(p =>
        window.NX.assignPlayerToTeam(p.uid, { teamId: team.id, teamName: name })
      ));
      setRealTeams(prev => prev.map(t => t.id === team.id ? { ...t, name } : t));
      setAllUsers(prev => prev.map(u => u.teamId === team.id ? { ...u, teamName: name } : u));
      onToast && onToast({ msg: say(`${teamLabel} güncellendi`, `${isSwimming ? 'Group' : 'Team'} updated`, `${teamLabel} обновлена`) });
    } catch (e) {
      const msg = say(`${teamLabel} adı güncellenemedi`, `${isSwimming ? 'Group' : 'Team'} name could not be updated`, `Название "${teamLabel}" не обновлено`);
      setTeamActionError(e?.code ? `${msg}: ${e.code}` : msg);
      setTeamActionErrorTeamId(team.id);
      onToast && onToast({ msg });
    } finally {
      setTeamActionLoading('');
    }
  };

  const removePlayerFromTeam = async (player) => {
    if (!player || teamActionLoading) return;
    setTeamActionError('');
    setTeamActionErrorTeamId(null);
    setTeamActionLoading(`remove:${player.uid}`);
    try {
      await window.NX.removePlayerFromTeam(player.uid);
      setAllUsers(prev => prev.map(u => u.uid === player.uid
        ? { ...u, teamId: null, teamName: null }
        : u));
      onToast && onToast({ msg: say(`${playerLabel} çıkarıldı`, `${isSwimming ? 'Swimmer' : 'Player'} removed`, `${playerLabel} удалён`) });
    } catch (e) {
      const msg = say(`${playerLabel} çıkarılamadı`, `${isSwimming ? 'Swimmer' : 'Player'} could not be removed`, `${playerLabel} не удалён`);
      setTeamActionError(e?.code ? `${msg}: ${e.code}` : msg);
      setTeamActionErrorTeamId(player.teamId || editingTeamId);
      onToast && onToast({ msg });
    } finally {
      setTeamActionLoading('');
    }
  };

  const deleteTeam = async (team, teamPlayers) => {
    if (teamActionLoading) return;
    setTeamActionError('');
    setTeamActionErrorTeamId(null);
    if (teamPlayers.length > 0) {
      const msg = isTr
        ? `Bu ${teamLabel.toLowerCase()}a bağlı ${playerLabelPl.toLowerCase()} var. Önce ${playerLabelPl.toLowerCase()}i çıkarın veya başka ${teamLabel.toLowerCase()}a taşıyın.`
        : isRu
        ? `В этой ${teamLabel.toLowerCase()} есть участники. Сначала удалите или переместите их.`
        : 'This team has assigned players. Remove or move them first.';
      setTeamActionError(msg);
      setTeamActionErrorTeamId(team.id);
      onToast && onToast({ msg });
      return;
    }
    const confirmed = window.confirm(isTr
      ? `${team.name} ${teamLabel.toLowerCase()}ını silmek istiyor musunuz?`
      : isRu
      ? `Удалить ${team.name}?`
      : `Delete ${team.name}?`);
    if (!confirmed) return;
    setTeamActionLoading(`delete:${team.id}`);
    try {
      await window.NX.deleteTeam(team.id);
      setRealTeams(prev => prev.filter(t => t.id !== team.id));
      if (editingTeamId === team.id) setEditingTeamId(null);
      onToast && onToast({ msg: say(`${teamLabel} silindi`, `${isSwimming ? 'Group' : 'Team'} deleted`, `${teamLabel} удалена`) });
    } catch (e) {
      const msg = say(`${teamLabel} silinemedi`, `${isSwimming ? 'Group' : 'Team'} could not be deleted`, `${teamLabel} не удалена`);
      setTeamActionError(e?.code ? `${msg}: ${e.code}` : msg);
      setTeamActionErrorTeamId(team.id);
      onToast && onToast({ msg });
    } finally {
      setTeamActionLoading('');
    }
  };

  const toggleCoachTeam = async (coach, team) => {
    if (isMock || !window.NX?.updateUserProfile) return;
    setCoachTeamError('');
    setCoachTeamSaving(`${coach.uid}:${team.id}`);
    const currentIds = Array.isArray(coach.assignedTeamIds) ? coach.assignedTeamIds : [];
    const hasTeam = currentIds.includes(team.id);
    const nextIds = hasTeam ? currentIds.filter(id => id !== team.id) : [...currentIds, team.id];
    const nextNames = nextIds
      .map(id => realTeams.find(t => t.id === id)?.name)
      .filter(Boolean);
    try {
      await window.NX.updateUserProfile(coach.uid, {
        assignedTeamIds: nextIds,
        assignedTeamNames: nextNames,
      });
      setAllUsers(prev => prev.map(u => u.uid === coach.uid
        ? { ...u, assignedTeamIds: nextIds, assignedTeamNames: nextNames }
        : u));
      onToast && onToast({ msg: say(`${coachLabel} ${teamLabelPl.toLowerCase()} güncellendi`, `${isSwimming ? 'Instructor groups' : 'Coach teams'} updated`, `${coachLabel}: ${teamLabelPl.toLowerCase()} обновлены`) });
    } catch (e) {
      console.error('[NX] coach team assignment failed:', e?.code, e?.message);
      setCoachTeamError(e?.code
        ? `${say(`${coachLabel} ${teamLabelPl.toLowerCase()} güncellenemedi`, `${isSwimming ? 'Instructor groups' : 'Coach teams'} could not be updated`, `${coachLabel}: ${teamLabelPl.toLowerCase()} не обновлены`)}: ${e.code}`
        : say(`${coachLabel} ${teamLabelPl.toLowerCase()} güncellenemedi.`, `${isSwimming ? 'Instructor groups' : 'Coach teams'} could not be updated.`, `${coachLabel}: ${teamLabelPl.toLowerCase()} не обновлены.`));
    } finally {
      setCoachTeamSaving('');
    }
  };

  const renderPendingUser = (p) => {
    const roleColors = { player:'#00FF88', coach:'#FFB800', parent:'#4F8DFF', admin:'#B26BFF', superAdmin:'#B26BFF' };
    const roleLabels = { player: playerLabel, coach: coachLabel, parent: say('Veli', 'Parent', 'Родитель'), admin: say('Admin', 'Admin', 'Админ'), superAdmin:'Super Admin' };
    const accent = roleColors[p.role] || '#7A7A7A';
    const initials = (p.displayName || p.email || '?').split(' ').map(s=>s[0]).join('').slice(0,2).toUpperCase();
    const draft = approvalDrafts[p.uid] || {};
    return (
      <Card key={p.uid} style={{ padding: 14 }}>
        <div style={{ display:'flex', alignItems:'flex-start', gap: 12 }}>
	          <Avatar initials={initials} size={40} avatarId={p.role === 'coach' ? 'coach' : p.avatarId}/>
          <div style={{ flex: 1, minWidth: 0 }}>
            <div style={{ display:'flex', alignItems:'center', gap: 8, flexWrap:'wrap' }}>
              <span style={{ fontFamily:'Manrope', fontWeight: 700, fontSize: 14, color:'#fff' }}>
                {p.displayName || '—'}
              </span>
              <span style={{ fontFamily:'JetBrains Mono', fontSize: 9,
                color: accent, padding:'2px 7px', borderRadius: 999,
                border:`1px solid ${accent}40`, background:`${accent}10`,
                letterSpacing:'0.10em', textTransform:'uppercase' }}>
                {roleLabels[p.role] || p.role}
              </span>
            </div>
            <div style={{ fontFamily:'Manrope', fontSize: 11, color:'#B8B8B8', marginTop: 3 }}>
              {p.email}
            </div>
            {(p.role === 'player' || p.role === 'coach') && (p.positionLabel || p.position || p.ageGroup) && (
              <div style={{ fontFamily:'JetBrains Mono', fontSize: 10, color:'#7A7A7A', marginTop: 4 }}>
                {[p.positionLabel || p.position, p.ageGroup].filter(Boolean).join(' · ')}
              </div>
            )}
            {p.role === 'player' && p.parentFullName && (
              <div style={{ fontFamily:'Manrope', fontSize: 11, color:'#7A7A7A', marginTop: 3 }}>
                {say('Veli/vası:', 'Parent/guardian:', 'Родитель/опекун:')} {p.parentFullName}
              </div>
            )}
            {p.role === 'player' && (p.dateOfBirth || p.calculatedAge != null) && (
              <div style={{ fontFamily:'Manrope', fontSize: 11, color:'#5A5A5A', marginTop: 3 }}>
                {[
                  p.dateOfBirth && say(`Doğum: ${p.dateOfBirth}`, `DOB: ${p.dateOfBirth}`, `Дата рождения: ${p.dateOfBirth}`),
                  p.calculatedAge != null && say(`Yaş: ${p.calculatedAge}`, `Age: ${p.calculatedAge}`, `Возраст: ${p.calculatedAge}`),
                ].filter(Boolean).join(' · ')}
              </div>
            )}
            {p.role === 'admin' && p.academyName && (
              <div style={{ fontFamily:'Manrope', fontWeight: 600, fontSize: 12,
                color:'#B26BFF', marginTop: 4 }}>
                {p.academyName}
              </div>
            )}
            {p.role === 'admin' && p.reason && (
              <div style={{ fontFamily:'Manrope', fontSize: 11, color:'#7A7A7A',
                marginTop: 3, lineHeight: 1.4 }}>
                {p.reason}
              </div>
            )}
            {p.phone && (
              <div style={{ fontFamily:'Manrope', fontSize: 11, color:'#5A5A5A', marginTop: 3 }}>
                {p.phone}
              </div>
            )}
            {(p.childFullName || p.requestedChildName) && (
              <div style={{ fontFamily:'Manrope', fontSize: 11, color:'#4F8DFF', marginTop: 3 }}>
                {say('Çocuk isteği:', 'Requested child:', 'Запрошенный ребёнок:')} {p.childFullName || p.requestedChildName}
                {p.childPositionLabel ? ` · ${p.childPositionLabel}` : ''}
              </div>
            )}
            {p.role === 'parent' && (p.childDateOfBirth || p.childCalculatedAge != null) && (
              <div style={{ fontFamily:'Manrope', fontSize: 11, color:'#5A5A5A', marginTop: 3 }}>
                {[
                  p.childDateOfBirth && say(`Çocuk doğum: ${p.childDateOfBirth}`, `Child DOB: ${p.childDateOfBirth}`, `Дата рождения ребёнка: ${p.childDateOfBirth}`),
                  p.childCalculatedAge != null && say(`Çocuk yaşı: ${p.childCalculatedAge}`, `Child age: ${p.childCalculatedAge}`, `Возраст ребёнка: ${p.childCalculatedAge}`),
                ].filter(Boolean).join(' · ')}
              </div>
            )}
          </div>
        </div>
        {p.role === 'player' && (
          <div style={{ marginTop:12, display:'grid', gridTemplateColumns:'1fr 1fr', gap:8 }}>
            <select value={draft.teamId || ''}
              onChange={e => setApprovalDraft(p.uid, { teamId:e.target.value })}
              style={{ minWidth:0, background:'#1C1C1C',
                border:'1px solid rgba(255,255,255,0.10)', borderRadius:10,
                padding:'9px 10px', color:draft.teamId ? '#fff' : '#5A5A5A',
                fontFamily:'Manrope', fontSize:12 }}>
              <option value="">{say(`${teamLabel} seç`, 'Select team', `Выберите: ${teamLabel}`)}</option>
              {teams.map(t => (
                <option key={t.id} value={t.id}>{t.name}</option>
              ))}
            </select>
            <select value={draft.coachUid || ''}
              onChange={e => setApprovalDraft(p.uid, { coachUid:e.target.value })}
              style={{ minWidth:0, background:'#1C1C1C',
                border:'1px solid rgba(255,255,255,0.10)', borderRadius:10,
                padding:'9px 10px', color:draft.coachUid ? '#fff' : '#5A5A5A',
                fontFamily:'Manrope', fontSize:12 }}>
              <option value="">{say(`${coachLabel} seç`, 'Select coach', `Выберите: ${coachLabel}`)}</option>
              {registeredCoaches.map(c => (
                <option key={c.uid} value={c.uid}>{c.displayName || c.email}</option>
              ))}
            </select>
          </div>
        )}
        {p.role === 'parent' && (
          <div style={{ marginTop:12 }}>
            <select value={draft.playerUid || ''}
              onChange={e => setApprovalDraft(p.uid, { playerUid:e.target.value })}
              style={{ width:'100%', background:'#1C1C1C',
                border:'1px solid rgba(79,141,255,0.22)', borderRadius:10,
                padding:'9px 10px', color:draft.playerUid ? '#fff' : '#5A5A5A',
                fontFamily:'Manrope', fontSize:12 }}>
              <option value="">{say(`Bağlanacak ${playerLabel.toLowerCase()} seç`, 'Select child/player to link', 'Выберите ребёнка/спортсмена для привязки')}</option>
              {registeredPlayers.map(player => (
                <option key={player.uid} value={player.uid}>{player.displayName || player.email}</option>
              ))}
            </select>
          </div>
        )}
        <div style={{ display:'flex', gap: 8, marginTop: 12 }}>
          <button onClick={() => rejectPending(p.uid)} style={{
            flex: 1, padding:'10px', borderRadius: 10, cursor:'pointer',
            background:'rgba(255,77,77,0.06)', border:'1px solid rgba(255,77,77,0.25)',
            color:'#FF6B6B', fontFamily:'Manrope', fontWeight: 700, fontSize: 12,
            letterSpacing:'0.08em', textTransform:'uppercase' }}>
            {say('Reddet', 'Reject', 'Отклонить')}
          </button>
          <button onClick={() => approvePending(p)} style={{
            flex: 2, padding:'10px', borderRadius: 10, cursor:'pointer',
            background:'rgba(0,255,136,0.10)', border:'1px solid rgba(0,255,136,0.40)',
            color:'#00FF88', fontFamily:'Manrope', fontWeight: 700, fontSize: 12,
            letterSpacing:'0.08em', textTransform:'uppercase' }}>
            {say('✓ Onayla', '✓ Approve', '✓ Одобрить')}
          </button>
        </div>
      </Card>
    );
  };

  const TABS = [
    ['pending',  say('Onaylar', 'Approvals', 'Одобрения'),              pendingAdmins.length],
    ['coaches',  coachLabelPl,                                          pendingCoaches.length],
    ['parents',  isRu?'Родители':isTr?'Veliler':'Parents',              pendingParents.length],
    ['players',  playerLabelPl,                                         pendingPlayers.length],
    ['teams',    teamLabelPl,                                           null],
    ['managers', isRu?'Администраторы':isTr?'Yöneticiler':'Managers',  null],
  ];

  return (
    <div style={{ display:'flex', flexDirection:'column', height:'100%', background: sportTh?.bg1 || '#0B0B0B' }}>

      {/* Header — admin has its own top bar */}
      <div style={{ padding:'68px 20px 12px', borderBottom:'1px solid rgba(255,255,255,0.06)' }}>
        <div style={{ display:'flex', alignItems:'center', justifyContent:'space-between', marginBottom: 4 }}>
          <div style={{ display:'flex', alignItems:'center', gap: 8 }}>
            <BrandMark size={26}/>
            <span style={{ fontFamily:'Manrope', fontWeight: 800, fontSize: 11,
              letterSpacing:'0.18em', textTransform:'uppercase', color:'#fff' }}>ATHLORYX</span>
            <span style={{ fontFamily:'JetBrains Mono', fontSize: 10, color:'#B26BFF',
              padding:'2px 7px', borderRadius: 999,
              border:'1px solid rgba(178,107,255,0.30)', background:'rgba(178,107,255,0.08)' }}>
              ADMIN
            </span>
          </div>
          {onSettings && (
            <button onClick={onSettings} style={{
              width: 32, height: 32, borderRadius: 999, cursor:'pointer',
              background:'#1C1C1C', border:'1px solid rgba(255,255,255,0.06)',
              color:'#fff', display:'flex', alignItems:'center', justifyContent:'center',
              flexShrink: 0 }}>
              <Ico name="cog" size={16}/>
            </button>
          )}
        </div>
        <h1 style={{ fontFamily:'Oswald', fontWeight: 700, fontSize: 24, lineHeight: 1.0,
          textTransform:'uppercase', letterSpacing:'0.02em', color:'#fff', margin:'6px 0 0' }}>
          {isRu ? 'Управление академией' : isTr ? 'Akademi yönetimi' : 'Academy admin'}
        </h1>
        {/* Summary pills */}
        <div style={{ display:'flex', gap: 8, marginTop: 10 }}>
          {[
            [pending.length,             isRu?'Ожидают':isTr?'Bekleyen':'Pending',       isSwimming ? '#38E8FF' : '#FFB800'],
            [registeredCoaches.length,   coachLabelPl,                    isSwimming ? '#38E8FF' : '#00FF88'],
            [registeredParents.length,   isRu?'Родители':isTr?'Veli':'Parents',           '#4F8DFF'],
            [teams.length,               teamLabelPl,                     '#B26BFF'],
          ].map(([n,l,c]) => (
            <div key={l} style={{ padding:'4px 10px', borderRadius: 999,
              background:`${c}10`, border:`1px solid ${c}30` }}>
              <span style={{ fontFamily:'Oswald', fontWeight: 700, fontSize: 14, color: c }}>{n}</span>
              <span style={{ fontFamily:'Manrope', fontWeight: 700, fontSize: 9,
                letterSpacing:'0.12em', textTransform:'uppercase', color:'#7A7A7A', marginLeft: 5 }}>{l}</span>
            </div>
          ))}
        </div>
      </div>

      {/* Tabs */}
      {!needsAcademySetup && (
      <div style={{ display:'flex', borderBottom:'1px solid rgba(255,255,255,0.06)',
        background:'#0B0B0B', flexShrink: 0 }}>
        {TABS.map(([k,l,badge]) => (
          <button key={k} onClick={() => setTab(k)} style={{
            flex: 1, padding:'10px 6px', background:'transparent', border:'none', cursor:'pointer',
            fontFamily:'Manrope', fontWeight: 700, fontSize: 10,
            letterSpacing:'0.10em', textTransform:'uppercase',
            color: tab===k ? '#fff' : '#7A7A7A', position:'relative',
          }}>
            {l}
            {badge > 0 && (
              <span style={{ marginLeft: 4, fontFamily:'Oswald', fontWeight: 700, fontSize: 11,
                color:'#FFB800', verticalAlign:'middle' }}>{badge}</span>
            )}
            {tab===k && <span style={{ position:'absolute', bottom: 0, left: '20%', right: '20%',
              height: 2, background:'#B26BFF', borderRadius: 2 }}/>}
          </button>
        ))}
      </div>
      )}

      {/* Body */}
      <div className="nxt-scroll" style={{ flex: 1, padding: 16 }}>
        {needsAcademySetup && (
          <div style={{ display:'flex', flexDirection:'column', gap:14 }}>
            <Card style={{ padding:16 }}>
              <div style={{ width:42, height:42, borderRadius:12,
                background:'rgba(178,107,255,0.10)', border:'1px solid rgba(178,107,255,0.30)',
                display:'flex', alignItems:'center', justifyContent:'center', marginBottom:14 }}>
                <Ico name="shield" size={22} style={{ color:'#B26BFF' }}/>
              </div>
              <div style={{ fontFamily:'Oswald', fontWeight:700, fontSize:22,
                textTransform:'uppercase', letterSpacing:'0.02em', color:'#fff', marginBottom:6 }}>
                {isRu ? 'Настройте академию' : isTr ? 'Akademini kur' : 'Set up your academy'}
              </div>
              <div style={{ fontFamily:'Manrope', fontSize:13, lineHeight:1.5,
                color:'#7A7A7A', marginBottom:14 }}>
                {isRu
                  ? (academySportType === 'swimming'
                    ? 'Группы, пловцы, инструкторы и связи с родителями будут управляться в этом рабочем пространстве.'
                    : 'Команды, спортсмены, тренеры и связи с родителями будут управляться в этом рабочем пространстве.')
                  : isTr
                  ? (academySportType === 'swimming'
                    ? 'Gruplar, yüzücüler, antrenörler ve veli bağlantıları bu çalışma alanında yönetilecek.'
                    : 'Takımlar, oyuncular, koçlar ve veli bağlantıları bu çalışma alanında yönetilecek.')
                  : 'Teams, players, coaches, and parent links will be managed inside this workspace.'}
              </div>
              <div style={{ marginBottom:14 }}>
                <div style={{ fontFamily:'JetBrains Mono', fontSize:8, color:'#7A7A7A',
                  letterSpacing:'0.12em', textTransform:'uppercase', marginBottom:8 }}>
                  {isRu ? 'Какой вид спорта у вашей академии?' : isTr ? 'Spor okulun hangi branşta?' : 'What sport is your academy?'}
                </div>
                <div style={{ display:'grid', gridTemplateColumns:'1fr 1fr', gap:8 }}>
                  {[['football', isRu?'Футбольная академия':isTr?'Futbol Okulu':'Football Academy', '#00FF88'], ['swimming', isRu?'Академия плавания':isTr?'Yüzme Okulu':'Swimming Academy', '#38E8FF']].map(([type, label, color]) => {
                    const on = academySportType === type;
                    return (
                      <button key={type} onClick={() => setAcademySportType(type)} style={{
                        padding:'12px 14px', borderRadius:10, cursor:'pointer',
                        background: on ? `${color}10` : '#141414',
                        border:`1px solid ${on ? `${color}55` : 'rgba(255,255,255,0.06)'}`,
                        color: on ? color : '#7A7A7A',
                        fontFamily:'Manrope', fontWeight:700, fontSize:13, textAlign:'left',
                      }}>{label}</button>
                    );
                  })}
                </div>
              </div>
              <input value={academyNameInput}
                onChange={e => { setAcademyNameInput(e.target.value); setAcademyError(''); }}
                placeholder={isRu ? 'Название академии' : isTr ? 'Akademi adı' : 'Academy name'}
                style={{ width:'100%', boxSizing:'border-box',
                  background:'#0B0B0B', border:'1px solid rgba(178,107,255,0.25)',
                  borderRadius:10, padding:'12px 14px',
                  fontFamily:'Manrope', fontWeight:600, fontSize:16,
                  color:'#fff', outline:'none', marginBottom:10 }}/>
              {academyError && (
                <div style={{ padding:'8px 10px', borderRadius:8, marginBottom:10,
                  background:'rgba(255,77,77,0.08)', border:'1px solid rgba(255,77,77,0.24)',
                  color:'#FF6B6B', fontFamily:'Manrope', fontSize:12, lineHeight:1.35 }}>
                  {academyError}
                </div>
              )}
              <Button kind="primary" full size="md"
                disabled={!academyNameInput.trim() || academyCreating}
                onClick={createAcademySetup}>
                {academyCreating
                  ? (isRu ? 'Создание…' : isTr ? 'Oluşturuluyor…' : 'Creating…')
                  : (isRu ? 'Создать академию' : isTr ? 'Akademi oluştur' : 'Create academy')}
              </Button>
            </Card>
          </div>
        )}

        {/* ── PENDING APPROVALS ── */}
        {!needsAcademySetup && tab === 'pending' && (
          <div style={{ display:'flex', flexDirection:'column', gap: 10 }}>
            {pendingAdmins.length === 0 ? (
              <div style={{ textAlign:'center', padding: 40 }}>
                <Ico name="check" size={32} style={{ color:'#00FF88', margin:'0 auto 12px' }}/>
                <div style={{ fontFamily:'Manrope', fontSize: 14, color:'#7A7A7A' }}>
                  {isRu ? 'Нет ожидающих заявок администраторов' : isTr ? 'Bekleyen admin başvurusu yok' : 'No pending admin requests'}
                </div>
              </div>
            ) : pendingAdmins.map(p => {
              const roleColors = { player:'#00FF88', coach:'#FFB800', parent:'#4F8DFF', admin:'#B26BFF', superAdmin:'#B26BFF' };
              const roleLabels = { player: playerLabel, coach: coachLabel, parent: isRu?'Родитель':isTr?'Veli':'Parent', admin:'Admin', superAdmin:'Super Admin' };
              const accent = roleColors[p.role] || '#7A7A7A';
              const initials = (p.displayName || p.email || '?').split(' ').map(s=>s[0]).join('').slice(0,2).toUpperCase();
              const draft = approvalDrafts[p.uid] || {};
              return (
                <Card key={p.uid} style={{ padding: 14 }}>
                  <div style={{ display:'flex', alignItems:'flex-start', gap: 12 }}>
                    <Avatar initials={initials} size={40}/>
                    <div style={{ flex: 1, minWidth: 0 }}>
                      {/* Name + role badge */}
                      <div style={{ display:'flex', alignItems:'center', gap: 8, flexWrap:'wrap' }}>
                        <span style={{ fontFamily:'Manrope', fontWeight: 700, fontSize: 14, color:'#fff' }}>
                          {p.displayName || '—'}
                        </span>
                        <span style={{ fontFamily:'JetBrains Mono', fontSize: 9,
                          color: accent, padding:'2px 7px', borderRadius: 999,
                          border:`1px solid ${accent}40`, background:`${accent}10`,
                          letterSpacing:'0.10em', textTransform:'uppercase' }}>
                          {roleLabels[p.role] || p.role}
                        </span>
                      </div>
                      {/* Email */}
                      <div style={{ fontFamily:'Manrope', fontSize: 11, color:'#B8B8B8', marginTop: 3 }}>
                        {p.email}
                      </div>
                      {/* Role-specific details */}
                      {(p.role === 'player' || p.role === 'coach') && (p.positionLabel || p.position || p.ageGroup) && (
                        <div style={{ fontFamily:'JetBrains Mono', fontSize: 10, color:'#7A7A7A', marginTop: 4 }}>
                          {[p.positionLabel || p.position, p.ageGroup].filter(Boolean).join(' · ')}
                        </div>
                      )}
                      {p.role === 'player' && p.parentFullName && (
                        <div style={{ fontFamily:'Manrope', fontSize: 11, color:'#7A7A7A', marginTop: 3 }}>
                          {isRu ? 'Родитель/опекун:' : isTr ? 'Veli/vası:' : 'Parent/guardian:'} {p.parentFullName}
                        </div>
                      )}
                      {p.role === 'player' && (p.dateOfBirth || p.calculatedAge != null) && (
                        <div style={{ fontFamily:'Manrope', fontSize: 11, color:'#5A5A5A', marginTop: 3 }}>
                          {[
                            p.dateOfBirth && (isRu ? `Дата рождения: ${p.dateOfBirth}` : isTr ? `Doğum: ${p.dateOfBirth}` : `DOB: ${p.dateOfBirth}`),
                            p.calculatedAge != null && (isRu ? `Возраст: ${p.calculatedAge}` : isTr ? `Yaş: ${p.calculatedAge}` : `Age: ${p.calculatedAge}`),
                          ].filter(Boolean).join(' · ')}
                        </div>
                      )}
                      {p.role === 'admin' && p.academyName && (
                        <div style={{ fontFamily:'Manrope', fontWeight: 600, fontSize: 12,
                          color:'#B26BFF', marginTop: 4 }}>
                          {p.academyName}
                        </div>
                      )}
                      {p.role === 'admin' && p.reason && (
                        <div style={{ fontFamily:'Manrope', fontSize: 11, color:'#7A7A7A',
                          marginTop: 3, lineHeight: 1.4 }}>
                          {p.reason}
                        </div>
                      )}
                      {p.phone && (
                        <div style={{ fontFamily:'Manrope', fontSize: 11, color:'#5A5A5A', marginTop: 3 }}>
                          {p.phone}
                        </div>
                      )}
                      {(p.childFullName || p.requestedChildName) && (
                        <div style={{ fontFamily:'Manrope', fontSize: 11, color:'#4F8DFF', marginTop: 3 }}>
                          {isRu ? 'Запрошенный ребёнок:' : isTr ? 'Çocuk isteği:' : 'Requested child:'} {p.childFullName || p.requestedChildName}
                          {p.childPositionLabel ? ` · ${p.childPositionLabel}` : ''}
                        </div>
                      )}
                      {p.role === 'parent' && (p.childDateOfBirth || p.childCalculatedAge != null) && (
                        <div style={{ fontFamily:'Manrope', fontSize: 11, color:'#5A5A5A', marginTop: 3 }}>
                          {[
                            p.childDateOfBirth && (isRu ? `Дата рождения ребёнка: ${p.childDateOfBirth}` : isTr ? `Çocuk doğum: ${p.childDateOfBirth}` : `Child DOB: ${p.childDateOfBirth}`),
                            p.childCalculatedAge != null && (isRu ? `Возраст ребёнка: ${p.childCalculatedAge}` : isTr ? `Çocuk yaşı: ${p.childCalculatedAge}` : `Child age: ${p.childCalculatedAge}`),
                          ].filter(Boolean).join(' · ')}
                        </div>
                      )}
                    </div>
                  </div>
                  {p.role === 'player' && (
                    <div style={{ marginTop:12, display:'grid', gridTemplateColumns:'1fr 1fr', gap:8 }}>
                      <select value={draft.teamId || ''}
                        onChange={e => setApprovalDraft(p.uid, { teamId:e.target.value })}
                        style={{ minWidth:0, background:'#1C1C1C',
                          border:'1px solid rgba(255,255,255,0.10)', borderRadius:10,
                          padding:'9px 10px', color:draft.teamId ? '#fff' : '#5A5A5A',
                          fontFamily:'Manrope', fontSize:12 }}>
                        <option value="">{isRu ? `Выберите: ${teamLabel.toLowerCase()}` : isTr ? `${teamLabel} seç` : 'Select team'}</option>
                        {teams.map(t => (
                          <option key={t.id} value={t.id}>{t.name}</option>
                        ))}
                      </select>
                      <select value={draft.coachUid || ''}
                        onChange={e => setApprovalDraft(p.uid, { coachUid:e.target.value })}
                        style={{ minWidth:0, background:'#1C1C1C',
                          border:'1px solid rgba(255,255,255,0.10)', borderRadius:10,
                          padding:'9px 10px', color:draft.coachUid ? '#fff' : '#5A5A5A',
                          fontFamily:'Manrope', fontSize:12 }}>
                        <option value="">{isRu ? `Выберите: ${coachLabel.toLowerCase()}а` : isTr ? `${coachLabel} seç` : 'Select coach'}</option>
                        {registeredCoaches.map(c => (
                          <option key={c.uid} value={c.uid}>{c.displayName || c.email}</option>
                        ))}
                      </select>
                    </div>
                  )}
                  {p.role === 'parent' && (
                    <div style={{ marginTop:12 }}>
                      <select value={draft.playerUid || ''}
                        onChange={e => setApprovalDraft(p.uid, { playerUid:e.target.value })}
                        style={{ width:'100%', background:'#1C1C1C',
                          border:'1px solid rgba(79,141,255,0.22)', borderRadius:10,
                          padding:'9px 10px', color:draft.playerUid ? '#fff' : '#5A5A5A',
                          fontFamily:'Manrope', fontSize:12 }}>
                        <option value="">{isRu ? 'Выберите ребёнка/спортсмена для связи' : isTr ? `Bağlanacak ${playerLabel.toLowerCase()} seç` : 'Select child/player to link'}</option>
                        {registeredPlayers.map(player => (
                          <option key={player.uid} value={player.uid}>{player.displayName || player.email}</option>
                        ))}
                      </select>
                    </div>
                  )}
                  <div style={{ display:'flex', gap: 8, marginTop: 12 }}>
                    <button onClick={() => rejectPending(p.uid)} style={{
                      flex: 1, padding:'10px', borderRadius: 10, cursor:'pointer',
                      background:'rgba(255,77,77,0.06)', border:'1px solid rgba(255,77,77,0.25)',
                      color:'#FF6B6B', fontFamily:'Manrope', fontWeight: 700, fontSize: 12,
                      letterSpacing:'0.08em', textTransform:'uppercase' }}>
                      {isRu ? 'Отклонить' : isTr ? 'Reddet' : 'Reject'}
                    </button>
                    <button onClick={() => approvePending(p)} style={{
                      flex: 2, padding:'10px', borderRadius: 10, cursor:'pointer',
                      background:'rgba(0,255,136,0.10)', border:'1px solid rgba(0,255,136,0.40)',
                      color:'#00FF88', fontFamily:'Manrope', fontWeight: 700, fontSize: 12,
                      letterSpacing:'0.08em', textTransform:'uppercase' }}>
                      {isRu ? '✓ Одобрить' : isTr ? '✓ Onayla' : '✓ Approve'}
                    </button>
                  </div>
                </Card>
              );
            })}
          </div>
        )}

        {/* ── COACHES ── */}
        {!needsAcademySetup && tab === 'coaches' && (
          <div style={{ display:'flex', flexDirection:'column', gap: 12 }}>
            {pendingCoaches.length > 0 && (
              <>
                <Label>{isRu ? `Ожидающие заявки: ${coachLabelPl.toLowerCase()}` : isTr ? `Bekleyen ${coachLabel.toLowerCase()} kayıtları` : 'Pending coach requests'}</Label>
                {pendingCoaches.map(renderPendingUser)}
                <div style={{ height:1, background:'rgba(255,255,255,0.06)' }}/>
              </>
            )}
            {registeredCoaches.length > 0 && (
              <>
                <Label>{isRu ? `Зарегистрированные ${coachLabelPl.toLowerCase()}` : isTr ? `Kayıtlı ${coachLabelPl.toLowerCase()}` : 'Registered coaches'}</Label>
	                {registeredCoaches.map(u => {
	                  const ini = (u.displayName || u.email || '?').split(' ').map(s=>s[0]).join('').slice(0,2).toUpperCase();
	                  const assignedIds = Array.isArray(u.assignedTeamIds) ? u.assignedTeamIds : [];
	                  return (
	                    <Card key={u.uid} style={{ padding: 12 }}>
	                      <div style={{ display:'flex', alignItems:'center', gap: 12 }}>
                        <Avatar initials={ini} size={36} avatarId="coach"/>
                        <div style={{ flex: 1, minWidth: 0 }}>
                          <div style={{ fontFamily:'Manrope', fontWeight:700, fontSize:13, color:'#fff' }}>
                            {u.displayName || '—'}
                          </div>
                          <div style={{ fontFamily:'Manrope', fontSize:11, color:'#7A7A7A', marginTop:2,
                            overflow:'hidden', textOverflow:'ellipsis', whiteSpace:'nowrap' }}>
                            {u.email || '—'}
                          </div>
                        </div>
                        <span style={{ fontFamily:'JetBrains Mono', fontSize:9, color:isSwimming ? 'var(--nx-accent)' : '#FFB800',
                          padding:'2px 7px', borderRadius:999,
                          border:isSwimming ? '1px solid var(--nx-accent-glow)' : '1px solid rgba(255,184,0,0.30)', background:isSwimming ? 'var(--nx-accent-soft)' : 'rgba(255,184,0,0.08)',
                          letterSpacing:'0.10em', textTransform:'uppercase', flexShrink:0 }}>
	                          {isTr ? coachLabel.toUpperCase() : coachLabel.toUpperCase()}
	                        </span>
	                      </div>
	                      <div style={{ marginTop:12, paddingTop:10, borderTop:'1px solid rgba(255,255,255,0.06)' }}>
	                        <Label style={{ display:'block', marginBottom:8 }}>
	                          {isRu ? `Назначенные ${teamLabelPl.toLowerCase()}` : isTr ? `Atanan ${teamLabelPl.toLowerCase()}` : 'Assigned teams'}
	                        </Label>
	                        {coachTeamError && (
	                          <div style={{ padding:'8px 10px', borderRadius:8, marginBottom:8,
	                            background:'rgba(255,77,77,0.08)', border:'1px solid rgba(255,77,77,0.24)',
	                            color:'#FF6B6B', fontFamily:'Manrope', fontSize:12, lineHeight:1.35 }}>
	                            {coachTeamError}
	                          </div>
	                        )}
	                        {realTeams.length === 0 ? (
	                          <div style={{ fontFamily:'Manrope', fontSize:12, color:'#5A5A5A' }}>
	                            {isRu ? `Сначала создайте ${teamLabel.toLowerCase()}у.` : isTr ? 'Önce takım oluşturun.' : 'Create teams first.'}
	                          </div>
	                        ) : (
	                          <div style={{ display:'flex', gap:6, flexWrap:'wrap' }}>
	                            {realTeams.map(t => {
	                              const selected = assignedIds.includes(t.id);
	                              const loading = coachTeamSaving === `${u.uid}:${t.id}`;
	                              return (
	                                <button key={t.id} onClick={() => toggleCoachTeam(u, t)} disabled={!!coachTeamSaving}
	                                  style={{
	                                    borderRadius:999, padding:'7px 10px',
	                                    cursor:coachTeamSaving ? 'not-allowed' : 'pointer',
	                                    background:selected ? 'var(--nx-accent-soft)' : '#1C1C1C',
	                                    border:`1px solid ${selected ? 'var(--nx-accent-glow)' : 'rgba(255,255,255,0.08)'}`,
	                                    color:selected ? 'var(--nx-accent)' : '#B8B8B8',
	                                    fontFamily:'Manrope', fontWeight:800, fontSize:10,
	                                    letterSpacing:'0.08em', textTransform:'uppercase',
	                                    opacity:loading ? 0.45 : 1,
	                                  }}>
	                                  {loading ? '…' : t.name}
	                                </button>
	                              );
	                            })}
	                          </div>
	                        )}
	                      </div>
	                    </Card>
	                  );
	                })}
                <div style={{ height:1, background:'rgba(255,255,255,0.06)' }}/>
              </>
            )}
            {pendingCoaches.length === 0 && registeredCoaches.length === 0 && (
              <div style={{ textAlign:'center', padding:'28px 0',
                fontFamily:'Manrope', fontSize:13, color:'#5A5A5A' }}>
                {isRu ? `Пока нет регистраций: ${coachLabelPl.toLowerCase()}.` : isTr ? `Henüz ${coachLabel.toLowerCase()} kaydı yok.` : 'No coach registrations yet.'}
              </div>
            )}
          </div>
        )}

        {/* ── PARENTS ── */}
        {!needsAcademySetup && tab === 'parents' && (
          <div style={{ display:'flex', flexDirection:'column', gap: 12 }}>
            {pendingParents.length > 0 && (
              <>
                <Label>{isRu ? 'Ожидающие заявки родителей' : isTr ? 'Bekleyen veli kayıtları' : 'Pending parent requests'}</Label>
                {pendingParents.map(renderPendingUser)}
                <div style={{ height:1, background:'rgba(255,255,255,0.06)' }}/>
              </>
            )}
            {registeredParents.length > 0 && (
              <>
                <Label>{isRu ? 'Зарегистрированные родители' : isTr ? 'Kayıtlı veliler' : 'Registered parents'}</Label>
                {registeredParents.map(u => {
                  const ini = (u.displayName || u.email || '?').split(' ').map(s=>s[0]).join('').slice(0,2).toUpperCase();
                  return (
                    <Card key={u.uid} style={{ padding: 12 }}>
                      <div style={{ display:'flex', alignItems:'center', gap: 12 }}>
                        <Avatar initials={ini} size={36} avatarId={u.avatarId}/>
                        <div style={{ flex: 1, minWidth: 0 }}>
                          <div style={{ fontFamily:'Manrope', fontWeight:700, fontSize:13, color:'#fff' }}>
                            {u.displayName || '—'}
                          </div>
                          <div style={{ fontFamily:'Manrope', fontSize:11, color:'#7A7A7A', marginTop:2,
                            overflow:'hidden', textOverflow:'ellipsis', whiteSpace:'nowrap' }}>
                            {u.linkedPlayerName
                              ? <span style={{ color:'#4F8DFF' }}>{isRu?'Связан:':isTr?'Bağlı:':'Linked:'} {u.linkedPlayerName}</span>
                              : (u.email || '—')}
                          </div>
                        </div>
                        <span style={{ fontFamily:'JetBrains Mono', fontSize:9, color:'#4F8DFF',
                          padding:'2px 7px', borderRadius:999,
                          border:'1px solid rgba(79,141,255,0.30)', background:'rgba(79,141,255,0.08)',
                          letterSpacing:'0.10em', textTransform:'uppercase', flexShrink:0 }}>
                          {isRu ? 'РОДИТЕЛЬ' : isTr ? 'VELİ' : 'PARENT'}
                        </span>
                      </div>
                    </Card>
                  );
                })}
                <div style={{ height:1, background:'rgba(255,255,255,0.06)' }}/>
              </>
            )}
            {pendingParents.length === 0 && registeredParents.length === 0 && (
              <div style={{ textAlign:'center', padding:'28px 0',
                fontFamily:'Manrope', fontSize:13, color:'#5A5A5A' }}>
                {isRu ? 'Пока нет регистраций родителей.' : isTr ? 'Henüz veli kaydı yok.' : 'No parent registrations yet.'}
              </div>
            )}
          </div>
        )}

        {/* ── TEAMS ── */}
        {/* ── PLAYERS ── */}
        {!needsAcademySetup && tab === 'players' && (
          <div style={{ display:'flex', flexDirection:'column', gap:12 }}>
            {pendingPlayers.length > 0 && (
              <>
                <Label>{isRu ? `Ожидающие заявки: ${playerLabelPl.toLowerCase()}` : isTr ? `Bekleyen ${playerLabel.toLowerCase()} kayıtları` : 'Pending player requests'}</Label>
                {pendingPlayers.map(renderPendingUser)}
                <div style={{ height:1, background:'rgba(255,255,255,0.06)' }}/>
              </>
            )}
            {/* Registered players list */}
            {registeredPlayers.length > 0 && (
              <>
                <Label>{isRu ? `Зарегистрированные ${playerLabelPl.toLowerCase()}` : isTr ? `Kayıtlı ${playerLabelPl.toLowerCase()}` : 'Registered players'}</Label>
                {registeredPlayers.map(u => {
                  const ini = (u.displayName || u.email || '?').split(' ').map(s=>s[0]).join('').slice(0,2).toUpperCase();
                  const teamName = u.teamName || (realTeams.find(t => t.id === u.teamId)?.name) || null;
                  return (
                    <Card key={u.uid} style={{ padding:12 }}>
                      <div style={{ display:'flex', alignItems:'center', gap:12 }}>
                        <Avatar initials={ini} size={36}/>
                        <div style={{ flex:1, minWidth:0 }}>
                          <div style={{ fontFamily:'Manrope', fontWeight:700, fontSize:13, color:'#fff' }}>
                            {u.displayName || '—'}
                          </div>
                          <div style={{ fontFamily:'Manrope', fontSize:11, color:'#7A7A7A', marginTop:2 }}>
                            {[u.positionLabel || u.position, u.ageGroup, teamName].filter(Boolean).join(' · ') || u.email || '—'}
                          </div>
                        </div>
                        <span style={{ fontFamily:'JetBrains Mono', fontSize:9, color:'var(--nx-accent)',
                          padding:'2px 7px', borderRadius:999,
                          border:'1px solid var(--nx-accent-glow)', background:'var(--nx-accent-soft)',
                          letterSpacing:'0.10em', textTransform:'uppercase', flexShrink:0 }}>
                          {isTr ? playerLabel.toUpperCase() : playerLabel.toUpperCase()}
                        </span>
                      </div>
                    </Card>
                  );
                })}
                <div style={{ height:1, background:'rgba(255,255,255,0.06)' }}/>
              </>
            )}
            {pendingPlayers.length === 0 && registeredPlayers.length === 0 && (
              <div style={{ textAlign:'center', padding:'28px 0',
                fontFamily:'Manrope', fontSize:13, color:'#5A5A5A' }}>
                {isRu ? `Пока нет регистраций: ${playerLabelPl.toLowerCase()}.` : isTr ? `Henüz ${playerLabel.toLowerCase()} kaydı yok.` : 'No player registrations yet.'}
              </div>
            )}
          </div>
        )}

        {!needsAcademySetup && tab === 'teams' && (
          isMock ? (
            <div style={{ display:'flex', flexDirection:'column', gap: 10 }}>
              {teams.map(t => (
                <Card key={t.id} style={{ padding: 14 }}>
                  <div style={{ display:'flex', alignItems:'center', justifyContent:'space-between', marginBottom: 10 }}>
                    <div>
                      <div style={{ fontFamily:'Oswald', fontWeight: 700, fontSize: 18,
                        textTransform:'uppercase', letterSpacing:'0.04em', color:'#fff' }}>{t.name}</div>
                      <div style={{ fontFamily:'Manrope', fontSize: 12, color:'#7A7A7A', marginTop: 2 }}>
                        {t.coach}
                      </div>
                    </div>
                    <span style={{ fontFamily:'Oswald', fontWeight: 700, fontSize: 22, color:'#B26BFF' }}>
                      {t.players.length}
                    </span>
                  </div>
                  <div style={{ display:'flex', flexWrap:'wrap', gap: 6 }}>
                    {t.players.map(name => (
                      <span key={name} style={{ fontFamily:'Manrope', fontWeight: 600, fontSize: 11,
                        color:'#B8B8B8', background:'#1C1C1C',
                        border:'1px solid rgba(255,255,255,0.06)',
                        padding:'4px 10px', borderRadius: 999 }}>{name}</span>
                    ))}
                  </div>
                </Card>
              ))}
            </div>
          ) : (
            <div style={{ display:'flex', flexDirection:'column', gap:14 }}>
              {/* Create team form */}
              <Card style={{ padding:14 }}>
                <div style={{ fontFamily:'JetBrains Mono', fontSize:9, color:'#B26BFF',
                  letterSpacing:'0.14em', textTransform:'uppercase', marginBottom:10 }}>
                  {isRu ? `→ Создать: ${teamLabel.toLowerCase()}` : isTr ? `→ Yeni ${teamLabel.toLowerCase()} oluştur` : '→ Create new team'}
                </div>
                <div style={{ display:'flex', flexDirection:'column', gap:8 }}>
                  <input type="text" value={newTeamName}
                    onChange={e => { setNewTeamName(e.target.value); setTeamError(''); }}
                    placeholder={isRu ? `Название: ${teamLabel.toLowerCase()}` : isTr ? `${teamLabel} adı` : 'Team name'}
                    style={{ width:'100%', boxSizing:'border-box',
                      background:'rgba(178,107,255,0.04)',
                      border:'1px solid rgba(178,107,255,0.25)',
                      borderRadius:10, padding:'11px 14px',
                      fontFamily:'Manrope', fontWeight:600, fontSize:16,
                      color:'#fff', outline:'none' }}/>
                  {teamError && (
                    <div style={{ padding:'8px 10px', borderRadius:8,
                      background:'rgba(255,77,77,0.08)', border:'1px solid rgba(255,77,77,0.24)',
                      color:'#FF6B6B', fontFamily:'Manrope', fontSize:12, lineHeight:1.35 }}>
                      {teamError}
                    </div>
                  )}
                  <Button kind="primary" full size="sm"
                    disabled={!newTeamName.trim() || teamCreating}
                    onClick={genTeam}>
                    {teamCreating ? (isRu?'Создание…':isTr?'Oluşturuluyor…':'Creating…') : (isRu?`Создать ${teamLabel.toLowerCase()}у`:isTr?`${teamLabel} oluştur`:'Create team')}
                  </Button>
                </div>
              </Card>
              {/* Teams list */}
              {teamsLoading ? (
                <div style={{ display:'flex', justifyContent:'center', padding:'24px 0' }}>
                  <div style={{ display:'flex', gap:8 }}>
                    {[0,1,2].map(i => (
                      <div key={i} style={{ width:7, height:7, borderRadius:999, background:'#B26BFF',
                        animation:`nxpulse 1.4s ease-in-out ${i*0.22}s infinite` }}/>
                    ))}
                  </div>
                </div>
              ) : realTeams.length === 0 ? (
                <div style={{ textAlign:'center', padding:'24px 0',
                  fontFamily:'Manrope', fontSize:13, color:'#5A5A5A' }}>
                  {isRu ? `${teamLabel} пока нет.` : isTr ? `Henüz ${teamLabel.toLowerCase()} yok.` : `No ${isSwimming ? 'groups' : 'teams'} yet.`}
                </div>
              ) : (
                realTeams.map(t => {
                  const teamPlayers = registeredPlayers.filter(p => p.teamId === t.id);
                  const unassigned  = registeredPlayers.filter(p => !p.teamId);
                  const isEditing = editingTeamId === t.id;
                  return (
                    <Card key={t.id} style={{ padding:14 }}>
                      <div style={{ display:'flex', alignItems:'flex-start', justifyContent:'space-between', gap:10, marginBottom:10 }}>
                        <div>
                          <div style={{ fontFamily:'Oswald', fontWeight:700, fontSize:18,
                            textTransform:'uppercase', letterSpacing:'0.04em', color:'#fff' }}>{t.name}</div>
                          <div style={{ fontFamily:'JetBrains Mono', fontSize:10, color:'#B26BFF', marginTop:2 }}>
                            {t.ageGroup || teamLabel}
                          </div>
                        </div>
                        <span style={{ fontFamily:'Oswald', fontWeight:700, fontSize:22, color:'#B26BFF' }}>
                          {teamPlayers.length}
                        </span>
                      </div>

                      <div style={{ display:'flex', gap:8, marginBottom:isEditing ? 12 : 10 }}>
                        <button onClick={() => startEditTeam(t)}
                          style={{ flex:1, padding:'8px 10px', borderRadius:9, cursor:'pointer',
                            background:isEditing ? 'rgba(178,107,255,0.14)' : '#1C1C1C',
                            border:`1px solid ${isEditing ? 'rgba(178,107,255,0.45)' : 'rgba(255,255,255,0.08)'}`,
                            color:isEditing ? '#B26BFF' : '#B8B8B8',
                            fontFamily:'Manrope', fontWeight:700, fontSize:12 }}>
                          {isRu ? 'Редактировать' : isTr ? 'Düzenle' : 'Edit'}
                        </button>
                        <button onClick={() => deleteTeam(t, teamPlayers)}
                          disabled={teamActionLoading === `delete:${t.id}`}
                          style={{ flex:1, padding:'8px 10px', borderRadius:9,
                            cursor:teamActionLoading === `delete:${t.id}` ? 'not-allowed' : 'pointer',
                            background:'rgba(255,77,77,0.06)', border:'1px solid rgba(255,77,77,0.24)',
                            color:'#FF6B6B', fontFamily:'Manrope', fontWeight:700, fontSize:12,
                            opacity:teamActionLoading === `delete:${t.id}` ? 0.5 : 1 }}>
                          {teamActionLoading === `delete:${t.id}` ? '…' : (isRu ? 'Удалить' : isTr ? 'Sil' : 'Delete')}
                        </button>
                      </div>

                      {teamActionError && teamActionErrorTeamId === t.id && (
                        <div style={{ padding:'8px 10px', borderRadius:8, marginBottom:10,
                          background:'rgba(255,77,77,0.08)', border:'1px solid rgba(255,77,77,0.24)',
                          color:'#FF6B6B', fontFamily:'Manrope', fontSize:12, lineHeight:1.35 }}>
                          {teamActionError}
                        </div>
                      )}

                      {!isEditing && teamPlayers.length > 0 && (
                        <div style={{ display:'flex', flexWrap:'wrap', gap:6 }}>
                          {teamPlayers.map(p => (
                            <span key={p.uid} style={{ fontFamily:'Manrope', fontWeight:600, fontSize:11,
                              color:'#B8B8B8', background:'#1C1C1C',
                              border:'1px solid rgba(255,255,255,0.06)',
                              padding:'4px 10px', borderRadius:999 }}>{p.displayName}</span>
                          ))}
                        </div>
                      )}

                      {isEditing && (
                        <div style={{ display:'flex', flexDirection:'column', gap:10 }}>
                          <div>
                            <Label style={{ display:'block', marginBottom:6 }}>
                              {isRu ? `Название: ${teamLabel.toLowerCase()}` : isTr ? `${teamLabel} adı` : 'Team name'}
                            </Label>
                            <div style={{ display:'flex', gap:8 }}>
                              <input value={editTeamName}
                                onChange={e => { setEditTeamName(e.target.value); setTeamActionError(''); setTeamActionErrorTeamId(null); }}
                                style={{ flex:1, minWidth:0, background:'#0B0B0B',
                                  border:'1px solid rgba(178,107,255,0.25)', borderRadius:9,
                                  padding:'9px 10px', color:'#fff', fontFamily:'Manrope',
                                  fontSize:16, outline:'none' }}/>
                              <button onClick={() => saveTeamName(t, teamPlayers)}
                                disabled={!editTeamName.trim() || teamActionLoading === `rename:${t.id}`}
                                style={{ padding:'9px 12px', borderRadius:9,
                                  cursor:(!editTeamName.trim() || teamActionLoading === `rename:${t.id}`) ? 'not-allowed' : 'pointer',
                                  background:'var(--nx-accent-soft)', border:'1px solid var(--nx-accent-glow)',
                                  color:'var(--nx-accent)', fontFamily:'Manrope', fontWeight:700, fontSize:12,
                                  opacity:(!editTeamName.trim() || teamActionLoading === `rename:${t.id}`) ? 0.5 : 1 }}>
                                {teamActionLoading === `rename:${t.id}` ? '…' : (isRu ? 'Сохранить' : isTr ? 'Kaydet' : 'Save')}
                              </button>
                            </div>
                          </div>

                          <div>
                            <Label style={{ display:'block', marginBottom:6 }}>
                              {isRu ? `Участники: ${teamLabel.toLowerCase()}` : isTr ? `${teamLabel} üyeleri` : 'Team members'}
                            </Label>
                            {teamPlayers.length === 0 ? (
                              <div style={{ padding:'10px', borderRadius:9,
                                background:'rgba(255,255,255,0.02)', border:'1px solid rgba(255,255,255,0.06)',
                                fontFamily:'Manrope', fontSize:12, color:'#5A5A5A' }}>
                                {isRu ? `В этой ${teamLabel.toLowerCase()}е нет участников.` : isTr ? `Bu ${teamLabel.toLowerCase()}da ${playerLabel.toLowerCase()} yok.` : `No ${isSwimming ? 'swimmers assigned to this group' : 'players assigned to this team'}.`}
                              </div>
                            ) : teamPlayers.map(p => (
                              <div key={p.uid} style={{ display:'flex', alignItems:'center', gap:8,
                                padding:'8px 0', borderBottom:'1px solid rgba(255,255,255,0.06)' }}>
                                <Avatar initials={(p.displayName || p.email || '?').split(' ').map(s=>s[0]).join('').slice(0,2).toUpperCase()} size={28} avatarId={p.avatarId}/>
                                <div style={{ flex:1, minWidth:0 }}>
                                  <div style={{ fontFamily:'Manrope', fontWeight:700, fontSize:12, color:'#fff',
                                    overflow:'hidden', textOverflow:'ellipsis', whiteSpace:'nowrap' }}>
                                    {p.displayName || p.email}
                                  </div>
                                </div>
                                <button onClick={() => removePlayerFromTeam(p)}
                                  disabled={teamActionLoading === `remove:${p.uid}`}
                                  style={{ padding:'6px 9px', borderRadius:8,
                                    cursor:teamActionLoading === `remove:${p.uid}` ? 'not-allowed' : 'pointer',
                                    background:'rgba(255,77,77,0.06)', border:'1px solid rgba(255,77,77,0.22)',
                                    color:'#FF6B6B', fontFamily:'Manrope', fontWeight:700, fontSize:11,
                                    opacity:teamActionLoading === `remove:${p.uid}` ? 0.5 : 1 }}>
                                  {teamActionLoading === `remove:${p.uid}` ? '…' : (isRu ? 'Удалить' : isTr ? 'Çıkar' : 'Remove')}
                                </button>
                              </div>
                            ))}
                          </div>

                          <div>
                            <Label style={{ display:'block', marginBottom:6 }}>
                              {isRu ? `Добавить: ${playerLabel.toLowerCase()}` : isTr ? `${playerLabel} ekle` : 'Add player'}
                            </Label>
                            {unassigned.length === 0 ? (
                              <div style={{ padding:'10px', borderRadius:9,
                                background:'rgba(255,255,255,0.02)', border:'1px solid rgba(255,255,255,0.06)',
                                fontFamily:'Manrope', fontSize:12, color:'#5A5A5A' }}>
                                {isRu ? 'Нет свободных участников для добавления.' : isTr ? `Eklenecek boşta ${playerLabel.toLowerCase()} yok.` : 'No unassigned players available.'}
                              </div>
                            ) : (
                              <div style={{ display:'flex', gap:8, alignItems:'center' }}>
                                <select
                                  value={assignTarget===t.id && assignPlayer ? assignPlayer.uid : ''}
                                  onChange={e => {
                                    setAssignTarget(t.id);
                                    setTeamActionError('');
                                    setTeamActionErrorTeamId(null);
                                    setAssignPlayer(registeredPlayers.find(x => x.uid === e.target.value) || null);
                                  }}
                                  style={{ flex:1, minWidth:0, background:'#1C1C1C',
                                    border:'1px solid rgba(255,255,255,0.10)',
                                    borderRadius:8, padding:'8px 10px',
                                    fontFamily:'Manrope', fontSize:16, color:'#fff', outline:'none' }}>
                                  <option value="">{isRu?`Выберите: ${playerLabel.toLowerCase()}...`:isTr?`${playerLabel} seç…`:'Pick player…'}</option>
                                  {unassigned.map(p => (
                                    <option key={p.uid} value={p.uid}>{p.displayName || p.email}</option>
                                  ))}
                                </select>
                                <button
                                  disabled={assignTarget!==t.id || !assignPlayer || assigning}
                                  onClick={() => doAssignPlayer(t)}
                                  style={{ padding:'8px 13px', borderRadius:8,
                                    cursor:(assignTarget!==t.id || !assignPlayer || assigning) ? 'not-allowed' : 'pointer',
                                    background:'rgba(178,107,255,0.12)',
                                    border:'1px solid rgba(178,107,255,0.40)',
                                    fontFamily:'Manrope', fontWeight:700, fontSize:12, color:'#B26BFF',
                                    opacity:(assignTarget!==t.id||!assignPlayer||assigning) ? 0.4 : 1 }}>
                                  {assigning && assignTarget===t.id ? '…' : (isRu?'Добавить':isTr?'Ekle':'Add')}
                                </button>
                              </div>
                            )}
                          </div>

                          <button onClick={() => { setEditingTeamId(null); setTeamActionError(''); setTeamActionErrorTeamId(null); }}
                            style={{ padding:'8px 10px', borderRadius:9, cursor:'pointer',
                              background:'#1C1C1C', border:'1px solid rgba(255,255,255,0.08)',
                              color:'#B8B8B8', fontFamily:'Manrope', fontWeight:700, fontSize:12 }}>
                            {isRu ? 'Закрыть' : isTr ? 'Kapat' : 'Close'}
                          </button>
                        </div>
                      )}
                    </Card>
                  );
                })
              )}
            </div>
          )
        )}

        {/* ── MANAGERS (Yöneticiler) ── */}
        {!needsAcademySetup && tab === 'managers' && (
          <div style={{ display:'flex', flexDirection:'column', gap:12 }}>
            {/* Current admins list */}
            {registeredAdmins.length > 0 ? (
              <>
                <Label>{isRu?'Администраторы':isTr?'Mevcut yöneticiler':'Current admins'}</Label>
                {registeredAdmins.map(u => {
                  const ini = (u.displayName || u.email || '?').split(' ').map(s=>s[0]).join('').slice(0,2).toUpperCase();
                  const isOwner = u.academyRole === 'owner';
                  return (
                    <Card key={u.uid} style={{ padding:12 }}>
                      <div style={{ display:'flex', alignItems:'center', gap:12 }}>
                        <Avatar initials={ini} size={36}/>
                        <div style={{ flex:1, minWidth:0 }}>
                          <div style={{ display:'flex', alignItems:'center', gap:6 }}>
                            <span style={{ fontFamily:'Manrope', fontWeight:700, fontSize:13, color:'#fff',
                              overflow:'hidden', textOverflow:'ellipsis', whiteSpace:'nowrap' }}>
                              {u.displayName || '—'}
                            </span>
                            {isOwner && (
                              <span style={{ fontFamily:'JetBrains Mono', fontSize:8, color:'#FFB800',
                                letterSpacing:'0.10em', flexShrink:0 }}>OWNER</span>
                            )}
                          </div>
                          <div style={{ fontFamily:'Manrope', fontSize:11, color:'#7A7A7A', marginTop:2,
                            overflow:'hidden', textOverflow:'ellipsis', whiteSpace:'nowrap' }}>
                            {u.email || '—'}
                          </div>
                        </div>
                        {isOwnerAdmin && !isOwner && (
                          <button onClick={() => handleRemoveAdmin(u)} style={{
                            padding:'6px 10px', borderRadius:8, cursor:'pointer',
                            background:'rgba(255,77,77,0.06)', border:'1px solid rgba(255,77,77,0.24)',
                            color:'#FF6B6B', fontFamily:'Manrope', fontWeight:700, fontSize:11,
                            letterSpacing:'0.06em', textTransform:'uppercase' }}>
                            {isRu?'Убрать':isTr?'Kaldır':'Remove'}
                          </button>
                        )}
                      </div>
                    </Card>
                  );
                })}
              </>
            ) : (
              <div style={{ textAlign:'center', padding:'24px 0',
                fontFamily:'Manrope', fontSize:13, color:'#5A5A5A' }}>
                {isRu?'Администраторов пока нет.':isTr?'Henüz yönetici yok.':'No admins yet.'}
              </div>
            )}

            {/* Pending invites */}
            {adminInvites.filter(i => i.status === 'pending').length > 0 && (
              <>
                <Label>{isRu?'Ожидающие приглашения':isTr?'Bekleyen davetler':'Pending invites'}</Label>
                {adminInvites.filter(i => i.status === 'pending').map(inv => (
                  <div key={inv.id} style={{ padding:'10px 12px', borderRadius:10,
                    background:'rgba(178,107,255,0.06)', border:'1px solid rgba(178,107,255,0.20)' }}>
                    <div style={{ fontFamily:'Manrope', fontWeight:700, fontSize:12, color:'#B26BFF' }}>
                      {inv.email}
                    </div>
                    <div style={{ fontFamily:'JetBrains Mono', fontSize:9, color:'#7A7A7A',
                      letterSpacing:'0.10em', marginTop:3 }}>
                      {isRu?'ОЖИДАЕТ':isTr?'BEKLEMEDE':'PENDING'}
                    </div>
                  </div>
                ))}
              </>
            )}

            {/* Invite form — ownerAdmin only */}
            {isOwnerAdmin && (
              <Card style={{ padding:12 }}>
                <div style={{ fontFamily:'JetBrains Mono', fontSize:9, color:'#B26BFF',
                  letterSpacing:'0.14em', textTransform:'uppercase', marginBottom:10 }}>
                  {isRu?'→ Пригласить администратора':isTr?'→ Admin Davet Et':'→ Invite Admin'}
                </div>
                <div style={{ display:'flex', gap:8 }}>
                  <input value={adminInviteEmail}
                    onChange={e => { setAdminInviteEmail(e.target.value); setAdminInviteMsg(null); }}
                    onKeyDown={e => e.key === 'Enter' && handleInviteAdmin()}
                    placeholder={isRu?'Электронная почта':isTr?'E-posta adresi':'Email address'}
                    style={{ flex:1, background:'#0B0B0B',
                      border:'1px solid rgba(178,107,255,0.25)', borderRadius:9,
                      padding:'10px 12px', fontFamily:'Manrope', fontSize:13,
                      color:'#fff', outline:'none' }}/>
                  <button disabled={!adminInviteEmail.trim() || adminInviteLoading}
                    onClick={handleInviteAdmin} style={{
                      padding:'10px 12px', borderRadius:9,
                      cursor: (!adminInviteEmail.trim() || adminInviteLoading) ? 'not-allowed' : 'pointer',
                      background:'rgba(178,107,255,0.12)', border:'1px solid rgba(178,107,255,0.40)',
                      color:'#B26BFF', fontFamily:'Manrope', fontWeight:700, fontSize:12,
                      opacity: (!adminInviteEmail.trim() || adminInviteLoading) ? 0.4 : 1 }}>
                    {adminInviteLoading ? '…' : (isRu?'Пригласить':isTr?'Davet Et':'Invite')}
                  </button>
                </div>
                {adminInviteMsg && (
                  <div style={{ marginTop:8, padding:'7px 10px', borderRadius:8,
                    background: adminInviteMsg.type==='ok' ? 'rgba(0,255,136,0.08)' : 'rgba(255,77,77,0.08)',
                    border:`1px solid ${adminInviteMsg.type==='ok' ? 'rgba(0,255,136,0.24)' : 'rgba(255,77,77,0.24)'}`,
                    color: adminInviteMsg.type==='ok' ? '#00FF88' : '#FF6B6B',
                    fontFamily:'Manrope', fontSize:11 }}>
                    {adminInviteMsg.text}
                  </div>
                )}
                <div style={{ marginTop:10, padding:'8px 10px', borderRadius:8,
                  background:'rgba(255,255,255,0.02)', border:'1px solid rgba(255,255,255,0.06)',
                  fontFamily:'Manrope', fontSize:11, color:'#7A7A7A', lineHeight:1.45 }}>
                  {isRu
                    ? 'Если пользователь уже существует — он получает права администратора мгновенно. Если нет — создаётся приглашение, и при регистрации он будет автоматически добавлен в академию.'
                    : isTr
                    ? 'Kullanıcı zaten varsa anında yönetici yapılır. Yoksa davet oluşturulur ve kayıt olduğunda otomatik olarak akademiye eklenir.'
                    : 'If the user exists they become admin instantly. If not, an invite is created and they\'ll be auto-added when they register.'}
                </div>
              </Card>
            )}
            {!isOwnerAdmin && (
              <div style={{ padding:'10px 12px', borderRadius:10,
                background:'rgba(255,255,255,0.02)', border:'1px solid rgba(255,255,255,0.06)',
                fontFamily:'Manrope', fontSize:12, color:'#7A7A7A' }}>
                {isRu?'Только владелец академии может приглашать и удалять администраторов.':isTr?'Yalnızca akademi sahibi yönetici ekleyip çıkarabilir.':'Only the academy owner can invite or remove admins.'}
              </div>
            )}
          </div>
        )}
      </div>
    </div>
  );
};

// ────────────────────────────────────────────────────────────
// INVITE ROW — shared by coach invites + parent links
// ────────────────────────────────────────────────────────────
const InviteRow = ({ code, email, status, created, accent, lang, onRevoke }) => {
  const langKey = lang === 'ru' ? 'ru' : lang === 'en' ? 'en' : 'tr';
  const isTr = langKey === 'tr';
  const isRu = langKey === 'ru';
  const [copied, setCopied] = useS4(false);
  const statusLabel = {
    active: isRu ? 'активен' : isTr ? 'aktif' : 'active',
    pending: isRu ? 'ожидает' : isTr ? 'beklemede' : 'pending',
    linked: isRu ? 'связан' : isTr ? 'bağlı' : 'linked',
  }[status] || status;
  const statusColor = (status==='active'||status==='linked') ? '#00FF88' : '#FFB800';
  const copy = () => {
    try { navigator.clipboard && navigator.clipboard.writeText(code); } catch(e){}
    setCopied(true); setTimeout(() => setCopied(false), 1400);
  };
  return (
    <div style={{ background:'#141414', border:'1px solid rgba(255,255,255,0.06)',
      borderRadius: 12, padding: 12 }}>
      <div style={{ display:'flex', alignItems:'center', justifyContent:'space-between', gap: 10 }}>
        <button onClick={copy} style={{
          fontFamily:'JetBrains Mono', fontSize: 13, fontWeight: 700, letterSpacing:'0.06em',
          color: accent, background:`${accent}10`, border:`1px solid ${accent}40`,
          borderRadius: 8, padding:'5px 10px', cursor:'pointer' }}>
          {copied ? (isRu?'Скопировано ✓':isTr?'Kopyalandı ✓':'Copied ✓') : code}
        </button>
        <span style={{ fontFamily:'JetBrains Mono', fontSize: 9, color: statusColor,
          letterSpacing:'0.10em', textTransform:'uppercase' }}>● {statusLabel}</span>
      </div>
      <div style={{ marginTop: 8, display:'flex', alignItems:'center', justifyContent:'space-between', gap: 8 }}>
        <div style={{ fontFamily:'Manrope', fontSize: 12, color:'#B8B8B8',
          minWidth: 0, overflow:'hidden', textOverflow:'ellipsis', whiteSpace:'nowrap' }}>{email}</div>
        <div style={{ display:'flex', alignItems:'center', gap: 10 }}>
          <span style={{ fontFamily:'Manrope', fontSize: 11, color:'#5A5A5A' }}>{created}</span>
          <button onClick={onRevoke} style={{
            background:'transparent', border:'1px solid rgba(255,77,77,0.30)',
            color:'#FF6B6B', padding:'4px 8px', borderRadius: 8, cursor:'pointer',
            fontFamily:'Manrope', fontSize: 10, fontWeight: 700,
            letterSpacing:'0.08em', textTransform:'uppercase' }}>
            {isRu?'Отозвать':isTr?'İptal':'Revoke'}
          </button>
        </div>
      </div>
    </div>
  );
};

Object.assign(window, {
  CHILD_REGISTRY, DEFAULT_CHILD_KEY,
  AdminDashboardScreen, InviteRow,
});

// ────────────────────────────────────────────────────────────
// MANAGERS TAB BODY — rendered inside AdminDashboardScreen
// Extracted as a constant JSX block via window injection.
// ────────────────────────────────────────────────────────────
// NOTE: This section is injected into AdminDashboardScreen via
// the tab === 'managers' branch already added above in the
// component's render return. The actual JSX is inlined there.
