package handlers

import "github.com/orchard9/rdev/internal/domain"

// ConversationDTO is the data transfer object for conversations.
type ConversationDTO struct {
	ID            string  `json:"id"`
	ProjectID     string  `json:"project_id"`
	Title         string  `json:"title"`
	CreatedAt     string  `json:"created_at"`
	UpdatedAt     string  `json:"updated_at"`
	LastMessageAt *string `json:"last_message_at,omitempty"`
}

// MessageDTO is the data transfer object for messages.
type MessageDTO struct {
	ID             string `json:"id"`
	ConversationID string `json:"conversation_id"`
	Role           string `json:"role"`
	Content        string `json:"content"`
	CreatedAt      string `json:"created_at"`
}

// ConversationWithMessagesDTO combines a conversation with its messages.
type ConversationWithMessagesDTO struct {
	ConversationDTO
	Messages []*MessageDTO `json:"messages"`
}

func toConversationDTO(c *domain.Conversation) *ConversationDTO {
	if c == nil {
		return nil
	}
	dto := &ConversationDTO{
		ID:        string(c.ID),
		ProjectID: c.ProjectID,
		Title:     c.Title,
		CreatedAt: c.CreatedAt.Format("2006-01-02T15:04:05Z07:00"),
		UpdatedAt: c.UpdatedAt.Format("2006-01-02T15:04:05Z07:00"),
	}
	if c.LastMessage != nil {
		ts := c.LastMessage.Format("2006-01-02T15:04:05Z07:00")
		dto.LastMessageAt = &ts
	}
	return dto
}

func toMessageDTO(m *domain.Message) *MessageDTO {
	if m == nil {
		return nil
	}
	return &MessageDTO{
		ID:             string(m.ID),
		ConversationID: string(m.ConversationID),
		Role:           string(m.Role),
		Content:        m.Content,
		CreatedAt:      m.CreatedAt.Format("2006-01-02T15:04:05Z07:00"),
	}
}

func toConversationWithMessagesDTO(c *domain.ConversationWithMessages) *ConversationWithMessagesDTO {
	if c == nil {
		return nil
	}

	messages := make([]*MessageDTO, len(c.Messages))
	for i, m := range c.Messages {
		messages[i] = toMessageDTO(m)
	}

	dto := toConversationDTO(&c.Conversation)
	return &ConversationWithMessagesDTO{
		ConversationDTO: *dto,
		Messages:        messages,
	}
}
