package handlers

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

	"furry-sos-backend/config"
)

type AdminHospitalRequest struct {
	Name      string  `json:"name"`
	Address   string  `json:"address"`
	Phone     string  `json:"phone"`
	Latitude  float64 `json:"latitude"`
	Longitude float64 `json:"longitude"`
	Is24Hours int     `json:"is_24_hours"`
	IsPartner int     `json:"is_partner"`
}

func writeHospitalJSON(
	w http.ResponseWriter,
	status int,
	data map[string]interface{},
) {
	w.Header().Set(
		"Content-Type",
		"application/json; charset=utf-8",
	)
	w.WriteHeader(status)
	_ = json.NewEncoder(w).Encode(data)
}

// POST /api/admin/hospitals
// PUT /api/admin/hospitals?id=1
// DELETE /api/admin/hospitals?id=1
func AdminHospitalCRUD(
	w http.ResponseWriter,
	r *http.Request,
) {
	switch r.Method {

	case http.MethodPost:

		var body AdminHospitalRequest

		if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
			writeHospitalJSON(
				w,
				http.StatusBadRequest,
				map[string]interface{}{
					"success": false,
					"message": "ข้อมูลโรงพยาบาลไม่ถูกต้อง",
				},
			)
			return
		}

		if body.Name == "" ||
			body.Address == "" ||
			body.Phone == "" {
			writeHospitalJSON(
				w,
				http.StatusBadRequest,
				map[string]interface{}{
					"success": false,
					"message": "กรุณากรอกชื่อ ที่อยู่ และเบอร์โทรศัพท์",
				},
			)
			return
		}

		result, err := config.DB.Exec(
			`
			INSERT INTO hospitals
			(
				name,
				address,
				phone,
				latitude,
				longitude,
				is_24_hours,
				is_partner
			)
			VALUES (?, ?, ?, ?, ?, ?, ?)
			`,
			body.Name,
			body.Address,
			body.Phone,
			body.Latitude,
			body.Longitude,
			body.Is24Hours,
			body.IsPartner,
		)

		if err != nil {
			writeHospitalJSON(
				w,
				http.StatusInternalServerError,
				map[string]interface{}{
					"success": false,
					"message": "เพิ่มโรงพยาบาลไม่สำเร็จ: " +
						err.Error(),
				},
			)
			return
		}

		id, _ := result.LastInsertId()

		writeHospitalJSON(
			w,
			http.StatusCreated,
			map[string]interface{}{
				"success":     true,
				"message":     "เพิ่มโรงพยาบาลสำเร็จ",
				"hospital_id": id,
			},
		)

	case http.MethodPut:

		id, err := strconv.Atoi(
			r.URL.Query().Get("id"),
		)

		if err != nil || id <= 0 {
			writeHospitalJSON(
				w,
				http.StatusBadRequest,
				map[string]interface{}{
					"success": false,
					"message": "hospital_id ไม่ถูกต้อง",
				},
			)
			return
		}

		var body AdminHospitalRequest

		if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
			writeHospitalJSON(
				w,
				http.StatusBadRequest,
				map[string]interface{}{
					"success": false,
					"message": "ข้อมูลโรงพยาบาลไม่ถูกต้อง",
				},
			)
			return
		}

		if body.Name == "" ||
			body.Address == "" ||
			body.Phone == "" {
			writeHospitalJSON(
				w,
				http.StatusBadRequest,
				map[string]interface{}{
					"success": false,
					"message": "กรุณากรอกชื่อ ที่อยู่ และเบอร์โทรศัพท์",
				},
			)
			return
		}

		result, err := config.DB.Exec(
			`
			UPDATE hospitals
			SET
				name = ?,
				address = ?,
				phone = ?,
				latitude = ?,
				longitude = ?,
				is_24_hours = ?,
				is_partner = ?
			WHERE hospital_id = ?
			`,
			body.Name,
			body.Address,
			body.Phone,
			body.Latitude,
			body.Longitude,
			body.Is24Hours,
			body.IsPartner,
			id,
		)

		if err != nil {
			writeHospitalJSON(
				w,
				http.StatusInternalServerError,
				map[string]interface{}{
					"success": false,
					"message": "แก้ไขโรงพยาบาลไม่สำเร็จ: " +
						err.Error(),
				},
			)
			return
		}

		affected, _ := result.RowsAffected()

		if affected == 0 {
			writeHospitalJSON(
				w,
				http.StatusNotFound,
				map[string]interface{}{
					"success": false,
					"message": "ไม่พบโรงพยาบาล",
				},
			)
			return
		}

		writeHospitalJSON(
			w,
			http.StatusOK,
			map[string]interface{}{
				"success":     true,
				"message":     "แก้ไขข้อมูลโรงพยาบาลสำเร็จ",
				"hospital_id": id,
			},
		)

	case http.MethodDelete:

		id, err := strconv.Atoi(
			r.URL.Query().Get("id"),
		)

		if err != nil || id <= 0 {
			writeHospitalJSON(
				w,
				http.StatusBadRequest,
				map[string]interface{}{
					"success": false,
					"message": "hospital_id ไม่ถูกต้อง",
				},
			)
			return
		}

		result, err := config.DB.Exec(
			`
			DELETE FROM hospitals
			WHERE hospital_id = ?
			`,
			id,
		)

		if err != nil {
			writeHospitalJSON(
				w,
				http.StatusInternalServerError,
				map[string]interface{}{
					"success": false,
					"message": "ลบโรงพยาบาลไม่สำเร็จ: " +
						err.Error(),
				},
			)
			return
		}

		affected, _ := result.RowsAffected()

		if affected == 0 {
			writeHospitalJSON(
				w,
				http.StatusNotFound,
				map[string]interface{}{
					"success": false,
					"message": "ไม่พบโรงพยาบาล",
				},
			)
			return
		}

		writeHospitalJSON(
			w,
			http.StatusOK,
			map[string]interface{}{
				"success":     true,
				"message":     "ลบโรงพยาบาลสำเร็จ",
				"hospital_id": id,
			},
		)

	default:

		writeHospitalJSON(
			w,
			http.StatusMethodNotAllowed,
			map[string]interface{}{
				"success": false,
				"message": "Method not allowed",
			},
		)
	}
}
