package pythondocs

import "time"

type Module struct {
	Name       string       `json:"name"`
	Path       string       `json:"path"`
	Doc        string       `json:"doc,omitempty"`
	Synopsis   string       `json:"synopsis,omitempty"`
	Classes    []*Class     `json:"classes,omitempty"`
	Functions  []*Function  `json:"functions,omitempty"`
	Exceptions []*Exception `json:"exceptions,omitempty"`
	Constants  []*Data      `json:"constants,omitempty"`
	Submodules []string     `json:"submodules,omitempty"`
	DocURL     string       `json:"doc_url"`
	Version    string       `json:"version,omitempty"`
	FetchedAt  time.Time    `json:"fetched_at"`
}

type Package struct {
	Name        string    `json:"name"`
	Version     string    `json:"version,omitempty"`
	Description string    `json:"description,omitempty"`
	Modules     []*Module `json:"modules,omitempty"`
	DocURL      string    `json:"doc_url"`
	Repository  string    `json:"repository,omitempty"`
	License     string    `json:"license,omitempty"`
	FetchedAt   time.Time `json:"fetched_at"`
}

type Class struct {
	Name          string       `json:"name"`
	Module        string       `json:"module"`
	QualName      string       `json:"qual_name"`
	Doc           string       `json:"doc,omitempty"`
	Signature     string       `json:"signature,omitempty"`
	Bases         []string     `json:"bases,omitempty"`
	Methods       []*Method    `json:"methods,omitempty"`
	ClassMethods  []*Method    `json:"classmethods,omitempty"`
	StaticMethods []*Method    `json:"staticmethods,omitempty"`
	Attributes    []*Attribute `json:"attributes,omitempty"`
	Properties    []*Property  `json:"properties,omitempty"`
	DocURL        string       `json:"doc_url"`
}

type Function struct {
	Name        string   `json:"name"`
	Module      string   `json:"module"`
	QualName    string   `json:"qual_name"`
	Doc         string   `json:"doc,omitempty"`
	Signature   string   `json:"signature"`
	Parameters  []*Param `json:"parameters,omitempty"`
	Returns     *Return  `json:"returns,omitempty"`
	Raises      []string `json:"raises,omitempty"`
	Examples    []string `json:"examples,omitempty"`
	DocURL      string   `json:"doc_url"`
	IsAsync     bool     `json:"is_async"`
	IsGenerator bool     `json:"is_generator"`
	Decorator   string   `json:"decorator,omitempty"`
}

type Method struct {
	Name          string   `json:"name"`
	Class         string   `json:"class"`
	QualName      string   `json:"qual_name"`
	Doc           string   `json:"doc,omitempty"`
	Signature     string   `json:"signature"`
	Parameters    []*Param `json:"parameters,omitempty"`
	Returns       *Return  `json:"returns,omitempty"`
	Raises        []string `json:"raises,omitempty"`
	Examples      []string `json:"examples,omitempty"`
	DocURL        string   `json:"doc_url"`
	IsAsync       bool     `json:"is_async"`
	IsClassMethod bool     `json:"is_classmethod"`
	IsStatic      bool     `json:"is_static"`
	IsAbstract    bool     `json:"is_abstract"`
	IsProperty    bool     `json:"is_property"`
}

type Property struct {
	Name       string `json:"name"`
	Class      string `json:"class"`
	Doc        string `json:"doc,omitempty"`
	Type       string `json:"type,omitempty"`
	Getter     string `json:"getter,omitempty"`
	Setter     string `json:"setter,omitempty"`
	Deleter    string `json:"deleter,omitempty"`
	DocURL     string `json:"doc_url"`
	IsReadOnly bool   `json:"is_readonly"`
}

type Attribute struct {
	Name   string `json:"name"`
	Class  string `json:"class"`
	Doc    string `json:"doc,omitempty"`
	Type   string `json:"type,omitempty"`
	Value  string `json:"value,omitempty"`
	DocURL string `json:"doc_url"`
}

type Exception struct {
	Name      string   `json:"name"`
	Module    string   `json:"module"`
	QualName  string   `json:"qual_name"`
	Doc       string   `json:"doc,omitempty"`
	Signature string   `json:"signature,omitempty"`
	Bases     []string `json:"bases,omitempty"`
	DocURL    string   `json:"doc_url"`
}

type Data struct {
	Name    string `json:"name"`
	Module  string `json:"module"`
	Doc     string `json:"doc,omitempty"`
	Type    string `json:"type,omitempty"`
	Value   string `json:"value,omitempty"`
	DocURL  string `json:"doc_url"`
	IsConst bool   `json:"is_const"`
}

type Param struct {
	Name         string `json:"name"`
	Type         string `json:"type,omitempty"`
	Default      string `json:"default,omitempty"`
	Doc          string `json:"doc,omitempty"`
	IsPositional bool   `json:"is_positional"`
	IsKeyword    bool   `json:"is_keyword"`
	IsVarArgs    bool   `json:"is_varargs"`
	IsKWArgs     bool   `json:"is_kwargs"`
}

type Return struct {
	Type string `json:"type,omitempty"`
	Doc  string `json:"doc,omitempty"`
}

type SearchResult struct {
	Name        string `json:"name"`
	Kind        string `json:"kind"`
	Path        string `json:"path"`
	Module      string `json:"module,omitempty"`
	Description string `json:"description,omitempty"`
	DocURL      string `json:"doc_url"`
	Score       int    `json:"score"`
}

type ItemKind string

const (
	ItemKindModule    ItemKind = "module"
	ItemKindClass     ItemKind = "class"
	ItemKindFunction  ItemKind = "function"
	ItemKindMethod    ItemKind = "method"
	ItemKindException ItemKind = "exception"
	ItemKindData      ItemKind = "data"
	ItemKindAttribute ItemKind = "attribute"
	ItemKindProperty  ItemKind = "property"
)

type Symbol struct {
	Name      string   `json:"name"`
	Kind      ItemKind `json:"kind"`
	Module    string   `json:"module"`
	QualName  string   `json:"qual_name,omitempty"`
	Signature string   `json:"signature,omitempty"`
	Doc       string   `json:"doc,omitempty"`
	DocURL    string   `json:"doc_url"`
}
