package elinps

import (
	"crypto/rand"
	"encoding/hex"
	"net/http"

	"github.com/go-chi/chi/v5"
	"github.com/jackc/pgx/v5/pgxpool"
)

// PainelHandlers expõe o painel de exploração em /painel.
//
// O painel é protegido por senha via SENHA_PAINEL.
// A sessão é um cookie simples com token gerado a cada inicialização.
type PainelHandlers struct {
	auth  AuthPainel
	store *Store
}

func NewPainelHandlers(pool *pgxpool.Pool, senha string) *PainelHandlers {
	token := gerarTokenPainel()
	return &PainelHandlers{
		auth:  AuthPainel{Senha: senha, Token: token},
		store: NewStore(pool),
	}
}

// Router monta as rotas do painel.
func (p *PainelHandlers) Router() http.Handler {
	r := chi.NewRouter()

	// Login
	r.Get("/login", p.auth.handlerLoginGet)
	r.Post("/login", p.auth.handlerLoginPost)

	// Dashboard
	r.With(func(next http.Handler) http.Handler { return p.auth.middleware(next) }).Get("/", func(w http.ResponseWriter, r *http.Request) {
		p.auth.handlerPainel(w, r, p.store)
	})

	return r
}

func gerarTokenPainel() string {
	// Token aleatório para o cookie do painel.
	// Importante: muda a cada boot (ao reiniciar o servidor, precisa logar de novo).
	b := make([]byte, 32)
	_, _ = rand.Read(b)
	return hex.EncodeToString(b)
}
