package api

type FiltroOpcao struct {
	Codigo    any    `json:"codigo"`
	Descricao string `json:"descricao"`
}

type FiltroDef struct {
	Param             string        `json:"param"`
	Nome              string        `json:"nome"`
	Descricao         string        `json:"descricao"`
	Tipo              string        `json:"tipo"`
	Opcoes            []FiltroOpcao `json:"opcoes"`
	EndpointListagem  *string       `json:"endpoint_listagem"`
}

type FiltrosMetaOut struct {
	Filtros []FiltroDef `json:"filtros"`
}

type PaginacaoOut struct {
	NextCursor *string `json:"next_cursor"`
	HasMore    bool    `json:"has_more"`
}

type EstabelecimentoOut struct {
	CNPJ                              string  `json:"cnpj"`
	CNPJBasico                        string  `json:"cnpj_basico"`
	RazaoSocial                       string  `json:"razao_social"`
	NomeFantasia                      *string `json:"nome_fantasia"`
	IdentificadorMatrizFilial         int     `json:"identificador_matriz_filial"`
	IdentificadorMatrizFilialDescricao string `json:"identificador_matriz_filial_descricao"`
	SituacaoCadastral                 int     `json:"situacao_cadastral"`
	SituacaoCadastralDescricao        string  `json:"situacao_cadastral_descricao"`
	CNAEFiscalPrincipal               int     `json:"cnae_fiscal_principal"`
	CNAEFiscalPrincipalDescricao      string  `json:"cnae_fiscal_principal_descricao"`
	UF                                string  `json:"uf"`
	Municipio                         int     `json:"municipio"`
	MunicipioNome                     string  `json:"municipio_nome"`
	CEP                               string  `json:"cep"`
	Bairro                            string  `json:"bairro"`
	Logradouro                        string  `json:"logradouro"`
	DDD1                              *string `json:"ddd_1"`
	Telefone1                         *string `json:"telefone_1"`
	DDD2                              *string `json:"ddd_2"`
	Telefone2                         *string `json:"telefone_2"`
	CorreioEletronico                 *string `json:"correio_eletronico"`
}

type EstabelecimentoSearchOut struct {
	Total      *int                 `json:"total"`
	Items      []EstabelecimentoOut `json:"items"`
	NextCursor *string              `json:"next_cursor"`
	HasMore    bool                 `json:"has_more"`
}

type MunicipioItem struct {
	Codigo    int    `json:"codigo"`
	Descricao string `json:"descricao"`
}

type FiltroOpcoesOut struct {
	Param      string        `json:"param"`
	Total      int           `json:"total"`
	Items      []FiltroOpcao `json:"items"`
	NextCursor *string       `json:"next_cursor"`
	HasMore    bool          `json:"has_more"`
}

type MunicipiosOut struct {
	Param      string          `json:"param"`
	Total      int             `json:"total"`
	Items      []MunicipioItem `json:"items"`
	NextCursor *string         `json:"next_cursor"`
	HasMore    bool            `json:"has_more"`
}

type CnaeItem struct {
	Codigo    string `json:"codigo"`
	Descricao string `json:"descricao"`
}

type CnaesOut struct {
	Param      string     `json:"param"`
	Total      int        `json:"total"`
	Items      []CnaeItem `json:"items"`
	NextCursor *string    `json:"next_cursor"`
	HasMore    bool       `json:"has_more"`
}

type EmpresaOut struct {
	CNPJBasico                 string `json:"cnpj_basico"`
	RazaoSocial                string `json:"razao_social"`
	NaturezaJuridicaDescricao  string `json:"natureza_juridica_descricao"`
	CapitalSocial              string `json:"capital_social"`
	PorteEmpresa               any    `json:"porte_empresa"`
}

type EnderecoOut struct {
	TipoLogradouro   string `json:"tipo_logradouro"`
	Logradouro       string `json:"logradouro"`
	Numero           string `json:"numero"`
	Complemento      *string `json:"complemento"`
	Bairro           string `json:"bairro"`
	CEP              string `json:"cep"`
	UF               string `json:"uf"`
	Municipio        struct {
		Codigo    int    `json:"codigo"`
		Descricao string `json:"descricao"`
	} `json:"municipio"`
	EnderecoCompleto string `json:"endereco_completo"`
}

type CnaeOut struct {
	Codigo    string `json:"codigo"`
	Descricao string `json:"descricao"`
}

type TelefoneOut struct {
	DDD      string `json:"ddd"`
	Numero   string `json:"numero"`
	Completo string `json:"completo"`
}

type ContatosOut struct {
	Telefone1 *TelefoneOut `json:"telefone_1"`
	Telefone2 *TelefoneOut `json:"telefone_2"`
	Email     *string      `json:"email"`
}

type SocioOut struct {
	NomeSocio                  string `json:"nome_socio"`
	NomeSocioRazaoSocial       string `json:"nome_socio_razao_social"`
	QualificacaoSocioDescricao string `json:"qualificacao_socio_descricao"`
}

type EmpresaDetailOut struct {
	Empresa          EmpresaOut           `json:"empresa"`
	Estabelecimentos []EstabelecimentoOut `json:"estabelecimentos"`
	Socios           []SocioOut           `json:"socios"`
	Simples          any                  `json:"simples"`
}

type EstabelecimentoDetailOut struct {
	CNPJ                         string       `json:"cnpj"`
	CNPJBasico                   string       `json:"cnpj_basico"`
	TipoUnidade                  string       `json:"tipo_unidade"`
	NomeFantasia                 *string      `json:"nome_fantasia"`
	SituacaoCadastralDescricao   string       `json:"situacao_cadastral_descricao"`
	DataSituacaoCadastralFormatada string     `json:"data_situacao_cadastral_formatada"`
	DataInicioAtividadeFormatada string       `json:"data_inicio_atividade_formatada"`
	DataInicioAtividade          any          `json:"data_inicio_atividade"`
	IdentificadorMatrizFilialDescricao string `json:"identificador_matriz_filial_descricao"`
	Empresa                      EmpresaOut   `json:"empresa"`
	Endereco                     EnderecoOut  `json:"endereco"`
	CNAE                         struct {
		Principal   CnaeOut   `json:"principal"`
		Secundarios []CnaeOut `json:"secundarios"`
	} `json:"cnae"`
	Contatos ContatosOut `json:"contatos"`
	Socios   []SocioOut  `json:"socios"`
	Simples  any         `json:"simples"`
}

type APIError struct {
	Status  int
	Code    string
	Message string
}

func (e *APIError) Error() string {
	if e.Code != "" {
		return e.Code + ": " + e.Message
	}
	return e.Message
}
