package models

import (
    "time"
    "github.com/go-playground/validator/v10"
)

// BaseRequest contains common fields for all requests
type BaseRequest struct {
    RequestID string    `json:"request_id,omitempty"`
    Timestamp time.Time `json:"timestamp,omitempty"`
}

// BaseResponse contains common fields for all responses
type BaseResponse struct {
    Status    string      `json:"status"`
    Message   string      `json:"message"`
    Data      interface{} `json:"data,omitempty"`
    RequestID string      `json:"request_id,omitempty"`
}

// ErrorResponse represents an error response
type ErrorResponse struct {
    Status    string `json:"status"`
    Message   string `json:"message"`
    RequestID string `json:"request_id,omitempty"`
}

// SuccessResponse represents a success response
type SuccessResponse struct {
    Status    string `json:"status"`
    Message   string `json:"message"`
    RequestID string `json:"request_id,omitempty"`
}

// SearchData contains search results
type SearchData struct {
    Results []interface{} `json:"results"`
    Total   int           `json:"total"`
    Limit   int           `json:"limit"`
    Offset  int           `json:"offset"`
}

// Patient Models
// Generated at: 2025-09-07 17:42:51

// PatientCreateRequest represents a request to create a Patient
type PatientCreateRequest struct {
    BaseRequest
    // Add fields specific to Patient creation
    Name        string `json:"name" validate:"required"`
    Description string `json:"description" validate:"omitempty"`
}

// PatientUpdateRequest represents a request to update a Patient
type PatientUpdateRequest struct {
    BaseRequest
    ID          string `json:"id" validate:"required,uuid"`
    Name        string `json:"name" validate:"required"`
    Description string `json:"description" validate:"omitempty"`
}

// PatientResponse represents a response for Patient operations
type PatientResponse struct {
    BaseResponse
}

// PatientSearchResponse represents a response for Patient search
type PatientSearchResponse struct {
    BaseResponse
    Data SearchData `json:"data"`
}

// PatientData represents the data structure for Patient
type PatientData struct {
    ID          string    `json:"id"`
    Name        string    `json:"name"`
    Description string    `json:"description,omitempty"`
    CreatedAt   time.Time `json:"created_at"`
    UpdatedAt   time.Time `json:"updated_at,omitempty"`
}

// Validate validates the PatientCreateRequest
func (r *PatientCreateRequest) Validate() error {
    validate := validator.New()
    return validate.Struct(r)
}

// Validate validates the PatientUpdateRequest
func (r *PatientUpdateRequest) Validate() error {
    validate := validator.New()
    return validate.Struct(r)
}

// NewPatientData creates a new PatientData with default values
func NewPatientData(name, description string) *PatientData {
    now := time.Now()
    return &PatientData{
        ID:          "", // Will be set by the database
        Name:        name,
        Description: description,
        CreatedAt:   now,
        UpdatedAt:   now,
    }
}