package kanban

import "tm/pkg/response"

// CreateBoardRequest represents a request to create a new kanban board
type CreateBoardRequest struct {
	Name        string `json:"name" valid:"required~Board name is required,stringlength(1|100)~Board name must be between 1 and 100 characters"`
	Description string `json:"description" valid:"stringlength(0|500)~Description must not exceed 500 characters"`
	IsDefault   bool   `json:"is_default"`
	UserID      string `json:"-"` // Set from context/auth middleware
}

// UpdateBoardRequest represents a request to update an existing board
type UpdateBoardRequest struct {
	ID          string  `json:"id" valid:"required~Board ID is required"`
	Name        *string `json:"name,omitempty" valid:"stringlength(1|100)~Board name must be between 1 and 100 characters"`
	Description *string `json:"description,omitempty" valid:"stringlength(0|500)~Description must not exceed 500 characters"`
	IsDefault   *bool   `json:"is_default,omitempty"`
}

// CreateColumnRequest represents a request to create a new column
type CreateColumnRequest struct {
	BoardID string `json:"board_id" valid:"required~Board ID is required"`
	Name    string `json:"name" valid:"required~Column name is required,stringlength(1|50)~Column name must be between 1 and 50 characters"`
	Color   string `json:"color" valid:"hexcolor~Color must be a valid hex color"`
	Order   int    `json:"order"`
	Limit   *int   `json:"limit,omitempty" valid:"range(1|100)~WIP limit must be between 1 and 100"`
}

// UpdateColumnRequest represents a request to update an existing column
type UpdateColumnRequest struct {
	ID    string  `json:"id" valid:"required~Column ID is required"`
	Name  *string `json:"name,omitempty" valid:"stringlength(1|50)~Column name must be between 1 and 50 characters"`
	Color *string `json:"color,omitempty" valid:"hexcolor~Color must be a valid hex color"`
	Order *int    `json:"order,omitempty"`
	Limit *int    `json:"limit,omitempty" valid:"range(1|100)~WIP limit must be between 1 and 100"`
}

// CreateCardRequest represents a request to create a new card
type CreateCardRequest struct {
	ColumnID string       `json:"column_id" valid:"required~Column ID is required"`
	TenderID string       `json:"tender_id" valid:"required~Tender ID is required"`
	Title    string       `json:"title" valid:"required~Title is required,stringlength(1|200)~Title must be between 1 and 200 characters"`
	Order    int          `json:"order"`
	Priority CardPriority `json:"priority"`
	Labels   []string     `json:"labels,omitempty"`
	DueDate  *int64       `json:"due_date,omitempty"` // Unix timestamp
}

// UpdateCardRequest represents a request to update an existing card
type UpdateCardRequest struct {
	ID       string        `json:"id" valid:"required~Card ID is required"`
	Title    *string       `json:"title,omitempty" valid:"stringlength(1|200)~Title must be between 1 and 200 characters"`
	Priority *CardPriority `json:"priority,omitempty"`
	Labels   []string      `json:"labels,omitempty"`
	DueDate  *int64        `json:"due_date,omitempty"` // Unix timestamp
}

// MoveCardRequest represents a request to move a card to a different column
type MoveCardRequest struct {
	CardID   string `json:"card_id" valid:"required~Card ID is required"`
	ColumnID string `json:"column_id" valid:"required~Column ID is required"`
	NewOrder int    `json:"new_order"`
}

// ReorderCardsRequest represents a request to reorder cards within a column
type ReorderCardsRequest struct {
	ColumnID   string         `json:"column_id" valid:"required~Column ID is required"`
	CardOrders map[string]int `json:"card_orders" valid:"required~Card orders are required"`
}

// ReorderColumnsRequest represents a request to reorder columns within a board
type ReorderColumnsRequest struct {
	BoardID      string         `json:"board_id" valid:"required~Board ID is required"`
	ColumnOrders map[string]int `json:"column_orders" valid:"required~Column orders are required"`
}

// BoardResponse represents a board in API responses
type BoardResponse struct {
	ID          string           `json:"id"`
	Name        string           `json:"name"`
	Description string           `json:"description"`
	Columns     []ColumnResponse `json:"columns"`
	IsDefault   bool             `json:"is_default"`
	UserID      string           `json:"user_id"`
	CreatedAt   int64            `json:"created_at"`
	UpdatedAt   int64            `json:"updated_at"`
}

// ColumnResponse represents a column in API responses
type ColumnResponse struct {
	ID             string         `json:"id"`
	BoardID        string         `json:"board_id"`
	Name           string         `json:"name"`
	Status         string         `json:"status"`
	StatusCategory string         `json:"status_category"`
	Order          int            `json:"order"`
	Color          string         `json:"color"`
	Limit          *int           `json:"limit,omitempty"`
	Cards          []CardResponse `json:"cards"`
	CardCount      int            `json:"card_count"`
	IsOverLimit    bool           `json:"is_over_limit"`
	CreatedAt      int64          `json:"created_at"`
	UpdatedAt      int64          `json:"updated_at"`
}

// CardResponse represents a card in API responses
type CardResponse struct {
	ID        string       `json:"id"`
	ColumnID  string       `json:"column_id"`
	TenderID  string       `json:"tender_id"`
	Title     string       `json:"title"`
	Order     int          `json:"order"`
	Priority  CardPriority `json:"priority"`
	Labels    []string     `json:"labels,omitempty"`
	DueDate   *int64       `json:"due_date,omitempty"`
	CreatedAt int64        `json:"created_at"`
	UpdatedAt int64        `json:"updated_at"`
}

// BoardsListResponse represents the response for listing boards
type BoardsListResponse struct {
	Boards []BoardResponse `json:"boards"`
	Meta   *response.Meta  `json:"-"`
}

// BoardDetailResponse represents detailed board response with full column and card data
type BoardDetailResponse struct {
	Board BoardResponse  `json:"board"`
	Meta  *response.Meta `json:"-"`
}

// ToBoardResponse converts a Board entity to BoardResponse
func (b *Board) ToResponse() *BoardResponse {
	return &BoardResponse{
		ID:          b.ID.Hex(),
		Name:        b.Name,
		Description: b.Description,
		Columns:     make([]ColumnResponse, 0), // Will be populated by service
		IsDefault:   b.IsDefault,
		UserID:      b.UserID,
		CreatedAt:   b.CreatedAt,
		UpdatedAt:   b.UpdatedAt,
	}
}

// ToColumnResponse converts a Column entity to ColumnResponse
func (c *Column) ToResponse() *ColumnResponse {
	return &ColumnResponse{
		ID:             c.ID.Hex(),
		BoardID:        c.BoardID,
		Name:           c.Name,
		Status:         c.Status,
		StatusCategory: c.StatusCategory,
		Order:          c.Order,
		Color:          c.Color,
		Limit:          c.Limit,
		Cards:          make([]CardResponse, 0), // Will be populated by service
		CardCount:      0,                       // Will be populated by service
		IsOverLimit:    false,                   // Will be calculated by service
		CreatedAt:      c.CreatedAt,
		UpdatedAt:      c.UpdatedAt,
	}
}

// ToCardResponse converts a Card entity to CardResponse
func (c *Card) ToResponse() *CardResponse {
	return &CardResponse{
		ID:        c.ID.Hex(),
		ColumnID:  c.ColumnID,
		TenderID:  c.TenderID,
		Title:     c.Title,
		Order:     c.Order,
		Priority:  c.Priority,
		Labels:    c.Labels,
		DueDate:   c.DueDate,
		CreatedAt: c.CreatedAt,
		UpdatedAt: c.UpdatedAt,
	}
}
