package api

import (
	"net/http"
	"strings"
	"testing"

	"fiko-ai/internal/persona"
)

// me_test.go — üyenin kendi sayfası (GET /api/me/page).
// En önemli üç şey: (1) üye YALNIZ kendininkini görür, (2) başkasının kimliği sızmaz,
// (3) düzenleme ucu yoktur.

func TestMyPage_KendiYetkisiVeDavranisi(t *testing.T) {
	s := personasServer(t)
	admin := registerUser(t, s, "patron")
	ali := registerUser(t, s, "ali")
	veli := registerUser(t, s, "veli")

	mk := func(name, instr string, ids ...string) {
		resp, raw := do(t, s, http.MethodPost, "/api/admin/personas", map[string]any{
			"name": name, "instructions": instr, "assignedUserIds": ids,
		}, bearer(admin.Token))
		if resp.StatusCode != http.StatusCreated {
			t.Fatalf("profil oluşmadı: %d %s", resp.StatusCode, raw)
		}
	}
	mk("Kişisel · ali", "aliye özel kural", ali.User.ID)
	mk("Kişisel · veli", "veliye özel kural", veli.User.ID)
	mk("Ortak", "herkese kural", ali.User.ID, veli.User.ID)

	resp, raw := do(t, s, http.MethodGet, "/api/me/page", nil, bearer(ali.Token))
	if resp.StatusCode != http.StatusOK {
		t.Fatalf("GET /api/me/page: %d %s", resp.StatusCode, raw)
	}
	got := decode[myPageResponse](t, raw)
	if got.User.Username != "ali" {
		t.Fatalf("yanlış üye: %+v", got.User)
	}
	if len(got.Behavior) != 2 {
		t.Fatalf("ali için 2 davranış beklenir (kişisel + ortak): %+v", got.Behavior)
	}
	// Kişisel önce gelir; ortak profil işaretlidir.
	if got.Behavior[0].Shared || got.Behavior[0].Instructions != "aliye özel kural" {
		t.Fatalf("kişisel davranış başta olmalı: %+v", got.Behavior)
	}
	if !got.Behavior[1].Shared {
		t.Fatalf("ortak profil shared=true olmalı: %+v", got.Behavior[1])
	}
	// Veli'nin davranışı Ali'ye ASLA görünmez; kimlikler de yanıtta yoktur.
	if strings.Contains(string(raw), "veliye özel") || strings.Contains(string(raw), veli.User.ID) {
		t.Fatalf("başka üyenin verisi sızdı: %s", raw)
	}
}

func TestMyPage_DuzenlemeUcuYok(t *testing.T) {
	s := personasServer(t)
	_ = registerUser(t, s, "patron")
	ali := registerUser(t, s, "ali")

	for _, m := range []string{http.MethodPut, http.MethodPost, http.MethodDelete} {
		resp, _ := do(t, s, m, "/api/me/page", map[string]any{"grants": []string{"system"}}, bearer(ali.Token))
		if resp.StatusCode == http.StatusOK || resp.StatusCode == http.StatusCreated || resp.StatusCode == http.StatusNoContent {
			t.Fatalf("%s /api/me/page başarılı olmamalı: %d", m, resp.StatusCode)
		}
	}
}

func TestMyPage_OturumsuzReddedilir(t *testing.T) {
	s := personasServer(t)
	_ = registerUser(t, s, "patron")
	resp, _ := do(t, s, http.MethodGet, "/api/me/page", nil, nil)
	if resp.StatusCode != http.StatusUnauthorized {
		t.Fatalf("oturumsuz istek 401 olmalı, %d", resp.StatusCode)
	}
}

func TestMyBehaviors_KisiselOnceKimlikYok(t *testing.T) {
	out := myBehaviors([]persona.Profile{
		{Name: "O", Instructions: "x", AssignedUserIDs: []string{"a", "b"}},
		{Name: "K", Instructions: "y", AssignedUserIDs: []string{"a"}},
	})
	if len(out) != 2 || out[0].Name != "K" || !out[1].Shared {
		t.Fatalf("sıra/işaret bozuk: %+v", out)
	}
}
