package contratos

import "time"

// Tipos centralizados do projeto.
//
// Regra: este arquivo concentra as tipagens (structs) usadas como contratos de
// dados entre camadas (backend, painel e widget/WASM), para manter consistência
// e facilitar auditoria.

// ------------------------------
// API do widget
// ------------------------------

type PedidoInput struct {
	ProdutoNome     string `json:"produto_nome"`
	InquilinoCodigo string `json:"inquilino_codigo"`
	InquilinoNome   string `json:"inquilino_nome"`
	UsuarioCodigo   string `json:"usuario_codigo"`
	UsuarioNome     string `json:"usuario_nome"`
	UsuarioTelefone string `json:"usuario_telefone"`
	UsuarioEmail    string `json:"usuario_email"`
}

type PedidoResponse struct {
	PodeAbrir bool   `json:"pode_abrir"`
	Motivo    string `json:"motivo,omitempty"`
	ID        string `json:"id,omitempty"`
	// Produto normalizado retornado pelo backend para montar URL segura.
	Produto string `json:"produto,omitempty"`
}

type PatchInput struct {
	Nota          *int    `json:"nota,omitempty"`
	Justificativa *string `json:"justificativa,omitempty"`
	Finalizar     bool    `json:"finalizar,omitempty"`
}

type Registro struct {
	// ProdutoNome é o nome original do produto como enviado pela integração/widget.
	// Ele existe apenas para exibição ao usuário.
	//
	// Importante: a normalização (remoção de acentos/símbolos) é usada apenas
	// para formar o nome da tabela no Postgres e o parâmetro {produto} da rota.
	ProdutoNome    string
	ID             string
	Status         string
	Nota           *int
	Justificativa  *string
	PedidoCriadoEm time.Time
	RespondidoEm   *time.Time
}

// FormPageData é o payload para renderização do formulário no iframe.
type FormPageData struct {
	Produto string
	ID      string
	Reg     Registro
}

// ------------------------------
// Painel
// ------------------------------

// NPSMensal representa o cálculo do NPS agregado por mês.
type NPSMensal struct {
	Mes        string
	Detratores int
	Neutros    int
	Promotores int
	Total      int
	NPS        int
}

// RespostaPainel representa uma resposta para listagem no painel.
type RespostaPainel struct {
	ID              string
	RespondidoEm    *time.Time
	PedidoCriadoEm  time.Time
	InquilinoCodigo string
	InquilinoNome   string
	UsuarioCodigo   *string
	UsuarioNome     string
	UsuarioEmail    *string
	UsuarioTelefone *string
	Nota            *int
	Justificativa   *string
}

type PainelDados struct {
	Produto       string
	Produtos      []string
	Meses         []NPSMensal
	Respostas     []RespostaPainel
	Pagina        int
	SomenteBaixas bool
	MsgErro       string
}

type ListarRespostasFiltro struct {
	SomenteNotasBaixas bool
	Pagina             int
	PorPagina          int
}

func (f *ListarRespostasFiltro) Normalizar() {
	if f.Pagina <= 0 {
		f.Pagina = 1
	}
	if f.PorPagina <= 0 || f.PorPagina > 200 {
		f.PorPagina = 50
	}
}

// ------------------------------
// Widget/WASM
// ------------------------------

// ConfigWidget representa as opções passadas para window.ELiNPS.init(...).
// No WASM lemos via syscall/js; aqui fica apenas a tipagem centralizada.
type ConfigWidget struct {
	ProdutoNome        string
	InquilinoCodigo    string
	InquilinoNome      string
	UsuarioCodigo      string
	UsuarioNome        string
	UsuarioTelefone    string
	UsuarioEmail       string
	CooldownHours      float64
	DataMinimaAbertura string
}
