package api

import (
	"strings"

	"github.com/gofiber/fiber/v2"

	"fiko-ai/internal/persona"
	"fiko-ai/internal/protocol"
	"fiko-ai/internal/tool"
	"fiko-ai/internal/user"
)

// Üyenin KENDİ SAYFASI — salt okunur özet.
//
// Yönetici bir üyenin yetkisini ve davranışını `/api/admin/*` uçlarından düzenler; üyenin
// kendisi ise yalnızca "bana ne uygulanıyor?" sorusunu buradan görür. DÜZENLEME ucu YOKTUR:
// aksi hâlde üye kendine delete/system verirdi ya da davranış kurallarını değiştirirdi.
//
// SIZINTI KURALI: yanıtta başka üyelerin kimliği ASLA bulunmaz. Ortak profillerde atama listesi
// çıkarılır, yalnızca "başkalarıyla paylaşılıyor" bilgisi (shared) verilir.

// myBehavior, üyeye uygulanan tek bir davranış profilinin üye görünümüdür.
type myBehavior struct {
	Name         string `json:"name"`
	Role         string `json:"role"`
	Instructions string `json:"instructions"`
	Notes        string `json:"notes"`
	// Shared profil birden çok kişiye atanmışsa true (kişisel davranış değil, ortak profil).
	Shared bool `json:"shared"`
}

// myPageResponse GET /api/me/page yanıtıdır.
type myPageResponse struct {
	User   user.UserView   `json:"user"`
	Policy tool.PolicyView `json:"policy"`
	// Custom üyeye özel politika verilmiş mi (false = varsayılan politika geçerli).
	Custom   bool         `json:"custom"`
	Behavior []myBehavior `json:"behavior"`
}

// getMyPage GET /api/me/page — oturumdaki üyenin yetkisi ve davranışı (salt okunur).
//
// Üyelik kapalıyken hesap kavramı yoktur → 404 (usersEnabled). Kimlik OTURUMDAN gelir
// (`currentUser`), yol ya da sorgu parametresinden DEĞİL: başka üyenin sayfası istenemez.
func (s *Server) getMyPage(c *fiber.Ctx) error {
	if s.deps.Users == nil || s.deps.Grants == nil {
		return fail(c, fiber.StatusServiceUnavailable, protocol.ErrCodeInternal, "hesap ve izin sistemi gerekli")
	}
	uid := strings.TrimSpace(s.currentUser(c))
	u, err := s.deps.Users.ByID(c.Context(), uid)
	if err != nil {
		// Paylaşılan API anahtarıyla gelen istek bir hesaba bağlı değildir → sayfa yok.
		return fail(c, fiber.StatusNotFound, protocol.ErrCodeNotFound, "bulunamadı")
	}
	resp := myPageResponse{
		User:     u.View(),
		Policy:   s.deps.Grants.PolicyFor(u.ID).View(),
		Custom:   policyScope(s.deps.Grants, u.ID) == "user",
		Behavior: []myBehavior{},
	}
	if s.deps.Personas != nil {
		// Hata yutulur: davranış okunamasa da yetki bilgisi gösterilebilmeli (Active ile aynı ilke).
		if list, perr := s.deps.Personas.ByUser(c.UserContext(), u.ID); perr == nil {
			resp.Behavior = myBehaviors(list)
		}
	}
	return c.JSON(resp)
}

// myBehaviors, profilleri üye görünümüne çevirir: kişisel olan başa gelir, kimlik listesi çıkarılır.
func myBehaviors(list []persona.Profile) []myBehavior {
	own := make([]myBehavior, 0, len(list))
	shared := make([]myBehavior, 0, len(list))
	for _, p := range list {
		b := myBehavior{Name: p.Name, Role: p.Role, Instructions: p.Instructions, Notes: p.Notes, Shared: len(p.AssignedUserIDs) > 1}
		if b.Shared {
			shared = append(shared, b)
		} else {
			own = append(own, b)
		}
	}
	return append(own, shared...)
}
