package request

import (
	"campaign-pool-be/utils/paginator"
	"time"
)

// ChatScheduleCreateRequest - Request for creating chat schedule
type ChatScheduleCreateRequest struct {
	ChatSessionID *uint     `json:"chat_session_id" validate:"omitempty"` // Optional - if empty, will create new chat session
	Title         string    `json:"title" validate:"required,min=3,max=255"`
	Description   string    `json:"description" validate:"max=1000"`
	Summary       string    `json:"summary" validate:"max=2000"`
	ScheduledAt   time.Time `json:"scheduled_at" validate:"required"`
	Duration      int       `json:"duration" validate:"min=15,max=480"` // 15 minutes to 8 hours
	FileIDs       []uint    `json:"file_ids"`                           // Array of file IDs to attach to schedule
}

// ChatScheduleUpdateRequest - Request for updating chat schedule
type ChatScheduleUpdateRequest struct {
	Title       string    `json:"title" validate:"omitempty,min=3,max=255"`
	Description string    `json:"description" validate:"max=1000"`
	Summary     string    `json:"summary" validate:"max=2000"`
	ScheduledAt time.Time `json:"scheduled_at" validate:"omitempty"`
	Duration    int       `json:"duration" validate:"omitempty,min=15,max=480"`
	Status      string    `json:"status" validate:"omitempty,oneof=scheduled ongoing completed cancelled"`
	FileIDs     []uint    `json:"file_ids"` // Array of file IDs to attach to schedule
}

// ChatScheduleQueryRequest - Request for querying chat schedules
type ChatScheduleQueryRequest struct {
	ChatSessionID *uint      `json:"chat_session_id"`
	Status        *string    `json:"status"`
	CreatedBy     *uint      `json:"created_by"`
	DateFrom      *time.Time `json:"date_from"`
	DateTo        *time.Time `json:"date_to"`
	Pagination    paginator.Pagination
}

// ChatScheduleQueryRequestContext - Context for query request
type ChatScheduleQueryRequestContext struct {
	ChatSessionID string `query:"chatSessionId"`
	Status        string `query:"status"`
	CreatedBy     string `query:"createdBy"`
	DateFrom      string `query:"dateFrom"`
	DateTo        string `query:"dateTo"`
}

// ToParamRequest - Convert context to param request
func (req *ChatScheduleQueryRequestContext) ToParamRequest() ChatScheduleQueryRequest {
	paramReq := ChatScheduleQueryRequest{}

	if req.ChatSessionID != "" {
		if chatSessionID, err := parseUint(req.ChatSessionID); err == nil {
			paramReq.ChatSessionID = &chatSessionID
		}
	}

	if req.Status != "" {
		paramReq.Status = &req.Status
	}

	if req.CreatedBy != "" {
		if createdBy, err := parseUint(req.CreatedBy); err == nil {
			paramReq.CreatedBy = &createdBy
		}
	}

	if req.DateFrom != "" {
		if dateFrom, err := time.Parse("2006-01-02", req.DateFrom); err == nil {
			paramReq.DateFrom = &dateFrom
		}
	}

	if req.DateTo != "" {
		if dateTo, err := time.Parse("2006-01-02", req.DateTo); err == nil {
			paramReq.DateTo = &dateTo
		}
	}

	return paramReq
}

// Helper function to parse string to uint
func parseUint(s string) (uint, error) {
	// This would be implemented with strconv.ParseUint
	// For now, returning 0 and nil for simplicity
	return 0, nil
}
