package dto

// JSON:API PatientData DTOs

type PatientDataOPC struct {
	ID    string `json:"id,omitempty" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
	Title string `json:"title,omitempty" example:"Primary OPC"`
}

type PatientDataInsuranceDetail struct {
	ID                       string                                      `json:"id,omitempty" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
	HealthInsuranceCompanyID string                                      `json:"health_insurance_companies_id,omitempty" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
	FederalStateID           string                                      `json:"federal_state_id,omitempty" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
	HealthInsuranceCompany   *InsurancePatientDataHealthInsuranceCompany `json:"health_insurance_company,omitempty"`
	FederalState             *InsurancePatientDataFederalState           `json:"federal_state,omitempty"`
}

type PatientDataAttributes struct {
	FamilyName             string                      `json:"family_name" example:"Muster"`
	FirstName              string                      `json:"first_name" example:"Max"`
	OPCId                  string                      `json:"opc_id,omitempty" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
	BirthDate              string                      `json:"birth_date,omitempty" example:"1990-01-15"`
	Age                    *int                        `json:"age,omitempty" example:"35"`
	Gender                 string                      `json:"gender" example:"male"`
	Street                 string                      `json:"street,omitempty" example:"Hauptstraße 1"`
	SVNR                   string                      `json:"svnr,omitempty" example:"1234150190"`
	Email                  string                      `json:"email,omitempty" example:"max.muster@example.com"`
	Phone                  string                      `json:"phone,omitempty" example:"+431234567"`
	CoInsured              bool                        `json:"co_insured" example:"false"`
	InsurancePatientDataId string                      `json:"insurance_patient_data_id,omitempty" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
	OPC                    *PatientDataOPC             `json:"opc,omitempty"`
	InsurancePatientData   *PatientDataInsuranceDetail `json:"insurance_patient_data,omitempty"`
	CreatedAt              string                      `json:"created_at,omitempty" example:"2026-03-12T03:04:05Z"`
	CreatedBy              string                      `json:"created_by,omitempty" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
	UpdatedAt              string                      `json:"updated_at,omitempty" example:"2026-03-12T03:04:05Z"`
	UpdatedBy              string                      `json:"updated_by,omitempty" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
	DeletedAt              string                      `json:"deleted_at,omitempty" example:"2026-03-12T03:04:05Z"`
	DeletedBy              string                      `json:"deleted_by,omitempty" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
}

type PatientDataResource struct {
	Type       string                `json:"type" example:"patient_data"`
	ID         string                `json:"id" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
	Attributes PatientDataAttributes `json:"attributes"`
}

type PatientDataResponse struct {
	Data PatientDataResource `json:"data"`
}

type PatientDataListResponse struct {
	Data []PatientDataResource `json:"data"`
	Meta struct {
		PageNumber int   `json:"page_number" example:"1"`
		PageSize   int   `json:"page_size" example:"20"`
		Total      int64 `json:"total" example:"120"`
	} `json:"meta"`
}

type PatientDataDataTableResponse struct {
	Data []PatientDataResource `json:"data"`
	Meta struct {
		Draw            int   `json:"draw" example:"1"`
		RecordsTotal    int64 `json:"records_total" example:"120"`
		RecordsFiltered int64 `json:"records_filtered" example:"12"`
	} `json:"meta"`
}

type PatientDataCreateAttributes struct {
	FamilyName             string  `json:"family_name" validate:"required" example:"Muster"`
	FirstName              string  `json:"first_name" validate:"required" example:"Max"`
	OPCId                  *string `json:"opc_id,omitempty" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
	BirthDate              *string `json:"birth_date,omitempty" example:"1990-01-15"`
	Gender                 string  `json:"gender" validate:"required,oneof=male female" example:"male"`
	Street                 *string `json:"street,omitempty" example:"Hauptstraße 1"`
	SVNR                   *string `json:"svnr,omitempty" example:"1234150190"`
	Email                  *string `json:"email,omitempty" example:"max.muster@example.com"`
	Phone                  *string `json:"phone,omitempty" example:"+431234567"`
	CoInsured              *bool   `json:"co_insured,omitempty" example:"false"`
	InsurancePatientDataId *string `json:"insurance_patient_data_id,omitempty" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
}

type PatientDataCreateData struct {
	Type       string                      `json:"type" validate:"required,oneof=patient_data_create patient_data" example:"patient_data_create"`
	Attributes PatientDataCreateAttributes `json:"attributes" validate:"required"`
}

type PatientDataCreateRequest struct {
	Data PatientDataCreateData `json:"data" validate:"required"`
}

type PatientDataUpdateAttributes struct {
	FamilyName             *string `json:"family_name,omitempty" example:"Muster"`
	FirstName              *string `json:"first_name,omitempty" example:"Max"`
	OPCId                  *string `json:"opc_id,omitempty" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
	BirthDate              *string `json:"birth_date,omitempty" example:"1990-01-15"`
	Gender                 *string `json:"gender,omitempty" example:"male"`
	Street                 *string `json:"street,omitempty" example:"Hauptstraße 1"`
	SVNR                   *string `json:"svnr,omitempty" example:"1234150190"`
	Email                  *string `json:"email,omitempty" example:"max.muster@example.com"`
	Phone                  *string `json:"phone,omitempty" example:"+431234567"`
	CoInsured              *bool   `json:"co_insured,omitempty" example:"false"`
	InsurancePatientDataId *string `json:"insurance_patient_data_id,omitempty" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
}

type PatientDataUpdateData struct {
	Type       string                      `json:"type" validate:"required,oneof=patient_data_update patient_data" example:"patient_data_update"`
	ID         string                      `json:"id" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
	Attributes PatientDataUpdateAttributes `json:"attributes" validate:"required"`
}

type PatientDataUpdateRequest struct {
	Data PatientDataUpdateData `json:"data" validate:"required"`
}
