package patient

type Coding struct {
	System       string `bson:"system,omitempty"`
	Version      string `bson:"version,omitempty"`
	Code         string `bson:"code,omitempty"`
	Display      string `bson:"display,omitempty"`
	UserSelected bool   `bson:"userSelected,omitempty"`
}

type Identifier struct {
	Use      string          `bson:"use,omitempty"`
	Type     CodeableConcept `bson:"type,omitempty"`
	System   string          `bson:"system,omitempty"`
	Value    string          `bson:"value,omitempty"`
	Period   Period          `bson:"period,omitempty"`
	Assigner struct{}        `bson:"assigner,omitempty"`
}

type CodeableConcept struct {
	Coding []Coding `bson:"coding,omitempty"`
	Text   string   `bson:"text,omitempty"`
}

type Period struct {
	Start string `bson:"start,omitempty"`
	End   string `bson:"end,omitempty"`
}

type ContactPoint struct {
	System string `bson:"system,omitempty"`
	Value  string `bson:"value,omitempty"`
	Use    string `bson:"use,omitempty"`
	Rank   int    `bson:"rank,omitempty"`
	Period Period `bson:"period,omitempty"`
}

type HumanName struct {
	Use    string   `bson:"use,omitempty"`
	Text   string   `bson:"text,omitempty"`
	Family string   `bson:"family,omitempty"`
	Given  []string `bson:"given,omitempty"`
	Prefix []string `bson:"prefix,omitempty"`
	Suffix []string `bson:"suffix,omitempty"`
	Period Period   `bson:"period,omitempty"`
}

type Address struct {
	Use        string   `bson:"use,omitempty"`
	Type       string   `bson:"type,omitempty"`
	Text       string   `bson:"text,omitempty"`
	Line       []string `bson:"line,omitempty"`
	City       string   `bson:"city,omitempty"`
	District   string   `bson:"district,omitempty"`
	State      string   `bson:"state,omitempty"`
	PostalCode string   `bson:"postalCode,omitempty"`
	Country    string   `bson:"country,omitempty"`
	Period     Period   `bson:"period,omitempty"`
}

type Organization struct {
	Reference string `bson:"reference,omitempty"`
}

type Contact struct {
	Relationship []CodeableConcept `bson:"relationship,omitempty"`
	Name         []HumanName       `bson:"name,omitempty"`
	Telecom      []ContactPoint    `bson:"telecom,omitempty"`
	Address      Address           `bson:"address,omitempty"`
	Organization Organization      `bson:"organization,omitempty"`
	Gender       string            `bson:"gender,omitempty"`
	Period       Period            `bson:"period,omitempty"`
}

type Communication struct {
	Language  CodeableConcept `bson:"language,omitempty"`
	Preferred bool            `bson:"preferred,omitempty"`
}

type ReqInsertCommunication struct {
	Language  Coding `bson:"language,omitempty"`
	Preferred bool   `bson:"preferred,omitempty"`
}

type Link struct {
	RelatePerson []RelatePerson `bson:"relatePerson,omitempty"`
}

type RelatePerson struct {
	Identifier    []Identifier    `bson:"identifier,omitempty"`
	Active        bool            `bson:"active"`
	Patient       string          `bson:"patient"`
	Relationship  CodeableConcept `bson:"relationship"`
	Name          []HumanName     `bson:"name,omitempty"`
	Telecom       []ContactPoint  `bson:"telecom,omitempty"`
	Gender        string          `bson:"gender,omitempty"`
	BirthDate     string          `bson:"birthDate,omitempty"`
	Address       []Address       `bson:"address,omitempty"`
	Photo         string          `bson:"photo,omitempty"`
	Period        Period          `bson:"period,omitempty"`
	Communication []Communication `bson:"communication,omitempty"`
	Preferred     bool            `bson:"preferred"`
}

type Deceased struct {
	DeceasedBoolean  bool   `bson:"deceasedBoolean,omitempty"`
	DeceasedDateTime string `bson:"deceasedDateTime,omitempty"`
}

type MultipleBirth struct {
	MultipleBirthBoolean bool `bson:"multipleBirthBoolean,omitempty"`
	MultipleBirthInteger int  `bson:"multipleBirthInteger,omitempty"`
}

type Patient struct {
	ResourceType  string          `bson:"resourceType"`
	ID            string          `bson:"_id"`
	Identifier    []Identifier    `bson:"identifier,omitempty"`
	Active        bool            `bson:"active"`
	Name          []HumanName     `bson:"name,omitempty"`
	Telecom       []ContactPoint  `bson:"telecom,omitempty"`
	Gender        string          `bson:"gender,omitempty"`
	BirthPlace    string          `bson:"birthPlace,omitempty"`
	BirthDate     string          `bson:"birthDate,omitempty"`
	Address       []Address       `bson:"address,omitempty"`
	MaritalStatus CodeableConcept `bson:"maritalStatus,omitempty"`
	Job           CodeableConcept `bson:"job,omitempty"`
	Religion      CodeableConcept `bson:"religion,omitempty"`
	Tribe         CodeableConcept `bson:"tribe,omitempty"`
	Link          Link            `bson:"link,omitempty"`
	Communication []Communication `bson:"communication,omitempty"`
	Disability    bool            `bson:"disability,omitempty"`
	National      string          `bson:"national,omitempty"`
	Deceased      Deceased        `bson:"deceased,omitempty"`
	MultipleBirth MultipleBirth   `bson:"multipleBirth,omitempty"`
	CreatedAt     string          `bson:"createdAt"`
	UpdatedAt     string          `bson:"updatedAt"`
}

type ReqInsertIdentifier struct {
	Use    string `bson:"use,omitempty"`
	Type   Coding `bson:"type,omitempty"`
	System string `bson:"system,omitempty"`
	Value  string `bson:"value,omitempty"`
	Period Period `bson:"period,omitempty"`
}

type ReqInsertPatient struct {
	Identifier    []ReqInsertIdentifier `bson:"identifier,omitempty"`
	Active        bool                  `bson:"active"`
	Name          []HumanName           `bson:"name,omitempty"`
	Telecom       []ContactPoint        `bson:"telecom,omitempty"`
	Gender        string                `bson:"gender,omitempty"`
	BirthPlace    string                `bson:"birthPlace,omitempty"`
	BirthDate     string                `bson:"birthDate,omitempty"`
	Address       []Address             `bson:"address,omitempty"`
	MaritalStatus []CodeableConcept     `bson:"maritalStatus,omitempty"`
	Job           []CodeableConcept     `bson:"job,omitempty"`
	Religion      []CodeableConcept     `bson:"religion,omitempty"`
	Tribe         []CodeableConcept     `bson:"tribe,omitempty"`
	Link          Link                  `bson:"link,omitempty"`
	Communication []Communication       `bson:"communication,omitempty"`
	Disability    bool                  `bson:"disability,omitempty"`
	National      string                `bson:"national,omitempty"`
	Deceased      Deceased              `bson:"deceased,omitempty"`
	MultipleBirth MultipleBirth         `bson:"multipleBirth,omitempty"`
}
