package handlers

import (
	"database/sql"
	"encoding/json"
	"net/http"
	"strconv"
	"strings"

	"furry-sos-backend/config"
)

// ======================================================
// GET VOLUNTEER HISTORY (ประวัติการช่วยเหลือของอาสา)
//
// GET /api/volunteer/history?user_id=X
// Header: X-User-ID
//
// ✅ รองรับทั้ง emergency + deceased (ทุก status)
// ✅ ใช้ case_tracking เป็น source of truth
// ✅ ดึง accepted_at จาก case_assignments
// ======================================================
func GetVolunteerHistory(
	w http.ResponseWriter,
	r *http.Request,
) {
	if r.Method != http.MethodGet {
		http.Error(
			w,
			"Method not allowed",
			http.StatusMethodNotAllowed,
		)
		return
	}

	w.Header().Set(
		"Content-Type",
		"application/json; charset=utf-8",
	)

	// ⛔ กัน browser cache
	w.Header().Set(
		"Cache-Control",
		"no-store, no-cache, must-revalidate, max-age=0",
	)
	w.Header().Set("Pragma", "no-cache")
	w.Header().Set("Expires", "0")

	// =====================================================
	// USER ID
	// =====================================================

	userIDStr := strings.TrimSpace(
		r.URL.Query().Get("user_id"),
	)

	if userIDStr == "" {
		userIDStr = strings.TrimSpace(
			r.Header.Get("X-User-ID"),
		)
	}

	userID, err := strconv.Atoi(userIDStr)

	if err != nil || userID <= 0 {
		http.Error(
			w,
			"Invalid user_id",
			http.StatusBadRequest,
		)
		return
	}

	// =====================================================
	// FIND VOLUNTEER
	// =====================================================

	var volunteerID int

	err = config.DB.QueryRow(
		`
		SELECT volunteer_id
		FROM volunteers
		WHERE user_id = ?
		LIMIT 1
		`,
		userID,
	).Scan(&volunteerID)

	if err != nil {

		if err == sql.ErrNoRows {
			http.Error(
				w,
				"ไม่พบข้อมูลอาสาสมัคร",
				http.StatusNotFound,
			)
			return
		}

		http.Error(
			w,
			"ค้นหาข้อมูลอาสาสมัครไม่สำเร็จ: "+err.Error(),
			http.StatusInternalServerError,
		)
		return
	}

	// =====================================================
	// CREATE REVIEW TABLE (safety)
	// =====================================================

	createVolunteerReviewsTable()

	// =====================================================
	// HISTORY QUERY
	//
	// ✅ ใช้ case_tracking.status เป็น source of truth
	// ✅ ไม่กรอง status → โชว์ทุกเคสที่อาสารับผิดชอบ
	// ✅ ดึง accepted_at จาก case_assignments
	// ✅ เรียงตาม updated_at DESC
	// =====================================================

	query := `
		SELECT
			report_id,
			report_type,
			case_code,
			title,
			created_at,
			updated_at,
			accepted_at,
			status,
			rating
		FROM
		(
			-- =============================================
			-- EMERGENCY
			-- =============================================
			SELECT
				e.report_id,
				'emergency' AS report_type,
				COALESCE(e.case_code, CONCAT('SOS-', e.report_id)) AS case_code,

				CASE
					WHEN COALESCE(e.injury_type, '') <> ''
					THEN e.injury_type
					ELSE 'ช่วยเหลือสัตว์ฉุกเฉิน'
				END AS title,

				e.created_at,

				COALESCE(
					(
						SELECT MAX(ct.created_at)
						FROM case_tracking ct
						WHERE ct.report_id = e.report_id
						  AND ct.report_type = 'emergency'
					),
					e.updated_at,
					e.created_at
				) AS updated_at,

				COALESCE(
					(
						SELECT MAX(ca.accepted_at)
						FROM case_assignments ca
						WHERE ca.report_id = e.report_id
						  AND ca.report_type = 'emergency'
					),
					e.created_at
				) AS accepted_at,

				COALESCE(e.status, 'pending') AS status,

				(
					SELECT AVG(vr.rating)
					FROM volunteer_reviews vr
					WHERE vr.assignment_id = e.report_id
					  AND vr.volunteer_id = e.assigned_volunteer_id
				) AS rating
			FROM emergency_reports e
			WHERE e.assigned_volunteer_id = ?

			UNION ALL

			-- =============================================
			-- DECEASED
			-- =============================================
			SELECT
				d.report_id,
				'deceased' AS report_type,
				CONCAT('BR-', LPAD(d.report_id, 4, '0')) AS case_code,

				CASE
					WHEN COALESCE(d.animal_type, '') <> ''
					THEN d.animal_type
					ELSE 'จัดการซากสัตว์'
				END AS title,

				d.created_at,

				COALESCE(
					(
						SELECT MAX(ct.created_at)
						FROM case_tracking ct
						WHERE ct.report_id = d.report_id
						  AND ct.report_type = 'deceased'
					),
					d.updated_at,
					d.created_at
				) AS updated_at,

				COALESCE(
					(
						SELECT MAX(ca.accepted_at)
						FROM case_assignments ca
						WHERE ca.report_id = d.report_id
						  AND ca.report_type = 'deceased'
					),
					d.created_at
				) AS accepted_at,

				COALESCE(d.status, 'pending') AS status,

				(
					SELECT AVG(vr.rating)
					FROM volunteer_reviews vr
					WHERE vr.assignment_id = d.report_id
					  AND vr.volunteer_id = d.assigned_volunteer_id
				) AS rating
			FROM deceased_reports d
			WHERE d.assigned_volunteer_id = ?
		) AS history
		ORDER BY updated_at DESC, created_at DESC
	`

	rows, err := config.DB.Query(
		query,
		volunteerID,
		volunteerID,
	)

	if err != nil {
		http.Error(
			w,
			"โหลดประวัติการช่วยเหลือไม่สำเร็จ: "+err.Error(),
			http.StatusInternalServerError,
		)
		return
	}

	defer rows.Close()

	// =====================================================
	// RESULT
	// =====================================================

	cases := make(
		[]map[string]interface{},
		0,
	)

	for rows.Next() {

		var (
			reportID   int
			reportType string
			caseCode   string
			title      string
			createdAt  interface{}
			updatedAt  interface{}
			acceptedAt interface{}
			status     string
			rating     sql.NullFloat64
		)

		err := rows.Scan(
			&reportID,
			&reportType,
			&caseCode,
			&title,
			&createdAt,
			&updatedAt,
			&acceptedAt,
			&status,
			&rating,
		)

		if err != nil {
			continue
		}

		ratingValue := 0.0

		if rating.Valid {
			ratingValue = rating.Float64
		}

		cases = append(
			cases,
			map[string]interface{}{
				"report_id":   reportID,
				"report_type": reportType,
				"case_code":   caseCode,
				"title":       title,
				"created_at":  createdAt,
				"updated_at":  updatedAt,
				"accepted_at": acceptedAt,
				"status":      status,
				"rating":      ratingValue,
			},
		)
	}

	if err := rows.Err(); err != nil {
		http.Error(
			w,
			"อ่านข้อมูลประวัติไม่สำเร็จ: "+err.Error(),
			http.StatusInternalServerError,
		)
		return
	}

	// =====================================================
	// TOTAL CASES
	// =====================================================

	var totalCases int

	err = config.DB.QueryRow(
		`
		SELECT
			(
				SELECT COUNT(*)
				FROM emergency_reports
				WHERE assigned_volunteer_id = ?
			)
			+
			(
				SELECT COUNT(*)
				FROM deceased_reports
				WHERE assigned_volunteer_id = ?
			)
		`,
		volunteerID,
		volunteerID,
	).Scan(&totalCases)

	if err != nil {
		totalCases = len(cases)
	}

	// =====================================================
	// AVERAGE RATING
	// =====================================================

	var averageRating sql.NullFloat64

	err = config.DB.QueryRow(
		`
		SELECT AVG(rating)
		FROM volunteer_reviews
		WHERE volunteer_id = ?
		`,
		volunteerID,
	).Scan(&averageRating)

	avgRating := 0.0

	if err == nil && averageRating.Valid {
		avgRating = averageRating.Float64
	}

	// =====================================================
	// RESPONSE
	// =====================================================

	json.NewEncoder(w).Encode(
		map[string]interface{}{
			"success":        true,
			"user_id":        userID,
			"volunteer_id":   volunteerID,
			"total_cases":    totalCases,
			"average_rating": avgRating,
			"cases":          cases,
		},
	)
}