package main

import (
	"log"
	"net/http"
	"os"
)

// cors добавляет заголовки для разработки (Vite dev-сервер на другом порту).
func cors(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Access-Control-Allow-Origin", "*")
		w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PATCH, DELETE, OPTIONS")
		w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
		if r.Method == http.MethodOptions {
			w.WriteHeader(http.StatusNoContent)
			return
		}
		next.ServeHTTP(w, r)
	})
}

func main() {
	addr := os.Getenv("ADDR")
	if addr == "" {
		addr = ":8080"
	}
	dataPath := os.Getenv("DATA_PATH")
	if dataPath == "" {
		dataPath = "bookclub-data.json"
	}

	api := &API{store: NewStore(dataPath)}
	mux := http.NewServeMux()

	// Клубы
	mux.HandleFunc("GET /api/clubs", api.listClubs)
	mux.HandleFunc("POST /api/clubs", api.createClub)
	mux.HandleFunc("GET /api/clubs/{id}", api.getClub)

	// Участники
	mux.HandleFunc("GET /api/clubs/{id}/members", api.listMembers)
	mux.HandleFunc("POST /api/clubs/{id}/members", api.joinClub)

	// Книги
	mux.HandleFunc("GET /api/clubs/{id}/books", api.listBooks)
	mux.HandleFunc("POST /api/clubs/{id}/books", api.addBook)
	mux.HandleFunc("POST /api/books/{bookId}/vote", api.voteBook)
	mux.HandleFunc("PATCH /api/books/{bookId}/status", api.setBookStatus)

	// Встречи
	mux.HandleFunc("GET /api/clubs/{id}/meetings", api.listMeetings)
	mux.HandleFunc("POST /api/clubs/{id}/meetings", api.createMeeting)

	// Обсуждение
	mux.HandleFunc("GET /api/clubs/{id}/posts", api.listPosts)
	mux.HandleFunc("POST /api/clubs/{id}/posts", api.addPost)

	// Отдача собранного фронтенда (если есть ./static), иначе только API.
	if _, err := os.Stat("static"); err == nil {
		mux.Handle("/", http.FileServer(http.Dir("static")))
	}

	log.Printf("book club API слушает на %s (данные: %s)", addr, dataPath)
	if err := http.ListenAndServe(addr, cors(mux)); err != nil {
		log.Fatal(err)
	}
}
