package handlers

import (
	"encoding/json"
	"net/http"
	"strings"

	"furry-sos-backend/config"
)

// ======================================================
// UPDATE BODY RETRIEVAL STATUS (อัปเดตสถานะทีละขั้น)
// POST /api/volunteer/body-retrieval/update-status
// Header: X-User-ID
// Body: { "report_id": 123, "status": "arriving" }
// ======================================================
func UpdateVolunteerBodyRetrievalStatus(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Content-Type", "application/json; charset=utf-8")

	if r.Method != http.MethodPost {
		w.WriteHeader(http.StatusMethodNotAllowed)
		json.NewEncoder(w).Encode(map[string]interface{}{
			"success": false, "message": "Method not allowed",
		})
		return
	}

	userID, err := getVolunteerUserID(r)
	if err != nil {
		w.WriteHeader(http.StatusUnauthorized)
		json.NewEncoder(w).Encode(map[string]interface{}{
			"success": false, "message": "ไม่พบ User ID",
		})
		return
	}

	role, err := getUserRole(userID)
	if err != nil || role != "volunteer" {
		w.WriteHeader(http.StatusForbidden)
		json.NewEncoder(w).Encode(map[string]interface{}{
			"success": false, "message": "บัญชีนี้ไม่ใช่อาสาสมัคร",
		})
		return
	}

	var volunteerID int
	err = config.DB.QueryRow(`
		SELECT volunteer_id FROM volunteers
		WHERE user_id = ? AND is_approved = 1 LIMIT 1
	`, userID).Scan(&volunteerID)

	if err != nil {
		w.WriteHeader(http.StatusNotFound)
		json.NewEncoder(w).Encode(map[string]interface{}{
			"success": false, "message": "ไม่พบข้อมูลอาสาสมัคร",
		})
		return
	}

	var body struct {
		ReportID int    `json:"report_id"`
		Status   string `json:"status"`
	}
	if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
		w.WriteHeader(http.StatusBadRequest)
		json.NewEncoder(w).Encode(map[string]interface{}{
			"success": false, "message": "ข้อมูลไม่ถูกต้อง",
		})
		return
	}

	if body.ReportID <= 0 {
		w.WriteHeader(http.StatusBadRequest)
		json.NewEncoder(w).Encode(map[string]interface{}{
			"success": false, "message": "ไม่พบ report_id",
		})
		return
	}

	// Validate status
	var statusDesc string
	var statusOrder int
	var updateReportStatus string // ค่าที่จะเก็บใน deceased_reports.status

	switch strings.ToLower(body.Status) {
	case "accepted":
		statusDesc = "รับเคสแล้ว"
		statusOrder = 1
		updateReportStatus = "accepted"      // ✅ เปลี่ยน
	case "arriving":
		statusDesc = "กำลังเดินทาง"
		statusOrder = 2
		updateReportStatus = "arriving"      // ✅ เปลี่ยน
	case "arrived":
		statusDesc = "ถึงจุดเกิดเหตุ"
		statusOrder = 3
		updateReportStatus = "arrived"       // ✅ เปลี่ยน
	case "collected":
		statusDesc = "เก็บกู้ซากแล้ว"
		statusOrder = 4
		updateReportStatus = "collected"
	case "completed":
		statusDesc = "เสร็จสิ้น"
		statusOrder = 5
		updateReportStatus = "completed"
	default:
		w.WriteHeader(http.StatusBadRequest)
		json.NewEncoder(w).Encode(map[string]interface{}{
			"success": false, "message": "สถานะไม่ถูกต้อง",
		})
		return
	}

	tx, err := config.DB.Begin()
	if err != nil {
		w.WriteHeader(http.StatusInternalServerError)
		json.NewEncoder(w).Encode(map[string]interface{}{
			"success": false, "message": "เริ่ม Transaction ไม่ได้",
		})
		return
	}
	defer tx.Rollback()

	// 1. ตรวจสอบว่าเคสนี้เป็นของ volunteer คนนี้จริง
	var currentAssigned int
	var caseCode string
	var reportUserID int
	err = tx.QueryRow(`
		SELECT COALESCE(assigned_volunteer_id, 0), 
		       COALESCE(CONCAT('BR-', LPAD(report_id, 4, '0')), ''), 
		       user_id
		FROM deceased_reports
		WHERE report_id = ? LIMIT 1
	`, body.ReportID).Scan(&currentAssigned, &caseCode, &reportUserID)

	if err != nil {
		w.WriteHeader(http.StatusNotFound)
		json.NewEncoder(w).Encode(map[string]interface{}{
			"success": false, "message": "ไม่พบเคสนี้",
		})
		return
	}

	if currentAssigned != volunteerID {
		w.WriteHeader(http.StatusForbidden)
		json.NewEncoder(w).Encode(map[string]interface{}{
			"success": false, "message": "คุณไม่ใช่ผู้รับผิดชอบเคสนี้",
		})
		return
	}

	// 2. อัปเดต deceased_reports.status (coarse status)
	_, err = tx.Exec(`
		UPDATE deceased_reports
		SET status = ?, updated_at = NOW()
		WHERE report_id = ?
	`, updateReportStatus, body.ReportID)

	if err != nil {
		w.WriteHeader(http.StatusInternalServerError)
		json.NewEncoder(w).Encode(map[string]interface{}{
			"success": false, "message": err.Error(),
		})
		return
	}

	// 3. ปิด tracking เก่า
	tx.Exec(`
		UPDATE case_tracking 
		SET is_current = 0 
		WHERE report_id = ? AND report_type = 'deceased'
	`, body.ReportID)

	// 4. Insert tracking ใหม่
	_, err = tx.Exec(`
		INSERT INTO case_tracking
		(report_id, report_type, status, status_description, status_order, is_current, created_by, created_at)
		VALUES (?, 'deceased', ?, ?, ?, 1, 'volunteer', NOW())
	`, body.ReportID, body.Status, statusDesc, statusOrder)

	if err != nil {
		w.WriteHeader(http.StatusInternalServerError)
		json.NewEncoder(w).Encode(map[string]interface{}{
			"success": false, "message": "บันทึก tracking ไม่สำเร็จ: " + err.Error(),
		})
		return
	}

	// 5. Notification (เฉพาะ completed)
	if body.Status == "completed" {
		tx.Exec(`
			INSERT INTO notifications (user_id, title, message, reference_id, is_read, created_at)
			VALUES (?, ?, ?, ?, 0, NOW())
		`, reportUserID, "งานเก็บกู้เสร็จสิ้น",
			"เคส "+caseCode+" : อาสาสมัครเก็บกู้ซากสัตว์เรียบร้อยแล้ว", body.ReportID)
	}

	if err := tx.Commit(); err != nil {
		w.WriteHeader(http.StatusInternalServerError)
		json.NewEncoder(w).Encode(map[string]interface{}{
			"success": false, "message": "commit ไม่สำเร็จ",
		})
		return
	}

	w.WriteHeader(http.StatusOK)
	json.NewEncoder(w).Encode(map[string]interface{}{
		"success":   true,
		"message":   "อัปเดตสถานะสำเร็จ",
		"status":    body.Status,
		"case_code": caseCode,
	})
}