package api

import (
	"strings"

	"github.com/gofiber/fiber/v2"

	"fiko-ai/internal/protocol"
)

type modelDTO struct {
	Name       string `json:"name"`
	SizeBytes  int64  `json:"sizeBytes"`
	ModifiedAt string `json:"modifiedAt,omitempty"`
}

type modelsResponse struct {
	Provider     string     `json:"provider"`
	DefaultModel string     `json:"defaultModel,omitempty"`
	Models       []modelDTO `json:"models"`
}

// listModels GET /api/models — LLM sağlayıcısında bulunan modeller.
// Sağlayıcı hatası 502 olarak yansır; boş liste "modeller yüklü değil" anlamına gelir.
func (s *Server) listModels(c *fiber.Ctx) error {
	if s.deps.LLM == nil {
		return fail(c, fiber.StatusServiceUnavailable, protocol.ErrCodeInternal, "LLM sağlayıcısı yapılandırılmamış")
	}
	models, err := s.deps.LLM.ListModels(c.UserContext())
	if err != nil {
		s.log.Warn("model listesi alınamadı", "provider", s.deps.LLM.Name(), "err", err)
		return failLLM(c, err)
	}
	out := make([]modelDTO, 0, len(models))
	for _, m := range models {
		dto := modelDTO{Name: m.Name, SizeBytes: m.SizeBytes}
		if !m.ModifiedAt.IsZero() {
			dto.ModifiedAt = m.ModifiedAt.UTC().Format("2006-01-02T15:04:05Z07:00")
		}
		out = append(out, dto)
	}
	// Varsayılan model AYARDAKİ kayıtlı modeldir, yoksa yapılandırma (.env) değeri.
	// Neden? Bu alan "hangi model kullanılıyor" bilgisini taşır; ayar ekranından
	// model değiştirildiyse .env'i bildirmek yanlış ve yanıltıcı olurdu.
	defaultModel := s.cfg.DefaultModel
	if s.deps.Settings != nil {
		if m := strings.TrimSpace(s.deps.Settings.Model()); m != "" {
			defaultModel = m
		}
	}
	return c.JSON(modelsResponse{
		Provider:     s.deps.LLM.Name(),
		DefaultModel: defaultModel,
		Models:       out,
	})
}
