(function(){
const {useState,useEffect,useMemo,useCallback,useRef,useContext,createContext}=React;

const runtime=window.__ILKEM_CONFIG__||{};
const supabaseUrl=runtime.NEXT_PUBLIC_SUPABASE_URL||"";
const supabaseKey=runtime.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY||runtime.NEXT_PUBLIC_SUPABASE_ANON_KEY||"";
const isSupabaseConfigured=Boolean(supabaseUrl&&supabaseKey);
const supabaseEnv={hasUrl:Boolean(supabaseUrl),hasKey:Boolean(supabaseKey),urlLength:supabaseUrl.length,keyLength:supabaseKey.length};
const supabase=isSupabaseConfigured?window.supabase.createClient(supabaseUrl,supabaseKey):null;

const RouterContext=createContext(null);
function normalizeHref(href){return typeof href==="string"?href:(href?.pathname||"/")}
function RouterProvider({children}){
  const [loc,setLoc]=useState(()=>window.location.pathname+window.location.search+window.location.hash);
  useEffect(()=>{
    const sync=()=>setLoc(window.location.pathname+window.location.search+window.location.hash);
    window.addEventListener("popstate",sync);window.addEventListener("ilkem:navigate",sync);
    return()=>{window.removeEventListener("popstate",sync);window.removeEventListener("ilkem:navigate",sync)};
  },[]);
  const navigate=(href,replace=false)=>{
    const target=normalizeHref(href);
    if(/^https?:\/\//i.test(target)){window.location.href=target;return}
    if(replace)history.replaceState({},"",target);else history.pushState({},"",target);
    window.dispatchEvent(new Event("ilkem:navigate"));window.scrollTo(0,0);
  };
  const value={loc,pathname:window.location.pathname,search:window.location.search,push:h=>navigate(h,false),replace:h=>navigate(h,true)};
  return <RouterContext.Provider value={value}>{children}</RouterContext.Provider>;
}
function useRouter(){const r=useContext(RouterContext);return {push:r.push,replace:r.replace,refresh:()=>window.dispatchEvent(new Event("ilkem:navigate"))}}
function usePathname(){return useContext(RouterContext).pathname}
function useParams(){const p=useContext(RouterContext).pathname.split("/").filter(Boolean);return p[0]==="students"&&p[1]?{id:p[1]}:{}}
function Link({href,children,onClick,...props}){
  const r=useContext(RouterContext);const target=normalizeHref(href);
  return <a href={target} {...props} onClick={e=>{onClick?.(e);if(e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||props.target==="_blank"||/^https?:\/\//i.test(target))return;e.preventDefault();r.push(target)}}>{children}</a>
}


const __mod_UseCurrentProfile=(()=>{

function useCurrentProfile(){
  const [profile,setProfile]=useState(null),[user,setUser]=useState(null),[loading,setLoading]=useState(true);
  useEffect(()=>{(async()=>{const {data:{user:u}}=await supabase.auth.getUser();setUser(u||null);if(u){const {data}=await supabase.from("profiles").select("id,username,full_name,role").eq("id",u.id).maybeSingle();setProfile(data||null)}setLoading(false)})()},[]);
  const role=profile?.role;
  return {profile,user,loading,role,canEdit:["admin","teacher"].includes(role),isAdmin:role==="admin",isTeacher:role==="teacher",isCoordinator:role==="coordinator",isCounselor:role==="counselor",isParent:role==="parent",isStudent:role==="student"};
}
return {useCurrentProfile:useCurrentProfile};
})();
const useCurrentProfile=__mod_UseCurrentProfile.useCurrentProfile;


const __mod_UseStudentSelection=(()=>{


function useStudentSelection(){
  const router=useRouter();
  const [students,setStudents]=useState([]);
  const [studentId,setStudentId]=useState("");
  const [loading,setLoading]=useState(true);
  const [error,setError]=useState("");

  const load=useCallback(async()=>{
    setLoading(true); setError("");
    const {data,error}=await supabase.from("students")
      .select("id,student_no,full_name,class_name,advisor_id,photo_path")
      .order("full_name");
    if(error){setError(error.message); setStudents([]); setLoading(false); return;}
    const list=data||[]; setStudents(list);
    const qs=new URLSearchParams(window.location.search);
    const requested=qs.get("student");
    const valid=requested && list.some(s=>s.id===requested);
    const chosen=valid?requested:(list[0]?.id||"");
    setStudentId(chosen);
    setLoading(false);
  },[]);

  useEffect(()=>{load();},[load]);

  function choose(id){
    setStudentId(id);
    const url=new URL(window.location.href);
    if(id) url.searchParams.set("student",id); else url.searchParams.delete("student");
    router.replace(url.pathname+url.search);
  }

  const student=useMemo(()=>students.find(s=>s.id===studentId)||null,[students,studentId]);
  return {students,studentId,student,choose,loading,error,reloadStudents:load};
}
return {useStudentSelection:useStudentSelection};
})();
const useStudentSelection=__mod_UseStudentSelection.useStudentSelection;


const __mod_PrintButton=(()=>{

function PrintButton({label="Yazdır / PDF"}){
  return <button type="button" className="btn no-print" onClick={()=>window.print()}>{label}</button>;
}
return {default:PrintButton};
})();
const PrintButton=__mod_PrintButton.default;


const __mod_StudentBar=(()=>{

function StudentBar({students,studentId,onChange,loading,error}){
  return <div className="studentbar">
    <div>
      <div className="muted">Aktif öğrenci</div>
      {error && <div className="errorbox">{error}</div>}
    </div>
    <select value={studentId||""} onChange={e=>onChange(e.target.value)} disabled={loading||!students.length}>
      {!students.length && <option value="">Öğrenci bulunamadı</option>}
      {students.map(s=><option value={s.id} key={s.id}>{s.full_name} • {s.class_name||"Sınıf yok"} {s.student_no?`• ${s.student_no}`:""}</option>)}
    </select>
  </div>
}
return {default:StudentBar};
})();
const StudentBar=__mod_StudentBar.default;


const __mod_StudentPhoto=(()=>{


function initials(name){
  const parts=String(name||"").trim().split(/\s+/).filter(Boolean);
  if(!parts.length)return "?";
  if(parts.length===1)return parts[0].slice(0,2).toUpperCase();
  return `${parts[0][0]||""}${parts[parts.length-1][0]||""}`.toUpperCase();
}

function StudentPhoto({photoPath,name,size=58}){
  const [url,setUrl]=useState("");
  const [failed,setFailed]=useState(false);

  useEffect(()=>{
    let active=true;
    setUrl("");
    setFailed(false);

    if(!photoPath||!supabase)return ()=>{active=false};

    (async()=>{
      const {data,error}=await supabase.storage
        .from("student-photos")
        .createSignedUrl(photoPath,3600);

      if(!active)return;
      if(error||!data?.signedUrl){
        setFailed(true);
        return;
      }
      setUrl(data.signedUrl);
    })();

    return ()=>{active=false};
  },[photoPath]);

  const style=useMemo(()=>({
    width:size,
    height:size,
    borderRadius:"50%",
    objectFit:"cover",
    flex:"0 0 auto",
    border:"2px solid #dbe5f2",
    background:"#edf4ff"
  }),[size]);

  if(url&&!failed){
    return <img src={url} alt={name||"Öğrenci"} style={style}/>;
  }

  return <div
    aria-label={name||"Öğrenci"}
    style={{
      ...style,
      display:"grid",
      placeItems:"center",
      color:"#123B74",
      fontWeight:900,
      fontSize:Math.max(12,Math.round(size*.28))
    }}
  >
    {initials(name)}
  </div>;
}
return {default:StudentPhoto};
})();
const StudentPhoto=__mod_StudentPhoto.default;


const __mod_StudentPhotoUpload=(()=>{


const TYPES={
  "image/jpeg":"jpg",
  "image/png":"png",
  "image/webp":"webp"
};

function StudentPhotoUpload({student,onChanged}){
  const inputRef=useRef(null);
  const [busy,setBusy]=useState(false);
  const [error,setError]=useState("");

  async function upload(file){
    setError("");
    if(!student?.id||!file)return;

    const ext=TYPES[file.type];
    if(!ext){
      setError("Sadece JPG, PNG veya WEBP fotoğraf yükleyebilirsiniz.");
      return;
    }
    if(file.size>5*1024*1024){
      setError("Fotoğraf en fazla 5 MB olabilir.");
      return;
    }

    setBusy(true);

    const oldPath=student.photo_path||null;
    const newPath=`${student.id}/profile-${Date.now()}.${ext}`;

    const {error:uploadError}=await supabase.storage
      .from("student-photos")
      .upload(newPath,file,{
        cacheControl:"3600",
        upsert:false,
        contentType:file.type
      });

    if(uploadError){
      setBusy(false);
      setError(uploadError.message);
      return;
    }

    const {error:updateError}=await supabase
      .from("students")
      .update({photo_path:newPath})
      .eq("id",student.id);

    if(updateError){
      await supabase.storage.from("student-photos").remove([newPath]);
      setBusy(false);
      setError(updateError.message);
      return;
    }

    if(oldPath){
      await supabase.storage.from("student-photos").remove([oldPath]);
    }

    setBusy(false);
    if(inputRef.current)inputRef.current.value="";
    onChanged?.();
  }

  async function remove(){
    setError("");
    if(!student?.id||!student?.photo_path)return;
    if(!confirm(`${student.full_name} öğrencisinin fotoğrafı kaldırılsın mı?`))return;

    setBusy(true);
    const oldPath=student.photo_path;

    const {error:updateError}=await supabase
      .from("students")
      .update({photo_path:null})
      .eq("id",student.id);

    if(updateError){
      setBusy(false);
      setError(updateError.message);
      return;
    }

    await supabase.storage.from("student-photos").remove([oldPath]);
    setBusy(false);
    onChanged?.();
  }

  return <div className="card" style={{marginTop:14,background:"#f8fbff"}}>
    <div style={{display:"flex",alignItems:"center",gap:14,flexWrap:"wrap"}}>
      <StudentPhoto
        photoPath={student.photo_path}
        name={student.full_name}
        size={82}
      />

      <div style={{flex:"1 1 260px"}}>
        <b style={{color:"#123B74"}}>Öğrenci Fotoğrafı</b>
        <div className="muted" style={{marginTop:4}}>
          JPG, PNG veya WEBP • En fazla 5 MB
        </div>

        <div style={{display:"flex",gap:8,flexWrap:"wrap",marginTop:10}}>
          <label className="smallbtn orange" style={{cursor:busy?"not-allowed":"pointer"}}>
            {busy?"İşleniyor...":student.photo_path?"Fotoğrafı Değiştir":"Fotoğraf Yükle"}
            <input
              ref={inputRef}
              type="file"
              accept="image/jpeg,image/png,image/webp"
              disabled={busy}
              style={{display:"none"}}
              onChange={e=>upload(e.target.files?.[0])}
            />
          </label>

          {student.photo_path&&
            <button type="button" className="smallbtn red" disabled={busy} onClick={remove}>
              Fotoğrafı Kaldır
            </button>}
        </div>

        {error&&<div className="errorbox" style={{marginTop:8}}>{error}</div>}
      </div>
    </div>
  </div>;
}
return {default:StudentPhotoUpload};
})();
const StudentPhotoUpload=__mod_StudentPhotoUpload.default;


const __mod_Header=(()=>{


function Header(){
  const router=useRouter();
  const {profile}=useCurrentProfile();
  const role=profile?.role;

  async function logout(){
    if(supabase) await supabase.auth.signOut();
    router.replace("/login");
  }

  const staff=["admin","coordinator","teacher","counselor"].includes(role);

  return <header className="header"><div className="header-in">
    <div className="brand">
      <img src="/logo.png" alt="İlkem Koleji"/>
      <div><h1>Çatalca İlkem Koleji</h1><small>LGS Öğrenci Takip Sistemi</small></div>
    </div>

    <nav className="nav">
      {staff&&<Link href="/dashboard">Ana Sayfa</Link>}
      {staff&&<Link href="/admin">Öğrenciler</Link>}

      {["admin","teacher","coordinator","counselor"].includes(role)&&
        <Link href="/gorevler">{["coordinator","counselor"].includes(role)?"Kazanım Görevleri":"Görev Ata"}</Link>}

      {["admin","coordinator","teacher","student","parent"].includes(role)&&
        <Link href="/calisma">{role==="student"?"Çalışmalarım":"Çalışmalar"}</Link>}

      {["admin","coordinator","teacher","counselor","student","parent"].includes(role)&&
        <Link href="/denemeler">Denemeler</Link>}

      {["admin","coordinator","teacher","student","parent"].includes(role)&&
        <Link href="/hedefler">Hedefler</Link>}

      {["admin","coordinator","teacher"].includes(role)&&<Link href="/danismanlik">Danışmanlık</Link>}
      {["admin","coordinator","counselor"].includes(role)&&<Link href="/rehberlik">Rehberlik</Link>}
      {["admin","coordinator"].includes(role)&&<Link href="/koordinator">Koordinatör</Link>}

      {role==="admin"&&<Link href="/accounts">Kullanıcılar</Link>}
      {role==="admin"&&<Link href="/tanimlamalar">Öğrenci & Kazanım</Link>}

      {role==="parent"&&<><Link href="/veli">Veli Paneli</Link><Link href="/rapor">Rapor</Link></>}
      {role==="student"&&<Link href="/rapor">Raporum</Link>}

      {role&&<Link href="/sifre">Şifrem</Link>}

      <button onClick={logout}
        style={{border:0,background:"#F47A20",color:"white",fontWeight:700,padding:"9px 11px",borderRadius:10,cursor:"pointer"}}>
        Çıkış
      </button>
    </nav>
  </div></header>
}
return {default:Header};
})();
const Header=__mod_Header.default;


const __mod_AuthBoundary=(()=>{


function AuthBoundary({children}){
  const pathname=usePathname();
  const router=useRouter();
  const [checking,setChecking]=useState(pathname!=="/login");

  useEffect(()=>{
    if(pathname==="/login"){
      setChecking(false);
      return;
    }

    if(!isSupabaseConfigured){
      setChecking(false);
      return;
    }

    let mounted=true;

    supabase.auth.getSession().then(({data})=>{
      if(!mounted) return;
      if(!data?.session){
        router.replace("/login");
      } else {
        setChecking(false);
      }
    });

    const {data:listener}=supabase.auth.onAuthStateChange((_event,session)=>{
      if(!session && pathname!=="/login") router.replace("/login");
    });

    return ()=>{
      mounted=false;
      listener?.subscription?.unsubscribe();
    };
  },[pathname,router]);

  if(pathname!=="/login" && !isSupabaseConfigured){
    return <div style={{maxWidth:700,margin:"60px auto",padding:24,fontFamily:"Arial"}}>
      <h2 style={{color:"#123B74"}}>Supabase bağlantısı bulunamadı</h2>
      <p>Cloudflare projesinde <b>Variables and Secrets</b> ayarlarını kontrol edin.</p>
      <pre style={{background:"#f4f7fb",padding:16,borderRadius:12,whiteSpace:"pre-wrap"}}>
NEXT_PUBLIC_SUPABASE_URL=https://....supabase.co{"\n"}
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=sb_publishable_....
      </pre>
      <p>Cloudflare değişkenlerini kaydettikten sonra <b>/env-check</b> sayfasını açın.</p>
    </div>
  }

  if(checking){
    return <div style={{padding:40,textAlign:"center",fontFamily:"Arial"}}>Oturum kontrol ediliyor...</div>
  }

  return children;
}
return {default:AuthBoundary};
})();
const AuthBoundary=__mod_AuthBoundary.default;


const __mod_Accounts=(()=>{


const empty={username:"",full_name:"",role:"teacher",password:"",student_id:""};

function Accounts(){
  const {profile,isAdmin,loading:pl}=useCurrentProfile();
  const [users,setUsers]=useState([]),[students,setStudents]=useState([]),[f,setF]=useState(empty),[msg,setMsg]=useState(""),[error,setError]=useState(""),[saving,setSaving]=useState(false);

  async function load(){
    setError("");
    const [{data:u,error:ue},{data:s,error:se}]=await Promise.all([
      supabase.from("profiles").select("id,username,full_name,role,created_at,active").eq("active",true).order("full_name"),
      supabase.from("students").select("id,student_no,full_name,class_name,user_id").order("full_name")
    ]);
    if(ue)setError(ue.message);else setUsers(u||[]);
    if(!se)setStudents(s||[]);
  }

  useEffect(()=>{if(isAdmin)load()},[isAdmin]);

  const set=(k,v)=>setF(x=>({...x,[k]:v}));

  async function create(e){
    e.preventDefault();setError("");setMsg("");setSaving(true);
    try{
      const {data:{session}}=await supabase.auth.getSession();
      const res=await fetch("/api/admin/accounts",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${session?.access_token||""}`},body:JSON.stringify(f)});
      const data=await res.json();
      if(!res.ok)throw new Error(data.error||"Hesap oluşturulamadı.");
      setMsg(`Hesap oluşturuldu: ${data.username}`);setF(empty);await load();
    }catch(e){setError(e.message)}
    finally{setSaving(false)}
  }

  async function changeUsername(u){
    const next=prompt(`${u.full_name} için yeni kullanıcı adı:`,u.username||"");
    if(next===null)return;

    const normalized=String(next).trim().toLowerCase();
    if(!/^[a-z0-9._-]{3,32}$/.test(normalized)){
      setError("Kullanıcı adı 3-32 karakter olmalı; sadece küçük harf, rakam, nokta, alt çizgi ve tire kullanılabilir.");
      return;
    }
    if(normalized===u.username){
      setMsg("Kullanıcı adı zaten bu şekilde.");
      return;
    }

    setError("");
    setMsg("");

    try{
      const {data:{session}}=await supabase.auth.getSession();
      const res=await fetch("/api/admin/accounts",{
        method:"PATCH",
        headers:{
          "Content-Type":"application/json",
          Authorization:`Bearer ${session?.access_token||""}`
        },
        body:JSON.stringify({
          action:"username",
          id:u.id,
          username:normalized
        })
      });

      const data=await res.json();
      if(!res.ok)throw new Error(data.error||"Kullanıcı adı değiştirilemedi.");

      setMsg(`${u.full_name} kullanıcısının yeni kullanıcı adı: ${data.username}`);
      await load();
    }catch(e){
      setError(e.message);
    }
  }


  async function resetPassword(u){
    const next=prompt(`${u.full_name} için yeni şifreyi girin:\n\nŞifre en az 6 karakter olmalıdır.`);
    if(next===null)return;
    if(String(next).length<6){setError("Yeni şifre en az 6 karakter olmalıdır.");return}

    setError("");setMsg("");
    try{
      const {data:{session}}=await supabase.auth.getSession();
      const res=await fetch("/api/admin/accounts",{
        method:"PATCH",
        headers:{"Content-Type":"application/json",Authorization:`Bearer ${session?.access_token||""}`},
        body:JSON.stringify({action:"password",id:u.id,password:String(next)})
      });
      const data=await res.json();
      if(!res.ok)throw new Error(data.error||"Şifre değiştirilemedi.");
      setMsg(`${u.full_name} kullanıcısının şifresi değiştirildi.`);
    }catch(e){setError(e.message)}
  }

  async function removeUser(u){
    if(u.id===profile?.id){setError("Kendi yönetici hesabınızı silemezsiniz.");return}
    if(!confirm(`${u.full_name} (${u.username}) hesabı silinsin mi?\n\nGiriş erişimi kapatılacak, geçmiş kayıtlar korunacaktır.`))return;
    setError("");setMsg("");
    try{
      const {data:{session}}=await supabase.auth.getSession();
      const res=await fetch("/api/admin/accounts",{
        method:"DELETE",
        headers:{"Content-Type":"application/json",Authorization:`Bearer ${session?.access_token||""}`},
        body:JSON.stringify({id:u.id})
      });
      const data=await res.json();
      if(!res.ok)throw new Error(data.error||"Kullanıcı silinemedi.");
      setMsg("Kullanıcı hesabı silindi. Geçmiş kayıtları korunmuştur.");
      await load();
    }catch(e){setError(e.message)}
  }

  if(pl)return <><Header/><main className="container"><div className="empty">Yetki kontrol ediliyor...</div></main></>;
  if(!isAdmin)return <><Header/><main className="container"><div className="card errorbox">Bu bölüm yalnızca yönetici içindir.</div></main></>;

  return <><Header/><main className="container">
    <div className="toolbar"><div><h2>Kullanıcı Hesapları</h2><div className="muted">Kullanıcı oluşturun; öğretmenler dahil aktif kullanıcıların kullanıcı adını değiştirin, şifre sıfırlayın veya hesabı silin. Mevcut şifreler güvenlik nedeniyle görüntülenmez.</div></div><span className="badge">Yönetici</span></div>
    {error&&<div className="card errorbox" style={{marginBottom:16}}>{error}</div>}
    {msg&&<div className="card successbox" style={{marginBottom:16}}>{msg}</div>}

    <form className="card" onSubmit={create} style={{marginBottom:18}}>
      <div className="formgrid">
        <div className="field"><label>Kullanıcı Adı *</label><input required value={f.username} onChange={e=>set("username",e.target.value.toLowerCase())} placeholder="örn. ayse.yilmaz"/><div className="muted">3-32 karakter: a-z, 0-9, . _ -</div></div>
        <div className="field"><label>Ad Soyad *</label><input required value={f.full_name} onChange={e=>set("full_name",e.target.value)}/></div>
        <div className="field"><label>Rol</label><select value={f.role} onChange={e=>set("role",e.target.value)} style={{border:"1px solid #ccd6e4",borderRadius:10,padding:11}}><option value="teacher">Öğretmen / Danışman</option><option value="counselor">Rehberlik Öğretmeni</option><option value="coordinator">Eğitim Koordinatörü</option><option value="parent">Veli</option><option value="student">Öğrenci</option><option value="admin">Yönetici</option></select></div>
        <div className="field"><label>Geçici Şifre *</label><input required minLength={6} value={f.password} onChange={e=>set("password",e.target.value)} type="password"/></div>
        {(f.role==="parent"||f.role==="student")&&<div className="field" style={{gridColumn:"1/-1"}}><label>Bağlanacak Öğrenci *</label><select required value={f.student_id} onChange={e=>set("student_id",e.target.value)} style={{border:"1px solid #ccd6e4",borderRadius:10,padding:11}}><option value="">Öğrenci seçin</option>{students.map(s=><option key={s.id} value={s.id}>{s.full_name} • {s.class_name||"-"} • {s.student_no||"-"}</option>)}</select></div>}
      </div>
      <button className="btn" disabled={saving} style={{marginTop:14}}>{saving?"Oluşturuluyor...":"Hesabı Oluştur"}</button>
    </form>

    <div className="card table"><table><thead><tr><th>Ad Soyad</th><th>Kullanıcı Adı</th><th>Rol</th><th>İşlem</th></tr></thead><tbody>
      {users.map(u=><tr key={u.id}><td>{u.full_name}</td><td><b>{u.username||"Henüz yok"}</b></td><td>{u.role}</td><td><div style={{display:"flex",gap:7,flexWrap:"wrap"}}><button className="smallbtn" onClick={()=>changeUsername(u)}>Kullanıcı Adını Değiştir</button><button className="smallbtn orange" onClick={()=>resetPassword(u)}>Şifreyi Sıfırla</button><button className="smallbtn red" onClick={()=>removeUser(u)} disabled={u.id===profile?.id}>Sil</button></div></td></tr>)}
      {!users.length&&<tr><td colSpan="4">Kullanıcı bulunamadı.</td></tr>}
    </tbody></table></div>
  </main></>
}
return {default:Accounts};
})();
const Accounts=__mod_Accounts.default;


const __mod_AdminPage=(()=>{


const empty={student_no:"",full_name:"",class_name:"8-A",advisor_id:""};

function AdminPage(){
  const [profile,setProfile]=useState(null);
  const [students,setStudents]=useState([]);
  const [teachers,setTeachers]=useState([]);
  const [form,setForm]=useState(empty);
  const [editing,setEditing]=useState(null);
  const [msg,setMsg]=useState("");
  const [error,setError]=useState("");
  const [loading,setLoading]=useState(true);

  async function load(){
    setLoading(true); setError("");
    const {data:{user}}=await supabase.auth.getUser();
    if(!user){setError("Oturum bulunamadı.");setLoading(false);return;}
    const {data:p,error:pe}=await supabase.from("profiles").select("id,full_name,role").eq("id",user.id).single();
    if(pe){setError(pe.message);setLoading(false);return;}
    setProfile(p);
    const [{data:ss,error:se},{data:tt,error:te}]=await Promise.all([
      supabase.from("students").select("id,student_no,full_name,class_name,advisor_id,photo_path,created_at").order("class_name").order("full_name"),
      supabase.from("profiles").select("id,full_name,role,active").in("role",["teacher","admin"]).eq("active",true).order("full_name")
    ]);
    if(se) setError(se.message); else setStudents(ss||[]);
    if(!te) setTeachers(tt||[]);
    setLoading(false);
  }
  useEffect(()=>{load();},[]);

  function set(k,v){setForm(f=>({...f,[k]:v}));}

  async function save(e){
    e.preventDefault(); setMsg(""); setError("");
    if(profile?.role!=="admin"){setError("Sadece yönetici öğrenci ekleyebilir veya düzenleyebilir.");return;}
    if(!form.full_name.trim()||!form.student_no.trim()){setError("Öğrenci adı ve öğrenci numarası zorunludur.");return;}
    const payload={
      student_no:form.student_no.trim(), full_name:form.full_name.trim(),
      class_name:form.class_name.trim(), advisor_id:form.advisor_id||null
    };
    let result;
    if(editing) result=await supabase.from("students").update(payload).eq("id",editing);
    else result=await supabase.from("students").insert(payload);
    if(result.error){setError(result.error.message);return;}
    setMsg(editing?"Öğrenci güncellendi.":"Öğrenci eklendi.");
    setForm(empty); setEditing(null); await load();
  }

  function edit(s){
    setEditing(s.id); setForm({student_no:s.student_no||"",full_name:s.full_name||"",class_name:s.class_name||"",advisor_id:s.advisor_id||""});
    window.scrollTo({top:0,behavior:"smooth"});
  }

  async function remove(s){
    if(profile?.role!=="admin") return;
    if(!window.confirm(`${s.full_name} öğrencisini silmek istediğinize emin misiniz? İlişkili kayıtlar da silinebilir.`)) return;
    const {error}=await supabase.from("students").delete().eq("id",s.id);
    if(error){setError(error.message);return;}
    setMsg("Öğrenci silindi."); await load();
  }

  return <><Header/><main className="container">
    <div className="toolbar"><div><h2>Öğrenci Yönetimi</h2><div className="muted">Yönetici tüm öğrencileri; danışman öğretmen yalnızca kendi öğrencilerini görür</div></div><div style={{display:"flex",gap:8,alignItems:"center"}}><span className="badge">{profile?.role||"..."}</span>{profile?.role==="admin"&&<Link className="smallbtn" href="/accounts">Kullanıcı Hesapları</Link>}</div></div>

    {error&&<div className="card" style={{borderColor:"#f3b3ad",color:"#b42318",marginBottom:18}}>{error}</div>}
    {msg&&<div className="card successbox" style={{marginBottom:18}}>{msg}</div>}

    {profile?.role==="admin"&&<form onSubmit={save} className="card" style={{marginBottom:20}}>
      <div className="toolbar"><div><h3 style={{margin:0,color:"#123B74"}}>{editing?"Öğrenciyi Düzenle":"Yeni Öğrenci Ekle"}</h3><div className="muted">Öğrenci kartının temel bilgileri</div></div>{editing&&<button type="button" className="smallbtn" onClick={()=>{setEditing(null);setForm(empty)}}>Vazgeç</button>}</div>
      <div className="formgrid">
        <div className="field"><label>Öğrenci No *</label><input value={form.student_no} onChange={e=>set("student_no",e.target.value)} placeholder="Örn. 20260075"/></div>
        <div className="field"><label>Ad Soyad *</label><input value={form.full_name} onChange={e=>set("full_name",e.target.value)} placeholder="Öğrenci adı soyadı"/></div>
        <div className="field"><label>Sınıf / Şube</label><input value={form.class_name} onChange={e=>set("class_name",e.target.value)} placeholder="8-A"/></div>
        <div className="field"><label>Danışman Öğretmen</label><select value={form.advisor_id} onChange={e=>set("advisor_id",e.target.value)} style={{border:"1px solid #ccd6e4",borderRadius:10,padding:11}}><option value="">Atanmadı</option>{teachers.map(t=><option value={t.id} key={t.id}>{t.full_name} ({t.role})</option>)}</select></div>
      </div>
      <button className="btn" style={{marginTop:16}}>{editing?"Değişiklikleri Kaydet":"Öğrenciyi Ekle"}</button>
      {editing&&students.find(x=>x.id===editing)&&
        <StudentPhotoUpload student={students.find(x=>x.id===editing)} onChanged={load}/>}
    </form>}

    <div className="card">
      <div className="toolbar"><div><h3 style={{margin:0,color:"#123B74"}}>Öğrenciler</h3><div className="muted">{students.length} kayıt</div></div><button className="smallbtn" onClick={load}>Yenile</button></div>
      {loading?<div className="empty">Yükleniyor...</div>:students.length===0?<div className="empty">Henüz öğrenci yok. Yönetici hesabıyla ilk öğrenciyi ekleyebilirsiniz.</div>:
      <div className="student-list">{students.map(s=>{
        const advisor=teachers.find(t=>t.id===s.advisor_id);
        return <div className="student-row" key={s.id}>
          <div style={{display:"flex",alignItems:"center",gap:12}}><StudentPhoto photoPath={s.photo_path} name={s.full_name}/><div><strong>{s.full_name}</strong><div className="muted">No: {s.student_no||"-"}</div></div></div>
          <div><b>{s.class_name||"-"}</b><div className="muted">Sınıf</div></div>
          <div><b>{advisor?.full_name||"Atanmadı"}</b><div className="muted">Danışman</div></div>
          <div style={{display:"flex",gap:8,flexWrap:"wrap"}}><Link className="smallbtn" href={`/rapor?student=${s.id}`}>Rapor</Link>{profile?.role==="admin"&&<><button className="smallbtn orange" onClick={()=>edit(s)}>Düzenle</button><button className="smallbtn red" onClick={()=>remove(s)}>Sil</button></>}</div>
        </div>})}</div>}
    </div>
  </main></>
}
return {default:AdminPage};
})();
const AdminPage=__mod_AdminPage.default;


const __mod_Study=(()=>{


function Study(){
 const sel=useStudentSelection();
 const {profile}=useCurrentProfile();
 const [targets,setTargets]=useState([]),[entry,setEntry]=useState({}),[msg,setMsg]=useState(""),[error,setError]=useState("");
 const isStudent=profile?.role==="student";

 async function load(){
  if(!sel.studentId){setTargets([]);return}
  setError("");
  const {data,error:e}=await supabase.from("assignment_targets")
   .select("id,status,student_id,created_at,assignments(id,target_questions,due_date,notes,subjects(name),learning_outcomes(unit,title,code)),assignment_submissions(id,solved_count,correct_count,wrong_count,blank_count,student_note,updated_at)")
   .eq("student_id",sel.studentId).order("created_at",{ascending:false});
  if(e){setError(e.message);setTargets([]);return}
  const list=data||[];setTargets(list);
  const initial={};
  for(const t of list){
   const s=t.assignment_submissions?.[0];
   initial[t.id]={
    solved_count:s?.solved_count??0,
    correct_count:s?.correct_count??0,
    wrong_count:s?.wrong_count??0,
    blank_count:s?.blank_count??0,
    student_note:s?.student_note??""
   };
  }
  setEntry(initial);
 }
 useEffect(()=>{load()},[sel.studentId]);

 const totals=useMemo(()=>targets.reduce((a,t)=>{
  const s=t.assignment_submissions?.[0];
  return {target:a.target+Number(t.assignments?.target_questions||0),solved:a.solved+Number(s?.solved_count||0),correct:a.correct+Number(s?.correct_count||0),wrong:a.wrong+Number(s?.wrong_count||0),blank:a.blank+Number(s?.blank_count||0)};
 },{target:0,solved:0,correct:0,wrong:0,blank:0}),[targets]);

 function setVal(id,key,val){setEntry(x=>({...x,[id]:{...(x[id]||{}),[key]:val}}))}

 async function saveResult(t){
  if(!isStudent)return;
  setError("");setMsg("");
  const x=entry[t.id]||{};
  const target=Number(t.assignments?.target_questions||0);
  const solved=Number(x.solved_count||0),correct=Number(x.correct_count||0),wrong=Number(x.wrong_count||0),blank=Number(x.blank_count||0);
  if([solved,correct,wrong,blank].some(n=>n<0||!Number.isFinite(n))){setError("Soru sayıları 0 veya daha büyük sayı olmalıdır.");return}
  if(solved>target){setError(`Bu görev ${target} soruluk. Çözülen soru sayısı hedefi aşamaz.`);return}
  if(correct+wrong+blank!==solved){setError("Doğru + yanlış + boş toplamı, çözülen soru sayısına eşit olmalıdır.");return}
  const {error:e}=await supabase.from("assignment_submissions").upsert({
   assignment_target_id:t.id,student_id:t.student_id,solved_count:solved,correct_count:correct,wrong_count:wrong,blank_count:blank,
   student_note:String(x.student_note||"").trim()||null,updated_at:new Date().toISOString()
  },{onConflict:"assignment_target_id,student_id"});
  if(e){setError(e.message);return}
  const status=solved>=target?"completed":solved>0?"in_progress":"pending";
  const {error:te}=await supabase.from("assignment_targets").update({status}).eq("id",t.id);
  if(te){setError(te.message);return}
  setMsg("Çalışma sonucu kaydedildi.");load();
 }

 return <><Header/><main className="container">
  <div className="toolbar"><div><h2>{isStudent?"Çalışmalarım":"Öğrenci Çalışmaları"}</h2><div className="muted">{isStudent?"Öğretmenlerinin sana atadığı çalışmaları tamamladıkça doğru, yanlış ve boş sayılarını gir.":"Öğrenciye atanmış kazanım çalışmalarının gerçekleşme sonuçları."}</div></div>{!isStudent&&<PrintButton label="Çalışmaları Yazdır / PDF"/>}</div>
  {!isStudent&&<StudentBar {...sel} onChange={sel.choose}/>}
  {error&&<div className="card errorbox" style={{marginBottom:16}}>{error}</div>}
  {msg&&<div className="card successbox" style={{marginBottom:16}}>{msg}</div>}

  <section className="grid grid3" style={{marginBottom:18}}>
   <div className="card"><div className="muted">Atanan Toplam Soru</div><div className="stat">{totals.target}</div></div>
   <div className="card"><div className="muted">Çözülen</div><div className="stat">{totals.solved}</div><div className="muted">{totals.correct} doğru • {totals.wrong} yanlış • {totals.blank} boş</div></div>
   <div className="card"><div className="muted">Kalan</div><div className="stat">{Math.max(0,totals.target-totals.solved)}</div></div>
  </section>

  <div className="grid">{targets.map(t=>{
   const sub=t.assignment_submissions?.[0],x=entry[t.id]||{},target=Number(t.assignments?.target_questions||0),solved=Number(sub?.solved_count||0);
   const pct=target?Math.min(100,Math.round(solved/target*100)):0;
   const success=solved?Math.round(Number(sub?.correct_count||0)/solved*100):0;
   return <div className="card" key={t.id}>
    <div className="toolbar"><div>
     <span className={`badge ${t.status==="completed"?"green":""}`}>{t.status==="completed"?"Tamamlandı":t.status==="in_progress"?"Devam Ediyor":"Bekliyor"}</span>
     <h3 style={{color:"#123B74",marginBottom:4}}>{t.assignments?.subjects?.name} — {t.assignments?.learning_outcomes?.title}</h3>
     <div className="muted">{t.assignments?.learning_outcomes?.code?`${t.assignments.learning_outcomes.code} • `:""}{t.assignments?.learning_outcomes?.unit} • Hedef <b>{target} soru</b>{t.assignments?.due_date?` • Son tarih ${t.assignments.due_date}`:""}</div>
     {t.assignments?.notes&&<div className="muted" style={{marginTop:6}}>Öğretmen notu: {t.assignments.notes}</div>}
    </div><div style={{textAlign:"right"}}><div className="stat">%{pct}</div>{sub&&<div className="muted">Başarı %{success}</div>}</div></div>

    <div style={{height:10,background:"#edf1f6",borderRadius:999,overflow:"hidden",margin:"12px 0 16px"}}><div style={{height:"100%",width:`${pct}%`,background:"#123B74"}}/></div>

    {isStudent?<div className="formgrid">
     <div className="field"><label>Çözülen Soru</label><input type="number" min="0" max={target} value={x.solved_count??0} onChange={e=>setVal(t.id,"solved_count",e.target.value)}/></div>
     <div className="field"><label>Doğru</label><input type="number" min="0" value={x.correct_count??0} onChange={e=>setVal(t.id,"correct_count",e.target.value)}/></div>
     <div className="field"><label>Yanlış</label><input type="number" min="0" value={x.wrong_count??0} onChange={e=>setVal(t.id,"wrong_count",e.target.value)}/></div>
     <div className="field"><label>Boş</label><input type="number" min="0" value={x.blank_count??0} onChange={e=>setVal(t.id,"blank_count",e.target.value)}/></div>
     <div className="field" style={{gridColumn:"1/-1"}}><label>Notum (isteğe bağlı)</label><input value={x.student_note??""} onChange={e=>setVal(t.id,"student_note",e.target.value)} placeholder="Takıldığım soru / kısa not..."/></div>
     <button type="button" className="btn orange" onClick={()=>saveResult(t)}>Çalışma Sonucunu Kaydet</button>
    </div>:<div className="grid grid4">
     <div><div className="muted">Çözülen</div><b>{sub?.solved_count||0}</b></div>
     <div><div className="muted">Doğru</div><b>{sub?.correct_count||0}</b></div>
     <div><div className="muted">Yanlış</div><b>{sub?.wrong_count||0}</b></div>
     <div><div className="muted">Boş</div><b>{sub?.blank_count||0}</b></div>
    </div>}
   </div>
  })}{!targets.length&&<div className="empty">{isStudent?"Henüz sana atanmış bir çalışma bulunmuyor.":"Seçili öğrenciye atanmış çalışma bulunmuyor."}</div>}</div>
 </main></>
}
return {default:Study};
})();
const Study=__mod_Study.default;


const __mod_DanismanlikPage=(()=>{

const today=()=>new Date().toISOString().slice(0,10);
function Page(){
 const sel=useStudentSelection();const {user,canEdit,profile}=useCurrentProfile();const [rows,setRows]=useState([]);const [f,setF]=useState({meeting_date:today(),subject:"",summary:"",decisions:"",follow_up_date:"",share_parent:false,parent_note:""});const [error,setError]=useState("");const [msg,setMsg]=useState("");
 async function load(){if(!sel.studentId){setRows([]);return}const {data,error}=await supabase.from("counseling_notes").select("id,meeting_date,subject,summary,decisions,follow_up_date,created_at").eq("student_id",sel.studentId).order("meeting_date",{ascending:false});if(error)setError(error.message);else setRows(data||[])}useEffect(()=>{load()},[sel.studentId]);const set=(k,v)=>setF(x=>({...x,[k]:v}));
 async function add(e){e.preventDefault();const {data:note,error}=await supabase.from("counseling_notes").insert({student_id:sel.studentId,meeting_date:f.meeting_date,subject:f.subject,summary:f.summary,decisions:f.decisions,follow_up_date:f.follow_up_date||null,visible_to_parent:false,created_by:user?.id||null}).select().single();if(error){setError(error.message);return}if(f.share_parent&&f.parent_note.trim()){const {error:se}=await supabase.from("shared_notes").insert({student_id:sel.studentId,source_type:"advisor",source_id:note.id,audience:"parent",title:f.subject||"Danışman Görüşmesi",note:f.parent_note,note_date:f.meeting_date,created_by:user.id});if(se){setError(`Görüşme kaydedildi ancak veli notu eklenemedi: ${se.message}`);return}}setMsg("Görüşme kaydı eklendi.");setF({meeting_date:today(),subject:"",summary:"",decisions:"",follow_up_date:"",share_parent:false,parent_note:""});load()}
 async function remove(id){if(!confirm("Görüşme kaydı silinsin mi?"))return;const {error}=await supabase.from("counseling_notes").delete().eq("id",id);if(error)setError(error.message);else load()}
 return <><Header/><main className="container"><div className="toolbar"><div><h2>Danışmanlık Görüşmeleri</h2>{profile?.role==="coordinator"&&<div className="muted">Salt okunur: Danışmanlık görüşmelerini yalnızca görüntüleyebilirsiniz.</div>}</div><PrintButton label="Görüşmeleri Yazdır / PDF"/></div><StudentBar {...sel} onChange={sel.choose}/>{error&&<div className="card errorbox" style={{marginBottom:16}}>{error}</div>}{msg&&<div className="card successbox" style={{marginBottom:16}}>{msg}</div>}
 {canEdit&&sel.studentId&&<form className="card grid" onSubmit={add} style={{marginBottom:18}}><div className="formgrid"><div className="field"><label>Görüşme Tarihi</label><input type="date" value={f.meeting_date} onChange={e=>set("meeting_date",e.target.value)}/></div><div className="field"><label>Takip Tarihi</label><input type="date" value={f.follow_up_date} onChange={e=>set("follow_up_date",e.target.value)}/></div></div><div className="field"><label>Görüşme Konusu</label><input required value={f.subject} onChange={e=>set("subject",e.target.value)}/></div><div className="field"><label>Görüşme Özeti (özel)</label><textarea rows="5" value={f.summary} onChange={e=>set("summary",e.target.value)}/></div><div className="field"><label>Alınan Kararlar (özel)</label><textarea rows="4" value={f.decisions} onChange={e=>set("decisions",e.target.value)}/></div><label style={{display:"flex",alignItems:"center",gap:8,fontWeight:700}}><input type="checkbox" checked={f.share_parent} onChange={e=>set("share_parent",e.target.checked)}/> Veliye ayrıca paylaşılabilir not gönder</label>{f.share_parent&&<div className="field"><label>Veliye Açık Not</label><textarea rows="3" value={f.parent_note} onChange={e=>set("parent_note",e.target.value)}/></div>}<button className="btn">Görüşmeyi Kaydet</button></form>}
 <div className="grid">{rows.map(r=><div className="card" key={r.id}><div className="toolbar"><div><span className="badge">{r.meeting_date}</span><h3 style={{color:"#123B74",marginBottom:4}}>{r.subject||"Görüşme"}</h3><div className="muted">{r.follow_up_date?`Takip: ${r.follow_up_date}`:""}</div></div>{canEdit&&<button className="smallbtn red" onClick={()=>remove(r.id)}>Sil</button>}</div><p>{r.summary||"Özet yok."}</p>{r.decisions&&<div className="modalish"><b>Alınan kararlar</b><p style={{whiteSpace:"pre-wrap"}}>{r.decisions}</p></div>}</div>)}{!rows.length&&<div className="empty">Henüz görüşme kaydı yok.</div>}</div></main></>
}
return {default:Page};
})();
const DanismanlikPage=__mod_DanismanlikPage.default;


const __mod_Dashboard=(()=>{


const roleText={admin:"Yönetici",coordinator:"Eğitim Koordinatörü",teacher:"Öğretmen / Danışman",counselor:"Rehberlik Öğretmeni",parent:"Veli",student:"Öğrenci"};

function Dashboard(){
  const router=useRouter(); const [profile,setProfile]=useState(null),[students,setStudents]=useState([]),[loading,setLoading]=useState(true),[error,setError]=useState("");
  useEffect(()=>{(async()=>{
    const {data:{user}}=await supabase.auth.getUser(); if(!user){setLoading(false);return}
    const {data:p}=await supabase.from("profiles").select("full_name,role,username").eq("id",user.id).single(); setProfile(p);
    if(p?.role==="parent"){router.replace("/veli");return}
    if(p?.role==="student"){router.replace("/rapor");return}
    const {data:s,error:e}=await supabase.from("students").select("id,student_no,full_name,class_name").order("class_name").order("full_name");
    if(e)setError(e.message);else setStudents(s||[]);setLoading(false);
  })()},[router]);
  const role=profile?.role;
  return <><Header/><main className="container">
    <section className="hero"><span className="badge">{roleText[role]||"Kullanıcı"}</span><h2>Hoş geldiniz{profile?.full_name?`, ${profile.full_name}`:""}</h2><p>{role==="teacher"?"Danışman öğrencileriniz ve ders verdiğiniz sınıflardaki öğrenciler gösterilir.":role==="counselor"?"Rehberlik görüşmeleri ve öğrenci takibi için tüm öğrencileri görüntüleyebilirsiniz.":role==="coordinator"?"Okul genelindeki tüm öğrenci, öğretmen, çalışma ve görüşme verilerini görüntüleyebilirsiniz.":"Öğrenci takip ve yönetim ekranı."}</p></section>
    {error&&<div className="card errorbox" style={{marginTop:18}}>{error}</div>}
    <section className="grid grid3" style={{marginTop:18}}>
      {["admin","coordinator","teacher","counselor"].includes(role)&&<Link href="/gorevler" className="module"><h3>Kazanım Görevleri</h3><div className="muted">{role==="counselor"?"Öğrencilerin görevlerini ders ve kazanım bazında incele.":role==="coordinator"?"Atanmış görevleri ders ve kazanım bazında filtreleyerek izle.":"Hazır kazanımlardan soru hedefi ata ve sonuçları izle."}</div></Link>}
      {["admin","coordinator","counselor"].includes(role)&&<Link href="/rehberlik" className="module"><h3>Rehberlik Görüşmeleri</h3><div className="muted">Görüşme konusu, kararlar ve takip notları.</div></Link>}
      {["admin","coordinator","teacher","counselor"].includes(role)&&<Link href="/denemeler" className="module"><h3>Denemeler</h3><div className="muted">Öğrencilerin LGS deneme sonuçlarını görüntüle ve yazdır.</div></Link>}
      {["admin","coordinator"].includes(role)&&<Link href="/koordinator" className="module"><h3>Koordinatör Paneli</h3><div className="muted">Okul genelindeki takip göstergeleri.</div></Link>}
      {["admin","coordinator","teacher"].includes(role)&&<Link href="/calisma" className="module"><h3>Öğrenci Çalışmaları</h3><div className="muted">Öğrencilerin kendi girdiği soru, doğru, yanlış ve çalışma süreleri.</div></Link>}
    </section>
    <div className="toolbar" style={{marginTop:24}}><div><h2 style={{margin:0,color:"#123B74"}}>Öğrenciler</h2><div className="muted">Yetkiniz dahilindeki öğrenciler</div></div>{role==="admin"&&<Link className="btn" href="/admin">+ Öğrenci Yönetimi</Link>}</div>
    {loading?<div className="empty">Yükleniyor...</div>:students.length===0?<div className="empty">Henüz erişebildiğiniz öğrenci kaydı yok.</div>:<section className="grid grid3">{students.map(s=><Link href={`/students/${s.id}`} className="module" key={s.id}><h3>{s.full_name}</h3><div className="muted">{s.class_name||"-"} • No: {s.student_no||"-"}</div></Link>)}</section>}
  </main></>
}
return {default:Dashboard};
})();
const Dashboard=__mod_Dashboard.default;


const __mod_DenemelerPage=(()=>{

const today=()=>new Date().toISOString().slice(0,10);
const init={exam_name:"",exam_date:today(),turkish_net:"",math_net:"",science_net:"",history_net:"",religion_net:"",english_net:""};
function Page(){const sel=useStudentSelection();const {user,canEdit,profile}=useCurrentProfile();const [rows,setRows]=useState([]);const [f,setF]=useState(init);const [error,setError]=useState("");const [msg,setMsg]=useState("");
 async function load(){if(!sel.studentId){setRows([]);return}const {data,error}=await supabase.from("mock_exams").select("*").eq("student_id",sel.studentId).order("exam_date",{ascending:false}).limit(60);if(error)setError(error.message);else setRows(data||[])} useEffect(()=>{load()},[sel.studentId]);const set=(k,v)=>setF(x=>({...x,[k]:v}));
 async function add(e){e.preventDefault();const p={student_id:sel.studentId,exam_name:f.exam_name.trim(),exam_date:f.exam_date,turkish_net:Number(f.turkish_net||0),math_net:Number(f.math_net||0),science_net:Number(f.science_net||0),history_net:Number(f.history_net||0),religion_net:Number(f.religion_net||0),english_net:Number(f.english_net||0),created_by:user?.id||null};const {error}=await supabase.from("mock_exams").insert(p);if(error){setError(error.message);return}setMsg("Deneme sonucu eklendi.");setF(init);load()}
 async function remove(id){if(!confirm("Deneme sonucu silinsin mi?"))return;const {error}=await supabase.from("mock_exams").delete().eq("id",id);if(error)setError(error.message);else load()}
 return <><Header/><main className="container"><div className="toolbar"><div><h2>LGS Denemeleri</h2>{["coordinator","counselor"].includes(profile?.role)&&<div className="muted">Deneme sonuçlarını görüntüleyebilir ve yazdırabilirsiniz. Bu rolde deneme ekleme/silme kapalıdır.</div>}</div><PrintButton label="Denemeleri Yazdır / PDF"/></div><StudentBar {...sel} onChange={sel.choose}/>{error&&<div className="card errorbox" style={{marginBottom:16}}>{error}</div>}{msg&&<div className="card successbox" style={{marginBottom:16}}>{msg}</div>}
 {canEdit&&sel.studentId&&<form className="card" onSubmit={add} style={{marginBottom:18}}><div className="formgrid"><div className="field"><label>Deneme Adı</label><input required value={f.exam_name} onChange={e=>set("exam_name",e.target.value)}/></div><div className="field"><label>Tarih</label><input type="date" value={f.exam_date} onChange={e=>set("exam_date",e.target.value)}/></div>{[["turkish_net","Türkçe Net"],["math_net","Matematik Net"],["science_net","Fen Net"],["history_net","İnkılap Net"],["religion_net","Din Net"],["english_net","İngilizce Net"]].map(([k,l])=><div className="field" key={k}><label>{l}</label><input type="number" step="0.01" value={f[k]} onChange={e=>set(k,e.target.value)}/></div>)}</div><button className="btn" style={{marginTop:14}}>Denemeyi Kaydet</button></form>}
 <div className="card table"><table><thead><tr><th>Deneme</th><th>Tarih</th><th>Türkçe</th><th>Mat.</th><th>Fen</th><th>İnk.</th><th>Din</th><th>İng.</th><th>Toplam</th>{canEdit&&<th></th>}</tr></thead><tbody>{rows.map(r=><tr key={r.id}><td>{r.exam_name}</td><td>{r.exam_date}</td><td>{r.turkish_net}</td><td>{r.math_net}</td><td>{r.science_net}</td><td>{r.history_net}</td><td>{r.religion_net}</td><td>{r.english_net}</td><td><b>{Number(r.total_net||0).toFixed(2)}</b></td>{canEdit&&<td><button className="smallbtn red" onClick={()=>remove(r.id)}>Sil</button></td>}</tr>)}{!rows.length&&<tr><td colSpan={canEdit?10:9}>Henüz deneme kaydı yok.</td></tr>}</tbody></table></div></main></>}
return {default:Page};
})();
const DenemelerPage=__mod_DenemelerPage.default;


const __mod_Assignments=(()=>{


function Assignments(){
  const sel=useStudentSelection();
  const {profile,user}=useCurrentProfile();

  const [subjects,setSubjects]=useState([]);
  const [outcomes,setOutcomes]=useState([]);
  const [targets,setTargets]=useState([]);

  const [subjectFilter,setSubjectFilter]=useState("");
  const [outcomeFilter,setOutcomeFilter]=useState("");

  const [f,setF]=useState({
    subject_id:"",
    outcome_id:"",
    target_questions:20,
    due_date:"",
    notes:""
  });

  const [toClass,setToClass]=useState(false);
  const [msg,setMsg]=useState("");
  const [error,setError]=useState("");

  const canView=["admin","coordinator","teacher","counselor"].includes(profile?.role);
  const canAssign=["admin","teacher"].includes(profile?.role);
  const readOnly=["coordinator","counselor"].includes(profile?.role);

  useEffect(()=>{
    supabase
      .from("subjects")
      .select("id,name")
      .eq("active",true)
      .order("sort_order")
      .then(({data})=>setSubjects(data||[]));
  },[]);

  useEffect(()=>{
    if(!f.subject_id){
      setOutcomes([]);
      return;
    }
    supabase
      .from("learning_outcomes")
      .select("id,unit,title,code")
      .eq("subject_id",f.subject_id)
      .eq("active",true)
      .order("unit")
      .then(({data})=>setOutcomes(data||[]));
  },[f.subject_id]);

  async function load(){
    if(!sel.studentId){
      setTargets([]);
      return;
    }

    setError("");

    const {data,error}=await supabase
      .from("assignment_targets")
      .select("id,status,student_id,assignment_id,created_at,assignments(id,title,target_questions,due_date,notes,subject_id,outcome_id,created_by,subjects(name),learning_outcomes(unit,title,code)),assignment_submissions(id,solved_count,correct_count,wrong_count,blank_count,student_note,updated_at)")
      .eq("student_id",sel.studentId)
      .order("created_at",{ascending:false});

    if(error){
      setError(error.message);
      setTargets([]);
    }else{
      setTargets(data||[]);
    }
  }

  useEffect(()=>{
    setSubjectFilter("");
    setOutcomeFilter("");
    load();
  },[sel.studentId]);

  const filterSubjects=useMemo(()=>{
    const map=new Map();
    for(const t of targets){
      const id=t.assignments?.subject_id;
      const name=t.assignments?.subjects?.name;
      if(id&&name) map.set(id,name);
    }
    return [...map.entries()]
      .map(([id,name])=>({id,name}))
      .sort((a,b)=>a.name.localeCompare(b.name,"tr"));
  },[targets]);

  const filterOutcomes=useMemo(()=>{
    const map=new Map();
    for(const t of targets){
      if(subjectFilter && t.assignments?.subject_id!==subjectFilter) continue;
      const id=t.assignments?.outcome_id;
      const outcome=t.assignments?.learning_outcomes;
      if(id&&outcome){
        map.set(id,{
          id,
          unit:outcome.unit||"",
          title:outcome.title||"",
          code:outcome.code||""
        });
      }
    }
    return [...map.values()].sort((a,b)=>{
      const left=`${a.unit} ${a.title}`;
      const right=`${b.unit} ${b.title}`;
      return left.localeCompare(right,"tr");
    });
  },[targets,subjectFilter]);

  useEffect(()=>{
    if(!outcomeFilter)return;
    const exists=filterOutcomes.some(x=>x.id===outcomeFilter);
    if(!exists)setOutcomeFilter("");
  },[subjectFilter,filterOutcomes,outcomeFilter]);

  const filteredTargets=useMemo(()=>{
    return targets.filter(t=>{
      if(subjectFilter && t.assignments?.subject_id!==subjectFilter)return false;
      if(outcomeFilter && t.assignments?.outcome_id!==outcomeFilter)return false;
      return true;
    });
  },[targets,subjectFilter,outcomeFilter]);

  function clearFilters(){
    setSubjectFilter("");
    setOutcomeFilter("");
  }

  async function deleteAssignment(t){
    setError("");
    setMsg("");

    const assignmentId=t?.assignments?.id;
    if(!assignmentId)return;

    const isAdmin=profile?.role==="admin";
    const isOwner=profile?.role==="teacher" && t?.assignments?.created_by===user?.id;

    if(!isAdmin&&!isOwner){
      setError("Bu görevi silme yetkiniz yok.");
      return;
    }

    const name=`${t.assignments?.subjects?.name||"Görev"} — ${t.assignments?.learning_outcomes?.title||""}`;

    if(!confirm(
      `${name}\n\nBu görev silinsin mi?\nÖğrencinin bu göreve ait doğru/yanlış/boş sonucu da silinecektir.`
    ))return;

    const {error:e}=await supabase
      .from("assignments")
      .delete()
      .eq("id",assignmentId);

    if(e){
      setError(e.message);
      return;
    }

    setMsg("Görev ve bu göreve ait öğrenci sonucu silindi.");
    await load();
  }

  async function assign(e){
    e.preventDefault();
    setError("");
    setMsg("");

    if(!canAssign||!sel.studentId)return;

    const subject=subjects.find(x=>x.id===f.subject_id);
    const outcome=outcomes.find(x=>x.id===f.outcome_id);

    const {data:{user}}=await supabase.auth.getUser();

    const {data:a,error:ae}=await supabase
      .from("assignments")
      .insert({
        created_by:user.id,
        subject_id:f.subject_id,
        outcome_id:f.outcome_id,
        title:`${subject?.name||""} - ${outcome?.title||"Kazanım"}`,
        target_questions:Number(f.target_questions),
        due_date:f.due_date||null,
        notes:f.notes||null
      })
      .select()
      .single();

    if(ae){
      setError(ae.message);
      return;
    }

    const targetStudents=
      toClass&&sel.student?.class_name
        ? sel.students.filter(x=>x.class_name===sel.student.class_name)
        : [sel.student];

    const payload=targetStudents
      .filter(Boolean)
      .map(x=>({
        assignment_id:a.id,
        student_id:x.id,
        status:"pending"
      }));

    const {error:te}=await supabase
      .from("assignment_targets")
      .insert(payload);

    if(te){
      setError(te.message);
      return;
    }

    setMsg(
      toClass
        ? `${sel.student?.class_name} sınıfındaki ${payload.length} öğrenciye görev atandı.`
        : "Kazanım görevi öğrenciye atandı."
    );

    setF({
      subject_id:"",
      outcome_id:"",
      target_questions:20,
      due_date:"",
      notes:""
    });
    setToClass(false);
    load();
  }

  if(profile&&!canView){
    return <><Header/><main className="container">
      <div className="card errorbox">Bu bölüme erişim yetkiniz yok.</div>
    </main></>;
  }

  const pageTitle=readOnly ? "Kazanım Görevleri" : "Kazanım Görevi Ata";
  const pageDescription=
    profile?.role==="coordinator"
      ? "Salt okunur: Öğrencinin atanmış görevlerini ders ve kazanım bazında filtreleyebilirsiniz."
      : profile?.role==="counselor"
        ? "Rehberlik görünümü: Öğrencinin atanmış görevlerini ders ve kazanım bazında inceleyebilirsiniz."
        : "Öğretmen hazır kazanımı seçip hedef soru sayısını belirler; mevcut görevleri ders ve kazanım bazında filtreleyebilir.";

  return <><Header/><main className="container">
    <div className="toolbar">
      <div>
        <h2>{pageTitle}</h2>
        <div className="muted">{pageDescription}</div>
      </div>
      <PrintButton label="Görevleri Yazdır / PDF"/>
    </div>

    <StudentBar {...sel} onChange={sel.choose}/>

    {error&&<div className="card errorbox" style={{marginBottom:16}}>{error}</div>}
    {msg&&<div className="card successbox" style={{marginBottom:16}}>{msg}</div>}

    {canAssign&&sel.studentId&&<form className="card" onSubmit={assign} style={{marginBottom:18}}>
      <h3 style={{marginTop:0,color:"#123B74"}}>Yeni Kazanım Görevi</h3>

      <div className="formgrid">
        <div className="field">
          <label>Ders *</label>
          <select
            required
            value={f.subject_id}
            onChange={e=>setF({...f,subject_id:e.target.value,outcome_id:""})}
            style={{border:"1px solid #ccd6e4",borderRadius:10,padding:11}}
          >
            <option value="">Seçiniz</option>
            {subjects.map(x=><option key={x.id} value={x.id}>{x.name}</option>)}
          </select>
        </div>

        <div className="field">
          <label>Kazanım *</label>
          <select
            required
            value={f.outcome_id}
            onChange={e=>setF({...f,outcome_id:e.target.value})}
            style={{border:"1px solid #ccd6e4",borderRadius:10,padding:11}}
          >
            <option value="">Seçiniz</option>
            {outcomes.map(x=><option key={x.id} value={x.id}>
              {x.code?`${x.code} • `:""}{x.unit} — {x.title}
            </option>)}
          </select>
        </div>

        <div className="field">
          <label>Hedef Soru *</label>
          <input
            required
            min="1"
            type="number"
            value={f.target_questions}
            onChange={e=>setF({...f,target_questions:e.target.value})}
          />
        </div>

        <div className="field">
          <label>Son Tarih</label>
          <input
            type="date"
            value={f.due_date}
            onChange={e=>setF({...f,due_date:e.target.value})}
          />
        </div>

        <div className="field" style={{gridColumn:"1/-1"}}>
          <label>Öğretmen Notu</label>
          <input
            value={f.notes}
            onChange={e=>setF({...f,notes:e.target.value})}
          />
        </div>
      </div>

      <label style={{display:"block",marginTop:14}}>
        <input
          type="checkbox"
          checked={toClass}
          onChange={e=>setToClass(e.target.checked)}
        />{" "}
        Seçili öğrencinin sınıfındaki ({sel.student?.class_name||"-"}) tüm erişebildiğim öğrencilere ata
      </label>

      <button className="btn" style={{marginTop:14}}>Görevi Ata</button>
    </form>}

    {sel.studentId&&<section className="card no-print" style={{marginBottom:18}}>
      <div className="toolbar" style={{marginBottom:12}}>
        <div>
          <h3 style={{margin:0,color:"#123B74"}}>Görevleri Filtrele</h3>
          <div className="muted">
            {filteredTargets.length} / {targets.length} görev gösteriliyor
          </div>
        </div>

        {(subjectFilter||outcomeFilter)&&
          <button type="button" className="smallbtn" onClick={clearFilters}>
            Filtreyi Temizle
          </button>}
      </div>

      <div className="formgrid">
        <div className="field">
          <label>Ders</label>
          <select
            value={subjectFilter}
            onChange={e=>{
              setSubjectFilter(e.target.value);
              setOutcomeFilter("");
            }}
            style={{border:"1px solid #ccd6e4",borderRadius:10,padding:11}}
          >
            <option value="">Tüm Dersler</option>
            {filterSubjects.map(x=>
              <option key={x.id} value={x.id}>{x.name}</option>
            )}
          </select>
        </div>

        <div className="field">
          <label>Kazanım</label>
          <select
            value={outcomeFilter}
            onChange={e=>setOutcomeFilter(e.target.value)}
            style={{border:"1px solid #ccd6e4",borderRadius:10,padding:11}}
          >
            <option value="">Tüm Kazanımlar</option>
            {filterOutcomes.map(x=>
              <option key={x.id} value={x.id}>
                {x.code?`${x.code} • `:""}{x.unit} — {x.title}
              </option>
            )}
          </select>
        </div>
      </div>
    </section>}

    <div className="grid">
      {filteredTargets.map(t=>{
        const sub=t.assignment_submissions?.[0];
        const target=Number(t.assignments?.target_questions||0);
        const solved=Number(sub?.solved_count||0);
        const pct=target
          ? Math.min(100,Math.round(solved/target*100))
          : 0;

        return <div className="card" key={t.id}>
          <div className="toolbar">
            <div>
              <span className="badge">{t.status}</span>
              <h3 style={{color:"#123B74",marginBottom:4}}>
                {t.assignments?.subjects?.name} — {t.assignments?.learning_outcomes?.title}
              </h3>
              <div className="muted">
                {t.assignments?.learning_outcomes?.code
                  ? `${t.assignments.learning_outcomes.code} • `
                  : ""}
                {t.assignments?.learning_outcomes?.unit}
                {" • "}Hedef: <b>{target} soru</b>
                {t.assignments?.due_date
                  ? ` • Son tarih: ${t.assignments.due_date}`
                  : ""}
              </div>
            </div>
            <div className="stat">%{pct}</div>
          </div>

          <div className="muted">
            {sub
              ? `Öğrenci girişi: ${sub.solved_count} çözüldü • ${sub.correct_count} doğru • ${sub.wrong_count} yanlış • ${sub.blank_count} boş`
              : "Öğrenci henüz sonuç girmedi."}
          </div>

          {(profile?.role==="admin" ||
            (profile?.role==="teacher" && t.assignments?.created_by===user?.id))&&
            <div className="no-print" style={{marginTop:14,display:"flex",justifyContent:"flex-end"}}>
              <button
                type="button"
                className="smallbtn red"
                onClick={()=>deleteAssignment(t)}
              >
                Görevi Sil
              </button>
            </div>}
        </div>;
      })}

      {sel.studentId&&!filteredTargets.length&&
        <div className="empty">
          {targets.length
            ? "Seçtiğiniz ders/kazanım filtresine uygun görev bulunamadı."
            : "Seçili öğrenci için kazanım görevi bulunmuyor."}
        </div>}

      {!sel.studentId&&
        <div className="empty">Görevleri görüntülemek için öğrenci seçin.</div>}
    </div>
  </main></>;
}
return {default:Assignments};
})();
const Assignments=__mod_Assignments.default;


const __mod_HedeflerPage=(()=>{

function Page(){const sel=useStudentSelection();const {user,canEdit,profile}=useCurrentProfile();const [rows,setRows]=useState([]);const [f,setF]=useState({goal_type:"Toplam Net",title:"",target_value:"",current_value:"",note:""});const [error,setError]=useState("");const [msg,setMsg]=useState("");
 async function load(){if(!sel.studentId){setRows([]);return}const {data,error}=await supabase.from("goals").select("id,goal_type,title,target_value,current_value,note,created_at").eq("student_id",sel.studentId).order("created_at",{ascending:false});if(error)setError(error.message);else setRows(data||[])}useEffect(()=>{load()},[sel.studentId]);const set=(k,v)=>setF(x=>({...x,[k]:v}));
 async function add(e){e.preventDefault();const {error}=await supabase.from("goals").insert({student_id:sel.studentId,goal_type:f.goal_type,title:f.title.trim(),target_value:f.target_value===""?null:Number(f.target_value),current_value:f.current_value===""?null:Number(f.current_value),note:f.note,created_by:user?.id||null});if(error){setError(error.message);return}setMsg("Hedef eklendi.");setF({goal_type:"Toplam Net",title:"",target_value:"",current_value:"",note:""});load()}
 async function remove(id){if(!confirm("Hedef silinsin mi?"))return;const {error}=await supabase.from("goals").delete().eq("id",id);if(error)setError(error.message);else load()}
 return <><Header/><main className="container"><div className="toolbar"><div><h2>Hedefler</h2>{profile?.role==="coordinator"&&<div className="muted">Hedefleri yalnızca görüntüleyebilirsiniz.</div>}</div><PrintButton label="Hedefleri Yazdır / PDF"/></div><StudentBar {...sel} onChange={sel.choose}/>{error&&<div className="card errorbox" style={{marginBottom:16}}>{error}</div>}{msg&&<div className="card successbox" style={{marginBottom:16}}>{msg}</div>}
 {canEdit&&sel.studentId&&<form className="card" onSubmit={add} style={{marginBottom:18}}><div className="formgrid"><div className="field"><label>Hedef Türü</label><select value={f.goal_type} onChange={e=>set("goal_type",e.target.value)} style={{border:"1px solid #ccd6e4",borderRadius:10,padding:11}}>{["Hedef Okul","Yüzdelik Dilim","Toplam Net","Ders Neti","Haftalık Soru","Çalışma Süresi"].map(x=><option key={x}>{x}</option>)}</select></div><div className="field"><label>Hedef Başlığı</label><input required value={f.title} onChange={e=>set("title",e.target.value)} placeholder="Örn. LGS toplam net"/></div><div className="field"><label>Hedef Değer</label><input type="number" step="0.01" value={f.target_value} onChange={e=>set("target_value",e.target.value)}/></div><div className="field"><label>Mevcut Değer</label><input type="number" step="0.01" value={f.current_value} onChange={e=>set("current_value",e.target.value)}/></div><div className="field" style={{gridColumn:"1/-1"}}><label>Not</label><input value={f.note} onChange={e=>set("note",e.target.value)}/></div></div><button className="btn" style={{marginTop:14}}>Hedefi Kaydet</button></form>}
 <section className="grid grid2">{rows.map(r=>{const pct=r.target_value?Math.min(100,Math.round(Number(r.current_value||0)/Number(r.target_value)*100)):null;return <div className="card" key={r.id}><div className="toolbar"><div><span className="badge">{r.goal_type||"Hedef"}</span><h3 style={{color:"#123B74",marginBottom:4}}>{r.title}</h3></div>{canEdit&&<button className="smallbtn red" onClick={()=>remove(r.id)}>Sil</button>}</div><div className="stat" style={{fontSize:24}}>{r.current_value??"-"} / {r.target_value??"-"}</div>{pct!=null&&<div className="muted">Gerçekleşme: %{pct}</div>} {r.note&&<p className="muted">{r.note}</p>}</div>})}{!rows.length&&<div className="empty">Henüz hedef yok.</div>}</section></main></>}
return {default:Page};
})();
const HedeflerPage=__mod_HedeflerPage.default;


const __mod_Coordinator=(()=>{


function Coordinator(){
 const {profile}=useCurrentProfile();const [stats,setStats]=useState({students:0,teachers:0,week:0,pending:0,guidance:0});const [recent,setRecent]=useState([]);
 useEffect(()=>{(async()=>{if(!["admin","coordinator"].includes(profile?.role))return;const since=new Date();since.setDate(since.getDate()-7);const iso=since.toISOString().slice(0,10);const [s,t,w,p,g,r]=await Promise.all([
  supabase.from("students").select("*",{count:"exact",head:true}),supabase.from("profiles").select("*",{count:"exact",head:true}).eq("role","teacher").eq("active",true),supabase.from("weekly_study").select("*",{count:"exact",head:true}).gte("study_date",iso),supabase.from("assignment_targets").select("*",{count:"exact",head:true}).neq("status","completed"),supabase.from("guidance_sessions").select("*",{count:"exact",head:true}).gte("meeting_date",iso),supabase.from("weekly_study").select("id,study_date,subject,question_count,students(full_name,class_name)").order("created_at",{ascending:false}).limit(15)
 ]);setStats({students:s.count||0,teachers:t.count||0,week:w.count||0,pending:p.count||0,guidance:g.count||0});setRecent(r.data||[])})()},[profile?.role]);
 if(profile&&!["admin","coordinator"].includes(profile.role))return <><Header/><main className="container"><div className="card errorbox">Bu bölüm yalnızca eğitim koordinatörü ve yönetici içindir.</div></main></>;
 return <><Header/><main className="container"><section className="hero"><span className="badge">Eğitim Koordinatörü</span><h2>Okul Geneli Takip Paneli</h2><p>Tüm öğrencilerin çalışma, görev, rehberlik ve öğretmen takibini tek ekrandan izleyin.</p></section>
 <section className="grid grid3" style={{marginTop:18}}><div className="card"><div className="muted">Toplam Öğrenci</div><div className="stat">{stats.students}</div></div><div className="card"><div className="muted">Öğretmen</div><div className="stat">{stats.teachers}</div></div><div className="card"><div className="muted">Son 7 Gün Çalışma Kaydı</div><div className="stat">{stats.week}</div></div><div className="card"><div className="muted">Açık Kazanım Görevi</div><div className="stat">{stats.pending}</div></div><div className="card"><div className="muted">Son 7 Gün Rehberlik Görüşmesi</div><div className="stat">{stats.guidance}</div></div></section>
 <section className="card table" style={{marginTop:18}}><h3 style={{color:"#123B74"}}>Son Öğrenci Çalışmaları</h3><table><thead><tr><th>Tarih</th><th>Öğrenci</th><th>Sınıf</th><th>Ders</th><th>Soru</th></tr></thead><tbody>{recent.map(x=><tr key={x.id}><td>{x.study_date}</td><td>{x.students?.full_name}</td><td>{x.students?.class_name}</td><td>{x.subject}</td><td>{x.question_count}</td></tr>)}</tbody></table></section>
 </main></>
}
return {default:Coordinator};
})();
const Coordinator=__mod_Coordinator.default;


const __mod_Login=(()=>{


function Login(){
  const router=useRouter();
  const [username,setUsername]=useState("");
  const [password,setPassword]=useState("");
  const [msg,setMsg]=useState("");
  const [loading,setLoading]=useState(false);

  useEffect(()=>{
    if(!isSupabaseConfigured)return;
    supabase.auth.getSession().then(({data})=>{if(data?.session)router.replace("/dashboard")});
  },[router]);

  async function go(e){
    e.preventDefault(); setMsg("");
    if(!isSupabaseConfigured){setMsg("Supabase bağlantısı algılanmadı.");return}
    if(!username.trim()||!password){setMsg("Kullanıcı adı ve şifre zorunludur.");return}
    setLoading(true);
    try{
      const res=await fetch("/api/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username,password})});
      const data=await res.json();
      if(!res.ok) throw new Error(data.error||"Giriş başarısız.");
      const {error}=await supabase.auth.setSession({access_token:data.access_token,refresh_token:data.refresh_token});
      if(error) throw error;
      router.replace("/dashboard");
    }catch(e){setMsg(e.message||"Kullanıcı adı veya şifre hatalı.")}
    finally{setLoading(false)}
  }

  return <div className="login"><div className="loginbox">
    <img src="/logo.png" alt="İlkem Koleji"/>
    <h2 style={{textAlign:"center",color:"#123B74"}}>LGS Öğrenci Takip Sistemi</h2>
    <p className="muted" style={{textAlign:"center"}}>Yönetici • Eğitim Koordinatörü • Öğretmen • Rehberlik • Veli • Öğrenci</p>
    <form className="grid" onSubmit={go}>
      <div className="field"><label>Kullanıcı Adı</label><input value={username} onChange={e=>setUsername(e.target.value)} autoComplete="username" placeholder="Örn. umit.zengin"/></div>
      <div className="field"><label>Şifre</label><input type="password" value={password} onChange={e=>setPassword(e.target.value)} autoComplete="current-password"/></div>
      {msg&&<div style={{color:"#b42318",fontWeight:700}}>{msg}</div>}
      <button className="btn" disabled={loading}>{loading?"Giriş yapılıyor...":"Giriş Yap"}</button>
    </form>
  </div></div>
}
return {default:Login};
})();
const Login=__mod_Login.default;


const __mod_Report=(()=>{


function Report(){
  const sel=useStudentSelection(); const {profile}=useCurrentProfile();
  const [exams,setExams]=useState([]),[goals,setGoals]=useState([]),[tasks,setTasks]=useState([]),[guidance,setGuidance]=useState([]),[advisor,setAdvisor]=useState(""),[error,setError]=useState("");
  useEffect(()=>{(async()=>{
    if(!sel.studentId){setTasks([]);return}setError("");
    const [e,g,t,rg]=await Promise.all([
      supabase.from("mock_exams").select("id,exam_name,exam_date,total_net,turkish_net,math_net,science_net,history_net,religion_net,english_net").eq("student_id",sel.studentId).order("exam_date",{ascending:false}).limit(10),
      supabase.from("goals").select("id,goal_type,title,target_value,current_value,note").eq("student_id",sel.studentId).order("created_at",{ascending:false}).limit(10),
      supabase.from("assignment_targets").select("id,status,created_at,assignments(target_questions,due_date,subjects(name),learning_outcomes(unit,title)),assignment_submissions(solved_count,correct_count,wrong_count,blank_count,updated_at)").eq("student_id",sel.studentId).order("created_at",{ascending:false}).limit(100),
      supabase.from("shared_notes").select("id,note_date,title,note,source_type,audience").eq("student_id",sel.studentId).order("note_date",{ascending:false}).limit(10)
    ]);
    const er=[e,g,t,rg].find(x=>x.error)?.error;if(er)setError(er.message);
    setExams(e.data||[]);setGoals(g.data||[]);setTasks(t.data||[]);setGuidance(rg.data||[]);
    if(sel.student?.advisor_id){const {data:a}=await supabase.from("profiles").select("full_name").eq("id",sel.student.advisor_id).maybeSingle();setAdvisor(a?.full_name||"")}else setAdvisor("");
  })()},[sel.studentId,sel.student?.advisor_id]);

  const stats=useMemo(()=>{
    const since=Date.now()-30*24*60*60*1000;
    return tasks.reduce((a,t)=>{
      const s=t.assignment_submissions?.[0];
      if(!s||!s.updated_at||new Date(s.updated_at).getTime()<since)return a;
      return {q:a.q+Number(s.solved_count||0),d:a.d+Number(s.correct_count||0),y:a.y+Number(s.wrong_count||0),b:a.b+Number(s.blank_count||0)};
    },{q:0,d:0,y:0,b:0});
  },[tasks]);
  const last=exams[0],completed=tasks.filter(x=>x.status==="completed").length;

  return <><Header/><main className="container">
    <div className="toolbar"><div><h2>{profile?.role==="student"?"Öğrenci Raporum":profile?.role==="parent"?"Öğrenci Gelişim Raporu":"Öğrenci Raporu"}</h2><div className="muted">Atanmış çalışmalar, kazanım performansı, denemeler ve hedefler</div></div><PrintButton label="Raporu Yazdır / PDF"/></div>
    {profile?.role!=="student"&&<StudentBar {...sel} onChange={sel.choose}/>}
    {error&&<div className="card errorbox" style={{marginBottom:16}}>{error}</div>}
    {sel.student&&<section className="hero"><div style={{display:"flex",alignItems:"center",gap:18,flexWrap:"wrap"}}>
      <StudentPhoto photoPath={sel.student.photo_path} name={sel.student.full_name} size={96}/>
      <div><span className="badge">{sel.student.class_name||"LGS"}</span><h2>{sel.student.full_name}</h2><p>No: {sel.student.student_no||"-"} • Danışman: {advisor||"Atanmadı"}</p></div>
    </div></section>}
    <section className="grid grid3" style={{marginTop:18}}>
     <div className="card"><div className="muted">Son 30 Gün Çözülen</div><div className="stat">{stats.q}</div><div className="muted">{stats.d} doğru • {stats.y} yanlış • {stats.b} boş</div></div>
     <div className="card"><div className="muted">Kazanım Görevleri</div><div className="stat">{completed}/{tasks.length}</div><div className="muted">tamamlandı / toplam</div></div>
     <div className="card"><div className="muted">Son Deneme</div><div className="stat">{last?.total_net!=null?Number(last.total_net).toFixed(2):"-"}</div><div className="muted">{last?.exam_name||"Kayıt yok"}</div></div>
    </section>
    <section className="grid grid2" style={{marginTop:18}}>
      <div className="card"><h3 style={{color:"#123B74",marginTop:0}}>Kazanım Çalışmaları</h3>{tasks.length?tasks.slice(0,12).map(x=>{const s=x.assignment_submissions?.[0];const target=Number(x.assignments?.target_questions||0),solved=Number(s?.solved_count||0);return <div className="metricline" key={x.id}><div><b>{x.assignments?.subjects?.name}</b><div className="muted">{x.assignments?.learning_outcomes?.title}</div></div><div style={{textAlign:"right"}}><b>{solved}/{target} soru</b><div className="muted">{s?`${s.correct_count}D / ${s.wrong_count}Y / ${s.blank_count}B`:"Sonuç bekleniyor"}</div></div></div>}):<div className="muted">Görev yok.</div>}</div>
      <div className="card"><h3 style={{color:"#123B74",marginTop:0}}>Hedefler</h3>{goals.length?goals.map(g=><div className="metricline" key={g.id}><div><b>{g.title}</b><div className="muted">{g.goal_type||"Hedef"}</div></div><b>{g.current_value??"-"} / {g.target_value??"-"}</b></div>):<div className="muted">Hedef kaydı yok.</div>}</div>
    </section>
    <section className="card table" style={{marginTop:18}}><h3 style={{color:"#123B74"}}>Son Denemeler</h3><table><thead><tr><th>Tarih</th><th>Deneme</th><th>Türkçe</th><th>Mat.</th><th>Fen</th><th>İnk.</th><th>Din</th><th>İng.</th><th>Toplam</th></tr></thead><tbody>{exams.map(x=><tr key={x.id}><td>{x.exam_date}</td><td>{x.exam_name}</td><td>{x.turkish_net}</td><td>{x.math_net}</td><td>{x.science_net}</td><td>{x.history_net}</td><td>{x.religion_net}</td><td>{x.english_net}</td><td><b>{Number(x.total_net||0).toFixed(2)}</b></td></tr>)}{!exams.length&&<tr><td colSpan="9">Deneme kaydı yok.</td></tr>}</tbody></table></section>
    {guidance.length>0&&<section className="card" style={{marginTop:18}}><h3 style={{color:"#123B74"}}>Paylaşıma Açık Notlar</h3>{guidance.map(x=><div className="metricline" key={x.id}><div><b>{x.title||"Paylaşılan Not"}</b><div className="muted">{x.note_date} • {x.source_type==="guidance"?"Rehberlik":"Danışmanlık"}</div></div><div>{x.note}</div></div>)}</section>}
  </main></>
}
return {default:Report};
})();
const Report=__mod_Report.default;


const __mod_Guidance=(()=>{


function Guidance(){
 const sel=useStudentSelection();const {profile}=useCurrentProfile();const [rows,setRows]=useState([]),[error,setError]=useState(""),[msg,setMsg]=useState("");
 const [f,setF]=useState({meeting_date:new Date().toISOString().slice(0,10),topic:"",summary:"",decisions:"",follow_up_date:"",private_note:"",shared_note:"",share_advisor:true,share_student:false,share_parent:false});
 const allowed=["admin","coordinator","counselor"].includes(profile?.role);
 const canCreate=["admin","counselor"].includes(profile?.role);
 async function load(){if(!sel.studentId){setRows([]);return}const {data,error}=await supabase.from("guidance_sessions").select("*,profiles!guidance_sessions_counselor_id_fkey(full_name)").eq("student_id",sel.studentId).order("meeting_date",{ascending:false});if(error)setError(error.message);else setRows(data||[])}
 useEffect(()=>{load()},[sel.studentId]);
 async function add(e){
  e.preventDefault();setError("");setMsg("");if(!sel.studentId)return;
  const {data:{user}}=await supabase.auth.getUser();
  const {data:session,error}=await supabase.from("guidance_sessions").insert({student_id:sel.studentId,counselor_id:user.id,meeting_date:f.meeting_date,topic:f.topic,summary:f.summary,decisions:f.decisions,follow_up_date:f.follow_up_date||null,private_note:f.private_note,visible_to_advisor:false,visible_to_student:false,visible_to_parent:false}).select().single();
  if(error){setError(error.message);return}
  const audiences=[];if(f.share_advisor)audiences.push("advisor");if(f.share_student)audiences.push("student");if(f.share_parent)audiences.push("parent");
  if(f.shared_note.trim()&&audiences.length){const payload=audiences.map(a=>({student_id:sel.studentId,source_type:"guidance",source_id:session.id,audience:a,title:f.topic,note:f.shared_note,note_date:f.meeting_date,created_by:user.id}));const {error:se}=await supabase.from("shared_notes").insert(payload);if(se){setError(`Görüşme kaydedildi ancak paylaşım notu eklenemedi: ${se.message}`);load();return}}
  setMsg("Rehberlik görüşmesi kaydedildi.");setF({...f,topic:"",summary:"",decisions:"",follow_up_date:"",private_note:"",shared_note:""});load();
 }
 if(profile&&!allowed)return <><Header/><main className="container"><div className="card errorbox">Bu bölüme erişim yetkiniz yok.</div></main></>;
 return <><Header/><main className="container"><div className="toolbar"><div><h2>Rehberlik Görüşmeleri</h2><div className="muted">{profile?.role==="coordinator"?"Salt okunur: Rehberlik görüşme kayıtlarını görüntülüyorsunuz.":"Özel görüşme kaydı ile paylaşılabilir not birbirinden ayrı tutulur."}</div><PrintButton label="Görüşmeleri Yazdır / PDF"/></div></div>
 <StudentBar {...sel} onChange={sel.choose}/>{error&&<div className="card errorbox" style={{marginBottom:16}}>{error}</div>}{msg&&<div className="card successbox" style={{marginBottom:16}}>{msg}</div>}
 {canCreate&&sel.studentId&&<form className="card" onSubmit={add} style={{marginBottom:18}}><div className="formgrid">
   <div className="field"><label>Görüşme Tarihi *</label><input type="date" value={f.meeting_date} onChange={e=>setF({...f,meeting_date:e.target.value})}/></div>
   <div className="field"><label>Takip / Sonraki Görüşme</label><input type="date" value={f.follow_up_date} onChange={e=>setF({...f,follow_up_date:e.target.value})}/></div>
   <div className="field" style={{gridColumn:"1/-1"}}><label>Görüşme Konusu *</label><input required value={f.topic} onChange={e=>setF({...f,topic:e.target.value})}/></div>
   <div className="field"><label>Görüşme Özeti (özel kayıt)</label><textarea rows="5" value={f.summary} onChange={e=>setF({...f,summary:e.target.value})}/></div>
   <div className="field"><label>Alınan Kararlar (özel kayıt)</label><textarea rows="5" value={f.decisions} onChange={e=>setF({...f,decisions:e.target.value})}/></div>
   <div className="field"><label>Özel Rehberlik Notu</label><textarea rows="4" value={f.private_note} onChange={e=>setF({...f,private_note:e.target.value})}/><div className="muted">Bu alan sadece rehberlik/yönetim kayıtlarında kalır.</div></div>
   <div className="field"><label>Paylaşıma Açık Not</label><textarea rows="4" value={f.shared_note} onChange={e=>setF({...f,shared_note:e.target.value})}/><div className="muted">Aşağıda seçtiğiniz kişiler yalnızca bu notu görebilir.</div></div>
 </div><div style={{display:"flex",gap:14,flexWrap:"wrap",marginTop:14}}><label><input type="checkbox" checked={f.share_advisor} onChange={e=>setF({...f,share_advisor:e.target.checked})}/> Danışman öğretmen</label><label><input type="checkbox" checked={f.share_student} onChange={e=>setF({...f,share_student:e.target.checked})}/> Öğrenci</label><label><input type="checkbox" checked={f.share_parent} onChange={e=>setF({...f,share_parent:e.target.checked})}/> Veli</label></div><button className="btn" style={{marginTop:14}}>Görüşmeyi Kaydet</button></form>}
 <div className="card table"><table><thead><tr><th>Tarih</th><th>Rehberlik Öğretmeni</th><th>Konu</th><th>Takip Tarihi</th></tr></thead><tbody>{rows.map(r=><tr key={r.id}><td>{r.meeting_date}</td><td>{r.profiles?.full_name||"-"}</td><td>{r.topic}</td><td>{r.follow_up_date||"-"}</td></tr>)}{!rows.length&&<tr><td colSpan="4">Görüşme kaydı yok.</td></tr>}</tbody></table></div>
 </main></>
}
return {default:Guidance};
})();
const Guidance=__mod_Guidance.default;


const __mod_PasswordPage=(()=>{


function PasswordPage(){
  const router=useRouter();
  const [password,setPassword]=useState("");
  const [confirmPassword,setConfirmPassword]=useState("");
  const [saving,setSaving]=useState(false);
  const [error,setError]=useState("");
  const [msg,setMsg]=useState("");

  async function submit(e){
    e.preventDefault();
    setError(""); setMsg("");

    if(password.length<6){
      setError("Yeni şifre en az 6 karakter olmalıdır.");
      return;
    }
    if(password!==confirmPassword){
      setError("Yeni şifreler birbiriyle aynı değil.");
      return;
    }

    setSaving(true);
    const {error:e2}=await supabase.auth.updateUser({password});
    setSaving(false);

    if(e2){
      setError(e2.message);
      return;
    }

    setPassword("");
    setConfirmPassword("");
    setMsg("Şifreniz başarıyla değiştirildi.");
  }

  return <><Header/><main className="container">
    <div className="toolbar">
      <div>
        <h2>Şifremi Değiştir</h2>
        <div className="muted">Yeni şifrenizi yalnızca siz bilirsiniz. Sistem mevcut şifrenizi görüntülemez.</div>
      </div>
    </div>

    {error&&<div className="card errorbox" style={{marginBottom:16}}>{error}</div>}
    {msg&&<div className="card successbox" style={{marginBottom:16}}>{msg}</div>}

    <form className="card" onSubmit={submit} style={{maxWidth:620}}>
      <div className="field">
        <label>Yeni Şifre *</label>
        <input type="password" minLength={6} required value={password}
          onChange={e=>setPassword(e.target.value)} autoComplete="new-password"/>
      </div>
      <div className="field" style={{marginTop:12}}>
        <label>Yeni Şifre Tekrar *</label>
        <input type="password" minLength={6} required value={confirmPassword}
          onChange={e=>setConfirmPassword(e.target.value)} autoComplete="new-password"/>
      </div>
      <button className="btn" disabled={saving} style={{marginTop:16}}>
        {saving?"Değiştiriliyor...":"Şifreyi Değiştir"}
      </button>
    </form>
  </main></>
}
return {default:PasswordPage};
})();
const PasswordPage=__mod_PasswordPage.default;


const __mod_Definitions=(()=>{


const emptyStudent={student_no:"",full_name:"",class_name:"8-A",advisor_id:""};
const emptyOutcome={subject_id:"",grade:8,unit:"",code:"",title:"",active:true};

function Definitions(){
 const {profile}=useCurrentProfile();
 const [tab,setTab]=useState("students");
 const [students,setStudents]=useState([]),[teachers,setTeachers]=useState([]),[subjects,setSubjects]=useState([]),[outcomes,setOutcomes]=useState([]),[maps,setMaps]=useState([]);
 const [studentForm,setStudentForm]=useState(emptyStudent),[studentEditing,setStudentEditing]=useState(null);
 const [outcomeForm,setOutcomeForm]=useState(emptyOutcome),[outcomeEditing,setOutcomeEditing]=useState(null),[subjectFilter,setSubjectFilter]=useState("");
 const [map,setMap]=useState({teacher_id:"",class_name:"",subject_id:""});
 const [msg,setMsg]=useState(""),[error,setError]=useState("");
 const allowed=profile?.role==="admin";
 const admin=profile?.role==="admin";

 async function load(){
  setError("");
  const [{data:st,error:ste},{data:t},{data:s},{data:o,error:oe},{data:m}]=await Promise.all([
   supabase.from("students").select("id,student_no,full_name,class_name,advisor_id,user_id,photo_path,created_at").order("class_name").order("full_name"),
   supabase.from("profiles").select("id,full_name,role,active").in("role",["teacher","admin"]).eq("active",true).order("full_name"),
   supabase.from("subjects").select("id,name,slug,active,sort_order").order("sort_order"),
   supabase.from("learning_outcomes").select("id,subject_id,grade,unit,code,title,active,subjects(name)").order("unit").order("title"),
   supabase.from("teacher_class_subjects").select("teacher_id,class_name,subject_id,profiles!teacher_class_subjects_teacher_id_fkey(full_name),subjects(name)").order("class_name")
  ]);
  if(ste)setError(ste.message); if(oe)setError(oe.message);
  setStudents(st||[]);setTeachers(t||[]);setSubjects(s||[]);setOutcomes(o||[]);setMaps(m||[]);
 }
 useEffect(()=>{if(allowed)load()},[profile?.role]);

 const classes=useMemo(()=>[...new Set(students.map(x=>x.class_name).filter(Boolean))].sort(),[students]);
 const filteredOutcomes=useMemo(()=>outcomes.filter(x=>!subjectFilter||x.subject_id===subjectFilter),[outcomes,subjectFilter]);

 function clearMessages(){setMsg("");setError("")}

 async function saveStudent(e){
  e.preventDefault();clearMessages();if(!admin)return;
  if(!studentForm.student_no.trim()||!studentForm.full_name.trim()){setError("Öğrenci no ve ad soyad zorunludur.");return}
  const payload={student_no:studentForm.student_no.trim(),full_name:studentForm.full_name.trim(),class_name:studentForm.class_name.trim(),advisor_id:studentForm.advisor_id||null};
  const q=studentEditing?supabase.from("students").update(payload).eq("id",studentEditing):supabase.from("students").insert(payload);
  const {error:e2}=await q;if(e2){setError(e2.message);return}
  setMsg(studentEditing?"Öğrenci bilgileri güncellendi.":"Öğrenci tanımlandı.");
  setStudentForm(emptyStudent);setStudentEditing(null);load();
 }
 function editStudent(s){setTab("students");setStudentEditing(s.id);setStudentForm({student_no:s.student_no||"",full_name:s.full_name||"",class_name:s.class_name||"",advisor_id:s.advisor_id||""});window.scrollTo({top:0,behavior:"smooth"})}
 async function deleteStudent(s){
  if(!admin||!confirm(`${s.full_name} öğrencisini silmek istediğinize emin misiniz?`))return;
  const {error:e}=await supabase.from("students").delete().eq("id",s.id);if(e){setError(e.message);return}setMsg("Öğrenci silindi.");load();
 }

 async function saveOutcome(e){
  e.preventDefault();clearMessages();if(!admin)return;
  if(!outcomeForm.subject_id||!outcomeForm.unit.trim()||!outcomeForm.title.trim()){setError("Ders, ünite/konu ve kazanım açıklaması zorunludur.");return}
  const payload={subject_id:outcomeForm.subject_id,grade:Number(outcomeForm.grade||8),unit:outcomeForm.unit.trim(),code:outcomeForm.code.trim()||null,title:outcomeForm.title.trim(),active:Boolean(outcomeForm.active)};
  const q=outcomeEditing?supabase.from("learning_outcomes").update(payload).eq("id",outcomeEditing):supabase.from("learning_outcomes").insert(payload);
  const {error:e2}=await q;if(e2){setError(e2.message);return}
  setMsg(outcomeEditing?"Kazanım güncellendi.":"Yeni kazanım eklendi.");
  setOutcomeForm(emptyOutcome);setOutcomeEditing(null);load();
 }
 function editOutcome(o){setTab("outcomes");setOutcomeEditing(o.id);setOutcomeForm({subject_id:o.subject_id,grade:o.grade||8,unit:o.unit||"",code:o.code||"",title:o.title||"",active:o.active!==false});window.scrollTo({top:0,behavior:"smooth"})}
 async function toggleOutcome(o){
  if(!admin)return;clearMessages();
  const {error:e}=await supabase.from("learning_outcomes").update({active:!o.active}).eq("id",o.id);
  if(e){setError(e.message);return}setMsg(!o.active?"Kazanım yeniden aktif edildi.":"Kazanım pasife alındı. Yeni görevlerde listelenmeyecek.");load();
 }
 async function deleteOutcome(o){
  if(!admin||!confirm("Bu kazanımı tamamen silmek istediğinize emin misiniz? Daha önce görevlerde kullanıldıysa silme işlemi engellenebilir."))return;
  clearMessages();const {error:e}=await supabase.from("learning_outcomes").delete().eq("id",o.id);
  if(e){setError("Kazanım silinemedi. Daha önce bir görevde kullanıldıysa silmek yerine pasife alın. Detay: "+e.message);return}
  setMsg("Kazanım silindi.");load();
 }

 async function saveMap(e){
  e.preventDefault();clearMessages();if(!admin)return;
  const {error:e2}=await supabase.from("teacher_class_subjects").upsert(map,{onConflict:"teacher_id,class_name,subject_id"});
  if(e2){setError(e2.message);return}setMsg("Öğretmen-sınıf-ders ataması kaydedildi.");setMap({teacher_id:"",class_name:"",subject_id:""});load();
 }
 async function deleteMap(r){
  if(!admin)return;clearMessages();
  const {error:e}=await supabase.from("teacher_class_subjects").delete().eq("teacher_id",r.teacher_id).eq("class_name",r.class_name).eq("subject_id",r.subject_id);
  if(e){setError(e.message);return}setMsg("Ders ataması kaldırıldı.");load();
 }

 if(profile&&!allowed)return <><Header/><main className="container"><div className="card errorbox">Bu bölüm yalnızca yönetici içindir.</div></main></>;

 return <><Header/><main className="container">
  <div className="toolbar"><div><h2>Öğrenci ve Kazanım Tanımlama</h2><div className="muted">Öğrencileri tanımlayın; MEB kazanımları değiştiğinde kazanım havuzunu uygulama içinden güncelleyin.</div></div></div>
  <div className="tabs">
   <button type="button" className={`smallbtn ${tab==="students"?"orange":""}`} onClick={()=>setTab("students")}>Öğrenci Tanımlama</button>
   <button type="button" className={`smallbtn ${tab==="outcomes"?"orange":""}`} onClick={()=>setTab("outcomes")}>Kazanım Yönetimi</button>
   <button type="button" className={`smallbtn ${tab==="mapping"?"orange":""}`} onClick={()=>setTab("mapping")}>Öğretmen - Ders Ataması</button>
  </div>
  {error&&<div className="card errorbox" style={{marginBottom:16}}>{error}</div>}
  {msg&&<div className="card successbox" style={{marginBottom:16}}>{msg}</div>}

  {tab==="students"&&<>
   {admin&&<form className="card" onSubmit={saveStudent} style={{marginBottom:18}}>
    <div className="toolbar"><div><h3 style={{margin:0,color:"#123B74"}}>{studentEditing?"Öğrenci Düzenle":"Yeni Öğrenci Tanımla"}</h3><div className="muted">Sınıfı ayrıca tanımlamazsınız; öğrencinin sınıf/şubesini burada yazarsınız.</div></div>{studentEditing&&<button type="button" className="smallbtn" onClick={()=>{setStudentEditing(null);setStudentForm(emptyStudent)}}>Vazgeç</button>}</div>
    <div className="formgrid">
     <div className="field"><label>Öğrenci No *</label><input required value={studentForm.student_no} onChange={e=>setStudentForm({...studentForm,student_no:e.target.value})} placeholder="Örn. 20260075"/></div>
     <div className="field"><label>Ad Soyad *</label><input required value={studentForm.full_name} onChange={e=>setStudentForm({...studentForm,full_name:e.target.value})} placeholder="Öğrenci adı soyadı"/></div>
     <div className="field"><label>Sınıf / Şube *</label><input required value={studentForm.class_name} onChange={e=>setStudentForm({...studentForm,class_name:e.target.value})} placeholder="Örn. 8-A"/></div>
     <div className="field"><label>Danışman Öğretmen</label><select value={studentForm.advisor_id} onChange={e=>setStudentForm({...studentForm,advisor_id:e.target.value})} style={{border:"1px solid #ccd6e4",borderRadius:10,padding:11}}><option value="">Atanmadı</option>{teachers.map(t=><option key={t.id} value={t.id}>{t.full_name}</option>)}</select></div>
    </div>
    <button className="btn" style={{marginTop:14}}>{studentEditing?"Değişiklikleri Kaydet":"Öğrenciyi Tanımla"}</button>
    {studentEditing&&students.find(x=>x.id===studentEditing)&&
      <StudentPhotoUpload student={students.find(x=>x.id===studentEditing)} onChanged={load}/>}
   </form>}
   <div className="card table"><div className="toolbar"><div><h3 style={{margin:0,color:"#123B74"}}>Tanımlı Öğrenciler</h3><div className="muted">{students.length} öğrenci</div></div>{admin&&<Link className="smallbtn" href="/accounts">Öğrenci Kullanıcı Hesapları →</Link>}</div>
    <table><thead><tr><th>Fotoğraf</th><th>No</th><th>Ad Soyad</th><th>Sınıf</th><th>Danışman</th><th>Hesap</th><th></th></tr></thead><tbody>
     {students.map(s=>{const adv=teachers.find(t=>t.id===s.advisor_id);return <tr key={s.id}><td><StudentPhoto photoPath={s.photo_path} name={s.full_name} size={46}/></td><td>{s.student_no||"-"}</td><td><b>{s.full_name}</b></td><td>{s.class_name||"-"}</td><td>{adv?.full_name||"Atanmadı"}</td><td><span className={`badge ${s.user_id?"green":""}`}>{s.user_id?"Bağlı":"Hesap yok"}</span></td><td>{admin&&<div style={{display:"flex",gap:6}}><button className="smallbtn orange" type="button" onClick={()=>editStudent(s)}>Düzenle</button><button className="smallbtn red" type="button" onClick={()=>deleteStudent(s)}>Sil</button></div>}</td></tr>})}
     {!students.length&&<tr><td colSpan="7">Henüz öğrenci tanımlanmamış.</td></tr>}
    </tbody></table>
   </div>
  </>}

  {tab==="outcomes"&&<>
   {admin&&<form className="card" onSubmit={saveOutcome} style={{marginBottom:18}}>
    <div className="toolbar"><div><h3 style={{margin:0,color:"#123B74"}}>{outcomeEditing?"Kazanımı Düzenle":"Yeni Kazanım Ekle"}</h3><div className="muted">MEB güncellemesi olduğunda buradan ekleyebilir veya mevcut kazanımı değiştirebilirsiniz.</div></div>{outcomeEditing&&<button type="button" className="smallbtn" onClick={()=>{setOutcomeEditing(null);setOutcomeForm(emptyOutcome)}}>Vazgeç</button>}</div>
    <div className="formgrid">
     <div className="field"><label>Ders *</label><select required value={outcomeForm.subject_id} onChange={e=>setOutcomeForm({...outcomeForm,subject_id:e.target.value})} style={{border:"1px solid #ccd6e4",borderRadius:10,padding:11}}><option value="">Seçiniz</option>{subjects.filter(s=>s.active).map(s=><option key={s.id} value={s.id}>{s.name}</option>)}</select></div>
     <div className="field"><label>Sınıf Düzeyi</label><input type="number" min="1" max="12" value={outcomeForm.grade} onChange={e=>setOutcomeForm({...outcomeForm,grade:e.target.value})}/></div>
     <div className="field"><label>Ünite / Konu *</label><input required value={outcomeForm.unit} onChange={e=>setOutcomeForm({...outcomeForm,unit:e.target.value})} placeholder="Örn. Çarpanlar ve Katlar"/></div>
     <div className="field"><label>MEB Kazanım Kodu</label><input value={outcomeForm.code} onChange={e=>setOutcomeForm({...outcomeForm,code:e.target.value})} placeholder="Varsa kazanım kodu"/></div>
     <div className="field" style={{gridColumn:"1/-1"}}><label>Kazanım Açıklaması *</label><textarea required rows="3" value={outcomeForm.title} onChange={e=>setOutcomeForm({...outcomeForm,title:e.target.value})} placeholder="Kazanım açıklaması"/></div>
     <label style={{display:"flex",alignItems:"center",gap:8}}><input type="checkbox" checked={outcomeForm.active} onChange={e=>setOutcomeForm({...outcomeForm,active:e.target.checked})}/> Aktif</label>
    </div>
    <button className="btn" style={{marginTop:14}}>{outcomeEditing?"Kazanımı Güncelle":"Kazanımı Ekle"}</button>
   </form>}
   <div className="card table">
    <div className="toolbar"><div><h3 style={{margin:0,color:"#123B74"}}>Kazanım Havuzu</h3><div className="muted">Pasif kazanımlar yeni görev atarken öğretmenlerin listesinde görünmez.</div></div><select value={subjectFilter} onChange={e=>setSubjectFilter(e.target.value)} style={{border:"1px solid #ccd6e4",borderRadius:10,padding:9}}><option value="">Tüm Dersler</option>{subjects.map(s=><option key={s.id} value={s.id}>{s.name}</option>)}</select></div>
    <table><thead><tr><th>Ders</th><th>Sınıf</th><th>Ünite / Konu</th><th>Kod</th><th>Kazanım</th><th>Durum</th><th></th></tr></thead><tbody>
     {filteredOutcomes.map(o=><tr key={o.id}><td>{o.subjects?.name||"-"}</td><td>{o.grade}</td><td>{o.unit}</td><td>{o.code||"-"}</td><td>{o.title}</td><td><span className={`badge ${o.active?"green":""}`}>{o.active?"Aktif":"Pasif"}</span></td><td>{admin&&<div style={{display:"flex",gap:6,flexWrap:"wrap"}}><button type="button" className="smallbtn orange" onClick={()=>editOutcome(o)}>Düzenle</button><button type="button" className="smallbtn" onClick={()=>toggleOutcome(o)}>{o.active?"Pasife Al":"Aktifleştir"}</button><button type="button" className="smallbtn red" onClick={()=>deleteOutcome(o)}>Sil</button></div>}</td></tr>)}
     {!filteredOutcomes.length&&<tr><td colSpan="7">Kazanım bulunamadı.</td></tr>}
    </tbody></table>
   </div>
  </>}

  {tab==="mapping"&&<>
   {admin&&<form className="card" onSubmit={saveMap} style={{marginBottom:18}}>
    <h3 style={{color:"#123B74",marginTop:0}}>Öğretmen - Sınıf - Ders Ataması</h3>
    <div className="formgrid">
     <div className="field"><label>Öğretmen *</label><select required value={map.teacher_id} onChange={e=>setMap({...map,teacher_id:e.target.value})} style={{border:"1px solid #ccd6e4",borderRadius:10,padding:11}}><option value="">Seçiniz</option>{teachers.filter(t=>t.role==="teacher").map(t=><option key={t.id} value={t.id}>{t.full_name}</option>)}</select></div>
     <div className="field"><label>Sınıf *</label><select required value={map.class_name} onChange={e=>setMap({...map,class_name:e.target.value})} style={{border:"1px solid #ccd6e4",borderRadius:10,padding:11}}><option value="">Seçiniz</option>{classes.map(c=><option key={c} value={c}>{c}</option>)}</select></div>
     <div className="field"><label>Ders *</label><select required value={map.subject_id} onChange={e=>setMap({...map,subject_id:e.target.value})} style={{border:"1px solid #ccd6e4",borderRadius:10,padding:11}}><option value="">Seçiniz</option>{subjects.filter(s=>s.active).map(s=><option key={s.id} value={s.id}>{s.name}</option>)}</select></div>
    </div><button className="btn" style={{marginTop:14}}>Atamayı Kaydet</button>
   </form>}
   <div className="card table"><h3 style={{color:"#123B74"}}>Öğretmen - Sınıf - Ders Eşleştirmeleri</h3><table><thead><tr><th>Öğretmen</th><th>Sınıf</th><th>Ders</th><th></th></tr></thead><tbody>{maps.map((r,i)=><tr key={`${r.teacher_id}-${r.class_name}-${r.subject_id}-${i}`}><td>{r.profiles?.full_name||"-"}</td><td>{r.class_name}</td><td>{r.subjects?.name||"-"}</td><td>{admin&&<button type="button" className="smallbtn red" onClick={()=>deleteMap(r)}>Kaldır</button>}</td></tr>)}{!maps.length&&<tr><td colSpan="4">Henüz eşleştirme yok.</td></tr>}</tbody></table></div>
  </>}
 </main></>
}
return {default:Definitions};
})();
const Definitions=__mod_Definitions.default;


const __mod_VeliPage=(()=>{


function Page(){
 const sel=useStudentSelection(); const [weekly,setWeekly]=useState([]),[exam,setExam]=useState(null),[goals,setGoals]=useState([]),[notes,setNotes]=useState([]),[error,setError]=useState("");
 useEffect(()=>{(async()=>{if(!sel.studentId){setWeekly([]);return}setError("");const since=new Date();since.setDate(since.getDate()-7);const iso=since.toISOString().slice(0,10);const [w,e,g,n]=await Promise.all([
  supabase.from("weekly_study").select("question_count,correct_count,wrong_count,duration_minutes").eq("student_id",sel.studentId).gte("study_date",iso),
  supabase.from("mock_exams").select("exam_name,total_net,exam_date").eq("student_id",sel.studentId).order("exam_date",{ascending:false}).limit(1).maybeSingle(),
  supabase.from("goals").select("id,title,target_value,current_value,goal_type,note").eq("student_id",sel.studentId).order("created_at",{ascending:false}).limit(6),
  supabase.from("shared_notes").select("id,note_date,title,note,source_type").eq("student_id",sel.studentId).eq("audience","parent").order("note_date",{ascending:false}).limit(10)
 ]);const er=[w,e,g,n].find(x=>x.error)?.error;if(er)setError(er.message);setWeekly(w.data||[]);setExam(e.data||null);setGoals(g.data||[]);setNotes(n.data||[])})()},[sel.studentId]);
 const stats=useMemo(()=>weekly.reduce((a,r)=>({q:a.q+(r.question_count||0),d:a.d+(r.correct_count||0),y:a.y+(r.wrong_count||0),m:a.m+(r.duration_minutes||0)}),{q:0,d:0,y:0,m:0}),[weekly]);
 return <><Header/><main className="container"><StudentBar {...sel} onChange={sel.choose}/>{error&&<div className="card errorbox" style={{marginBottom:16}}>{error}</div>}{sel.student&&<section className="hero"><div style={{display:"flex",alignItems:"center",gap:18,flexWrap:"wrap"}}>
      <StudentPhoto photoPath={sel.student.photo_path} name={sel.student.full_name} size={92}/>
      <div><span className="badge">VELİ PANELİ</span><h2>{sel.student.full_name}</h2><p>{sel.student.class_name||"-"} • Öğrenci No: {sel.student.student_no||"-"}</p></div>
    </div></section>}
 <section className="grid grid3" style={{marginTop:18}}><div className="card"><div className="muted">Son 7 Gün Soru</div><div className="stat">{stats.q}</div><div className="muted">{stats.d} doğru • {stats.y} yanlış</div></div><div className="card"><div className="muted">Son Deneme</div><div className="stat">{exam?.total_net!=null?Number(exam.total_net).toFixed(2):"-"}</div><div className="muted">{exam?.exam_name||"Kayıt yok"}</div></div><div className="card"><div className="muted">Çalışma Süresi</div><div className="stat">{Math.round(stats.m/60*10)/10} sa</div><div className="muted">Son 7 gün</div></div></section>
 <section className="grid grid2" style={{marginTop:18}}><div className="card"><h3 style={{color:"#123B74",marginTop:0}}>Hedefler</h3>{goals.length?goals.map(g=><div className="metricline" key={g.id}><div><b>{g.title}</b><div className="muted">{g.goal_type||"Hedef"}</div></div><b>{g.current_value??"-"} / {g.target_value??"-"}</b></div>):<div className="muted">Henüz hedef yok.</div>}</div><div className="card"><h3 style={{color:"#123B74",marginTop:0}}>Veliye Açık Danışman Notları</h3>{notes.length?notes.map(n=><div className="metricline" key={n.id}><div><b>{n.title||"Paylaşılan Not"}</b><div className="muted">{n.note_date} • {n.source_type==="guidance"?"Rehberlik":"Danışmanlık"}</div><div>{n.note}</div></div></div>):<div className="muted">Paylaşılmış not yok.</div>}</div></section>
 </main></>}
return {default:Page};
})();
const VeliPage=__mod_VeliPage.default;


const __mod_StudentDetail=(()=>{


function StudentDetail(){
  const {id}=useParams(); const [student,setStudent]=useState(null),[advisor,setAdvisor]=useState(""),[tasks,setTasks]=useState([]),[exam,setExam]=useState(null),[goals,setGoals]=useState([]),[counselCount,setCounselCount]=useState(0),[error,setError]=useState(""),[loading,setLoading]=useState(true);
  useEffect(()=>{async function load(){
    setLoading(true);setError(""); const {data:s,error:se}=await supabase.from("students").select("id,student_no,full_name,class_name,advisor_id,photo_path").eq("id",id).single();
    if(se){setError(se.message);setLoading(false);return}setStudent(s);
    if(s.advisor_id){const {data:a}=await supabase.from("profiles").select("full_name").eq("id",s.advisor_id).maybeSingle();setAdvisor(a?.full_name||"")}
    const [t,e,g,c]=await Promise.all([
      supabase.from("assignment_targets").select("id,status,assignments(target_questions),assignment_submissions(solved_count,correct_count,wrong_count,blank_count,updated_at)").eq("student_id",id).order("created_at",{ascending:false}).limit(100),
      supabase.from("mock_exams").select("exam_name,exam_date,total_net,turkish_net,math_net,science_net,history_net,religion_net,english_net").eq("student_id",id).order("exam_date",{ascending:false}).limit(1).maybeSingle(),
      supabase.from("goals").select("id,title,target_value,current_value,goal_type").eq("student_id",id).order("created_at",{ascending:false}).limit(6),
      supabase.from("counseling_notes").select("id",{count:"exact",head:true}).eq("student_id",id)
    ]);setTasks(t.data||[]);setExam(e.data||null);setGoals(g.data||[]);setCounselCount(c.count||0);setLoading(false)
  }if(id)load()},[id]);
  const stats=useMemo(()=>{
    const since=Date.now()-7*24*60*60*1000;
    return tasks.reduce((a,t)=>{const s=t.assignment_submissions?.[0];if(!s?.updated_at||new Date(s.updated_at).getTime()<since)return a;return {q:a.q+Number(s.solved_count||0),d:a.d+Number(s.correct_count||0),y:a.y+Number(s.wrong_count||0),b:a.b+Number(s.blank_count||0)}},{q:0,d:0,y:0,b:0})
  },[tasks]);
  if(loading)return <><Header/><main className="container"><div className="empty">Öğrenci yükleniyor...</div></main></>;
  if(error||!student)return <><Header/><main className="container"><div className="card errorbox">{error||"Öğrenci bulunamadı."}</div></main></>;
  const tabs=[["/gorevler","Görev Ata"],["/calisma","Çalışmalar"],["/denemeler","Denemeler"],["/hedefler","Hedefler"],["/danismanlik","Danışmanlık"],["/rehberlik","Rehberlik"],["/rapor","Rapor"]];
  return <><Header/><main className="container"><section className="hero"><div style={{display:"flex",alignItems:"center",gap:18,flexWrap:"wrap"}}>
      <StudentPhoto photoPath={student.photo_path} name={student.full_name} size={96}/>
      <div><span className="badge">{student.class_name||"LGS"}</span><h2>{student.full_name}</h2><p>Öğrenci No: {student.student_no||"-"} • Danışman: {advisor||"Atanmadı"}</p></div>
    </div></section>
    <div className="tabs"><Link href="/admin">← Öğrenci Listesi</Link>{tabs.map(([p,t])=><Link key={p} href={`${p}?student=${student.id}`}>{t}</Link>)}</div>
    <section className="grid grid3"><div className="card"><div className="muted">Son 7 Gün Çözülen</div><div className="stat">{stats.q}</div><div className="muted">{stats.d} doğru • {stats.y} yanlış • {stats.b} boş</div></div><div className="card"><div className="muted">Son Deneme</div><div className="stat">{exam?.total_net!=null?Number(exam.total_net).toFixed(2):"-"}</div><div className="muted">{exam?.exam_name||"Kayıt yok"}</div></div><div className="card"><div className="muted">Tamamlanan Çalışma</div><div className="stat">{tasks.filter(t=>t.status==="completed").length}/{tasks.length}</div><div className="muted">tamamlandı / toplam</div></div></section>
    <section className="grid grid2" style={{marginTop:18}}><div className="card"><h3 style={{color:"#123B74",marginTop:0}}>Hedefler</h3>{goals.length?goals.map(g=><div className="metricline" key={g.id}><div><b>{g.title}</b><div className="muted">{g.goal_type||"Hedef"}</div></div><b>{g.current_value??"-"} / {g.target_value??"-"}</b></div>):<div className="muted">Henüz hedef girilmedi.</div>}</div><div className="card"><h3 style={{color:"#123B74",marginTop:0}}>Özet</h3><div className="metricline"><span>Danışmanlık kaydı</span><b>{counselCount}</b></div><div className="metricline"><span>Danışman</span><b>{advisor||"Atanmadı"}</b></div></div></section>
  </main></>
}
return {default:StudentDetail};
})();
const StudentDetail=__mod_StudentDetail.default;


function EnvCheck(){
  const [cfg,setCfg]=useState(null);
  useEffect(()=>{fetch("/api/env-check").then(r=>r.json()).then(setCfg).catch(()=>setCfg({}))},[]);
  const row=(name,ok)=><div style={{padding:"14px 18px",borderBottom:"1px solid #eef2f7",display:"flex",justifyContent:"space-between",gap:16}}><b>{name}</b><span style={{fontWeight:800,color:ok?"#067647":"#b42318"}}>{ok?"ALGILANDI":"EKSİK"}</span></div>;
  return <main style={{maxWidth:800,margin:"50px auto",fontFamily:"Arial",padding:20}}><h1 style={{color:"#123B74"}}>Supabase Ortam Kontrolü</h1><p>Değerlerin kendisi gösterilmez.</p><div style={{background:"#fff",border:"1px solid #dbe3ee",borderRadius:16,overflow:"hidden"}}>{row("NEXT_PUBLIC_SUPABASE_URL",!!cfg?.url)}{row("NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY",!!cfg?.publicKey)}{row("SUPABASE_SERVICE_ROLE_KEY",!!cfg?.serviceKey)}</div></main>
}


function RouteView(){
  const pathname=usePathname();
  let PageComponent=Login;
  if(pathname==="/") PageComponent=Login;
  else if(pathname==="/login"||pathname==="/login/") PageComponent=Login;
  else if(pathname==="/dashboard"||pathname==="/dashboard/") PageComponent=Dashboard;
  else if(pathname==="/admin"||pathname==="/admin/") PageComponent=AdminPage;
  else if(pathname==="/accounts"||pathname==="/accounts/") PageComponent=Accounts;
  else if(pathname==="/calisma"||pathname==="/calisma/") PageComponent=Study;
  else if(pathname==="/danismanlik"||pathname==="/danismanlik/") PageComponent=DanismanlikPage;
  else if(pathname==="/denemeler"||pathname==="/denemeler/") PageComponent=DenemelerPage;
  else if(pathname==="/env-check"||pathname==="/env-check/") PageComponent=EnvCheck;
  else if(pathname==="/gorevler"||pathname==="/gorevler/") PageComponent=Assignments;
  else if(pathname==="/hedefler"||pathname==="/hedefler/") PageComponent=HedeflerPage;
  else if(pathname==="/koordinator"||pathname==="/koordinator/") PageComponent=Coordinator;
  else if(pathname==="/rapor"||pathname==="/rapor/") PageComponent=Report;
  else if(pathname==="/rehberlik"||pathname==="/rehberlik/") PageComponent=Guidance;
  else if(pathname==="/sifre"||pathname==="/sifre/") PageComponent=PasswordPage;
  else if(pathname==="/tanimlamalar"||pathname==="/tanimlamalar/") PageComponent=Definitions;
  else if(pathname==="/veli"||pathname==="/veli/") PageComponent=VeliPage;
  else if(/^\/students\/[^/]+\/?$/.test(pathname)) PageComponent=StudentDetail;
  return <AuthBoundary><PageComponent/></AuthBoundary>;
}
function App(){return <RouterProvider><RouteView/></RouterProvider>}
ReactDOM.createRoot(document.getElementById("root")).render(<App/>);
})();
