package handlers

import (
	"encoding/json"
	"net/http"
	"time"

	"github.com/golang-jwt/jwt/v5"
)

// JWTSecret 应该在实际环境中使用环境变量
var JWTSecret = []byte("crm-go-secret-key")

// LoginRequest 登录请求结构
type LoginRequest struct {
	Username string `json:"username"`
	Password string `json:"password"`
}

// LoginResponse 登录返回结构
type LoginResponse struct {
	Token string `json:"token"`
}

// AuthHandler 身份验证处理器
type AuthHandler struct{}

// NewAuthHandler 创建身份验证处理器
func NewAuthHandler() *AuthHandler {
	return &AuthHandler{}
}

// Login 处理登录请求
func (h *AuthHandler) Login(w http.ResponseWriter, r *http.Request) {
	if r.Method != http.MethodPost {
		http.Error(w, "方法不允许", http.StatusMethodNotAllowed)
		return
	}

	var req LoginRequest
	if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
		http.Error(w, "请求参数错误", http.StatusBadRequest)
		return
	}

	// 定义用户账户和角色
	// admin: 只读用户，不能删除数据
	// administrator: 管理员，拥有完全控制权限
	type UserInfo struct {
		Password string
		Role     string
	}

	users := map[string]UserInfo{
		"admin":         {Password: "digua666", Role: "viewer"}, // 只读用户
		"administrator": {Password: "digua888", Role: "admin"},  // 管理员
	}

	// 验证用户名和密码
	user, exists := users[req.Username]
	if !exists || user.Password != req.Password {
		http.Error(w, "用户名或密码错误", http.StatusUnauthorized)
		return
	}

	// 生成 JWT Token，包含角色信息
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
		"username": req.Username,
		"role":     user.Role,
		"exp":      time.Now().Add(time.Hour * 24).Unix(), // 24小时过期
	})

	tokenString, err := token.SignedString(JWTSecret)
	if err != nil {
		http.Error(w, "无法生成Token", http.StatusInternalServerError)
		return
	}

	w.Header().Set("Content-Type", "application/json")
	json.NewEncoder(w).Encode(LoginResponse{Token: tokenString})
}
