package handler

import (
	"strconv"

	"github.com/Nanqipro/YunQue-Tech-Projects/ai_english_learning/serve/internal/common"
	"github.com/Nanqipro/YunQue-Tech-Projects/ai_english_learning/serve/internal/services"
	"github.com/gin-gonic/gin"
)

type LearningSessionHandler struct {
	sessionService *services.LearningSessionService
}

func NewLearningSessionHandler(sessionService *services.LearningSessionService) *LearningSessionHandler {
	return &LearningSessionHandler{sessionService: sessionService}
}

// StartLearning 开始学习
// POST /api/v1/vocabulary/books/:id/learn
func (h *LearningSessionHandler) StartLearning(c *gin.Context) {
	userID := c.GetInt64("user_id")
	bookID := c.Param("id")
	
	var req struct {
		DailyGoal int `json:"dailyGoal" binding:"required,min=1,max=100"`
	}
	
	if err := c.ShouldBindJSON(&req); err != nil {
		common.ErrorResponse(c, 400, "参数错误："+err.Error())
		return
	}
	
	// 创建学习会话
	session, err := h.sessionService.StartLearningSession(userID, bookID, req.DailyGoal)
	if err != nil {
		common.ErrorResponse(c, 500, "创建学习会话失败")
		return
	}
	
	// 获取今日学习任务（新词数 = 用户选择，复习词 = 所有到期）
	tasks, err := h.sessionService.GetTodayLearningTasks(userID, bookID, req.DailyGoal)
	if err != nil {
		common.ErrorResponse(c, 500, "获取学习任务失败")
		return
	}
	
	common.SuccessResponse(c, gin.H{
		"session": session,
		"tasks":   tasks,
	})
}

// GetTodayTasks 获取今日学习任务
// GET /api/v1/vocabulary/books/:id/tasks
func (h *LearningSessionHandler) GetTodayTasks(c *gin.Context) {
	userID := c.GetInt64("user_id")
	bookID := c.Param("id")
	
	newWordsLimit, _ := strconv.Atoi(c.DefaultQuery("newWords", "20"))
	
	// 获取学习任务（复习词不限数量）
	tasks, err := h.sessionService.GetTodayLearningTasks(userID, bookID, newWordsLimit)
	if err != nil {
		common.ErrorResponse(c, 500, "获取学习任务失败")
		return
	}
	
	common.SuccessResponse(c, tasks)
}

// SubmitWordStudy 提交单词学习结果
// POST /api/v1/vocabulary/words/:id/study
func (h *LearningSessionHandler) SubmitWordStudy(c *gin.Context) {
	userID := c.GetInt64("user_id")
	wordIDStr := c.Param("id")
	
	wordID, err := strconv.ParseInt(wordIDStr, 10, 64)
	if err != nil {
		common.ErrorResponse(c, 400, "无效的单词ID")
		return
	}
	
	var req struct {
		Difficulty string `json:"difficulty" binding:"required,oneof=forgot hard good easy perfect"`
		SessionID  int64  `json:"sessionId"`
	}
	
	if err := c.ShouldBindJSON(&req); err != nil {
		common.ErrorResponse(c, 400, "参数错误："+err.Error())
		return
	}
	
	// 记录学习结果
	progress, err := h.sessionService.RecordWordStudy(userID, wordID, req.Difficulty)
	if err != nil {
		common.ErrorResponse(c, 500, "记录学习结果失败")
		return
	}
	
	common.SuccessResponse(c, progress)
}

// GetLearningStatistics 获取学习统计
// GET /api/v1/vocabulary/books/:id/statistics
func (h *LearningSessionHandler) GetLearningStatistics(c *gin.Context) {
	userID := c.GetInt64("user_id")
	bookID := c.Param("id")
	
	stats, err := h.sessionService.GetLearningStatistics(userID, bookID)
	if err != nil {
		common.ErrorResponse(c, 500, "获取学习统计失败")
		return
	}
	
	common.SuccessResponse(c, stats)
}

// GetTodayOverallStatistics 获取今日总体学习统计
// GET /api/v1/learning/today/statistics
func (h *LearningSessionHandler) GetTodayOverallStatistics(c *gin.Context) {
	userID := c.GetInt64("user_id")
	
	stats, err := h.sessionService.GetTodayOverallStatistics(userID)
	if err != nil {
		common.ErrorResponse(c, 500, "获取今日学习统计失败")
		return
	}
	
	common.SuccessResponse(c, stats)
}

// GetTodayReviewWords 获取今日需要复习的单词
// GET /api/v1/learning/today/review-words
func (h *LearningSessionHandler) GetTodayReviewWords(c *gin.Context) {
	userID := c.GetInt64("user_id")
	
	words, err := h.sessionService.GetTodayReviewWords(userID)
	if err != nil {
		common.ErrorResponse(c, 500, "获取今日复习单词失败")
		return
	}
	
	common.SuccessResponse(c, words)
}
