package main

import (
	"database/sql"
	"fmt"
	"net/http"
	"os"
	"rtcord-v81/handlers"
	"strconv"

	_ "github.com/go-sql-driver/mysql"
	"github.com/joho/godotenv"
)

var port = 8090

func main() {
	var err error
	_ = godotenv.Load()
	dbURL := fmt.Sprintf("%s:%s@tcp(%s)/%s?parseTime=true",
		os.Getenv("DB_USER"),
		os.Getenv("DB_PASS"),
		os.Getenv("DB_IP"),
		os.Getenv("DB_NAME"),
	)
	if envPort := os.Getenv("PORT"); envPort != "" {
		if p, err := strconv.Atoi(envPort); err == nil {
			port = p
		}
	}
	db, err := sql.Open("mysql", dbURL)
	if err != nil {
		fmt.Println("DSN parsing error:", err)
		return
	}

	err = db.Ping()
	if err != nil {
		fmt.Println("Connection error:", err)
		return
	}

	userAPI := handlers.NewUserAPI(db)
	if err := userAPI.EnsureUserProfilesTable(); err != nil {
		fmt.Println("User profile migration error:", err)
		return
	}
	http.Handle("/assets/", http.StripPrefix("/assets/", http.FileServer(http.Dir("public/assets"))))
	http.Handle("/themes/", http.StripPrefix("/themes/", http.FileServer(http.Dir("public/themes"))))
	http.Handle("/themes.json", http.FileServer(http.Dir("public")))
	http.HandleFunc("/", handlers.MainPage)
	http.HandleFunc("/servers/", handlers.ServerPage)
	http.HandleFunc("/conversations", handlers.ConversationsPage)
	http.HandleFunc("/profile", userAPI.ProfilePage)
	http.HandleFunc("/admin", userAPI.AdminPage)
	http.HandleFunc("/admin/warnings", userAPI.AdminWarningsPage)
	http.HandleFunc("/admin/reports", userAPI.AdminReportsPage)
	http.HandleFunc("/account/warnings", userAPI.AccountWarningsPage)
	http.HandleFunc("/reset-password", handlers.PasswordResetPage)
	http.HandleFunc("/invites/", userAPI.InvitePage)
	http.HandleFunc("/api/register", userAPI.Register)
	http.HandleFunc("/api/login", userAPI.Login)
	http.HandleFunc("/api/logout", userAPI.Logout)
	http.HandleFunc("/api/verify-email", userAPI.VerifyEmail)
	http.HandleFunc("/api/password-reset/request", userAPI.RequestPasswordReset)
	http.HandleFunc("/api/password-reset", userAPI.ResetPassword)
	http.HandleFunc("/api/account/email", userAPI.AccountEmail)
	http.HandleFunc("/api/users/me", userAPI.GetUserUUIDFromToken)
	http.HandleFunc("/api/users/", userAPI.GetUserNameFromUUID)
	http.HandleFunc("/api/account", userAPI.Account)
	http.HandleFunc("/api/reports", userAPI.Reports)
	http.HandleFunc("/api/friends", userAPI.Friends)
	http.HandleFunc("/api/friends/", userAPI.Friends)
	http.HandleFunc("/api/conversations", userAPI.Conversations)
	http.HandleFunc("/api/conversations/", userAPI.Conversations)
	http.HandleFunc("/api/conversations/{conversation_id}/ws", userAPI.ConversationWebsocket)
	http.HandleFunc("/api/admin", userAPI.Admin)
	http.HandleFunc("/api/admin/", userAPI.Admin)
	http.HandleFunc("/api/servers", userAPI.Servers)
	http.HandleFunc("/api/servers/", userAPI.Servers)
	http.HandleFunc("/api/invites/", userAPI.Invites)
	http.HandleFunc("/api/channels/{channel_id}/ws", userAPI.ChannelWebsocket)
	http.HandleFunc("/uploads/", userAPI.ServeAttachment)
	http.HandleFunc("/profile-uploads/", userAPI.ServeProfileAvatar)
	fmt.Printf("listening on port %d\n", port)
	if err := http.ListenAndServe(fmt.Sprintf(":%d", port), nil); err != nil {
		fmt.Println("Server error:", err)
	}
}
