package router

import (
	"tm/internal/company"
	"tm/internal/customer"
	"tm/internal/feedback"
	"tm/internal/tender"
	"tm/internal/tender_approval"
	"tm/internal/user"

	"github.com/labstack/echo/v4"
)

func RegisterAdminRoutes(e *echo.Echo, userHandler *user.Handler, companyHandler *company.Handler, customerHandler *customer.Handler, tenderHandler *tender.TenderHandler, feedbackHandler *feedback.Handler, tenderApprovalHandler *tender_approval.Handler) {
	adminV1 := e.Group("/admin/v1")

	// Admin Users Routes
	adminUsersGP := adminV1.Group("/users")
	{
		adminUsersGP.Use(userHandler.AuthMiddleware())
		adminUsersGP.POST("", userHandler.CreateUser)
		adminUsersGP.GET("", userHandler.ListUsers)
		adminUsersGP.GET("/:id", userHandler.GetUserByID)
		adminUsersGP.PUT("/:id", userHandler.UpdateUser)
		adminUsersGP.DELETE("/:id", userHandler.DeleteUser)
		adminUsersGP.PUT("/:id/status", userHandler.UpdateUserStatus)
	}

	// Admin user profile
	profileGP := adminV1.Group("/profile")
	{
		userAuthorizationGP := profileGP.Group("")
		userAuthorizationGP.POST("/login", userHandler.Login)
		userAuthorizationGP.POST("/refresh-token", userHandler.RefreshToken)
		userAuthorizationGP.POST("/reset-password", userHandler.ResetPassword)

		userProfileGP := profileGP.Group("")
		userProfileGP.Use(userHandler.AuthMiddleware())
		userProfileGP.GET("", userHandler.GetProfile)
		userProfileGP.PUT("", userHandler.UpdateProfile)
		userProfileGP.PUT("/change-password", userHandler.ChangePassword)
		userProfileGP.DELETE("/logout", userHandler.Logout)
	}

	// Admin Companies Routes
	companiesGP := adminV1.Group("/companies")
	{
		companiesGP.Use(userHandler.AuthMiddleware())
		companiesGP.POST("", companyHandler.CreateCompany)
		companiesGP.GET("", companyHandler.ListCompanies)
		companiesGP.GET("/:id", companyHandler.GetCompany)
		companiesGP.PUT("/:id", companyHandler.UpdateCompany)
		companiesGP.DELETE("/:id", companyHandler.DeleteCompany)
		companiesGP.GET("/search", companyHandler.SearchCompanies)
		companiesGP.PATCH("/:id/status", companyHandler.UpdateCompanyStatus)
		companiesGP.PATCH("/:id/verification", companyHandler.UpdateCompanyVerification)
		companiesGP.PUT("/:id/tags", companyHandler.UpdateCompanyTags)
		companiesGP.POST("/:id/tags/add", companyHandler.AddTags)
		companiesGP.POST("/:id/tags/remove", companyHandler.RemoveTags)
		companiesGP.POST("/:id/verify", companyHandler.VerifyCompany)
		companiesGP.POST("/:id/suspend", companyHandler.SuspendCompany)
		companiesGP.POST("/:id/activate", companyHandler.ActivateCompany)
		companiesGP.GET("/stats", companyHandler.GetCompanyStats)
		companiesGP.GET("/type/:type", companyHandler.GetCompaniesByType)
		companiesGP.GET("/status/:status", companyHandler.GetCompaniesByStatus)
		companiesGP.GET("/industry/:industry", companyHandler.GetCompaniesByIndustry)
	}

	// Admin Customers Routes
	customersGP := adminV1.Group("/customers")
	{
		customersGP.Use(userHandler.AuthMiddleware())
		customersGP.POST("", customerHandler.CreateCustomer)
		customersGP.GET("", customerHandler.ListCustomers)
		customersGP.GET("/:id", customerHandler.GetCustomerByID)
		customersGP.PUT("/:id", customerHandler.UpdateCustomer)
		customersGP.DELETE("/:id", customerHandler.DeleteCustomer)
		customersGP.PATCH("/:id/status", customerHandler.UpdateCustomerStatus)
		customersGP.PATCH("/:id/verification", customerHandler.UpdateCustomerVerification)
		customersGP.POST("/:id/verify", customerHandler.VerifyCustomer)
		customersGP.POST("/:id/suspend", customerHandler.SuspendCustomer)
		customersGP.POST("/:id/activate", customerHandler.ActivateCustomer)
		customersGP.GET("/company/:companyId", customerHandler.GetCustomersByCompanyID)
		customersGP.GET("/type/:type", customerHandler.GetCustomersByType)
		customersGP.GET("/status/:status", customerHandler.GetCustomersByStatus)
		customersGP.POST("/:id/companies/assign", customerHandler.AssignCompaniesToCustomer)
		customersGP.POST("/:id/companies/remove", customerHandler.RemoveCompaniesFromCustomer)
	}

	// Admin Tenders Routes
	tendersGP := adminV1.Group("/tenders")
	{
		tendersGP.Use(userHandler.AuthMiddleware())
		tendersGP.GET("", tenderHandler.ListTenders)
		tendersGP.GET("/:id", tenderHandler.GetTender)
		tendersGP.PUT("/:id", tenderHandler.UpdateTender)
		tendersGP.DELETE("/:id", tenderHandler.DeleteTender)
	}

	// Admin Feedback Routes
	feedbackGP := adminV1.Group("/feedback")
	{
		feedbackGP.Use(userHandler.AuthMiddleware())
		feedbackGP.GET("", feedbackHandler.ListFeedback)
		feedbackGP.GET("/:id", feedbackHandler.GetFeedback)
		feedbackGP.DELETE("/:id", feedbackHandler.DeleteFeedback)
	}

	// Admin Tender-Approvals Routes
	tenderApprovalGP := adminV1.Group("/tender-approvals")
	{
		tenderApprovalGP.Use(userHandler.AuthMiddleware())
		tenderApprovalGP.GET("", tenderApprovalHandler.ListTenderApprovals)
		tenderApprovalGP.GET("/:id", tenderApprovalHandler.GetTenderApproval)
		tenderApprovalGP.GET("/stats", tenderApprovalHandler.GetTenderApprovalStats)
		tenderApprovalGP.GET("/submission-mode/:submission_mode", tenderApprovalHandler.GetTenderApprovalsBySubmissionMode)
		tenderApprovalGP.GET("/status/:status", tenderApprovalHandler.GetTenderApprovalsByStatus)
	}
}

func RegisterPublicRoutes(e *echo.Echo, customerHandler *customer.Handler, tenderHandler *tender.TenderHandler, feedbackHandler *feedback.Handler, tenderApprovalHandler *tender_approval.Handler, companyHandler *company.Handler) {
	v1 := e.Group("/api/v1")

	customerGP := v1.Group("/profile")
	{
		customerGP.POST("/login", customerHandler.Login)
		customerGP.POST("/refresh-token", customerHandler.RefreshToken)

		profileGP := customerGP.Group("")
		profileGP.Use(customerHandler.AuthMiddleware())
		profileGP.GET("", customerHandler.GetProfile)
		profileGP.DELETE("/logout", customerHandler.Logout)
	}

	// Public Tenders Routes
	tendersGP := v1.Group("/tenders")
	tendersGP.Use(customerHandler.AuthMiddleware())
	{
		tendersGP.GET("", tenderHandler.GetPublicTenders)
		tendersGP.GET("/recommend", tenderHandler.RecommendTenders)
		tendersGP.GET("/details/:id", tenderHandler.GetPublicTenderDetails)
	}

	// Public Feedback Routes
	feedbackGP := v1.Group("/feedback")
	{
		feedbackGP.Use(customerHandler.AuthMiddleware())
		feedbackGP.POST("", feedbackHandler.ToggleFeedback)
		feedbackGP.GET("", feedbackHandler.PublicListFeedback)
		feedbackGP.GET("/tender/:tender_id", feedbackHandler.PublicGetFeedbackByTenderID)
		feedbackGP.GET("/:id", feedbackHandler.PublicGetFeedback)
		feedbackGP.GET("/stats/company", feedbackHandler.GetCompanyFeedbackStats)
	}

	// Public Tender Approvals Routes
	tenderApprovalGP := v1.Group("/tender-approvals")
	{
		tenderApprovalGP.Use(customerHandler.AuthMiddleware())
		tenderApprovalGP.POST("", tenderApprovalHandler.ToggleTenderApproval)
		tenderApprovalGP.GET("", tenderApprovalHandler.PublicGetTenderApprovals)
		tenderApprovalGP.GET("/:id", tenderApprovalHandler.GetPublicTenderApproval)
		tenderApprovalGP.GET("/tender/:tender_id", tenderApprovalHandler.GetTenderApprovalByTenderAndCompany)
		tenderApprovalGP.GET("/stats", tenderApprovalHandler.GetCompanyTenderApprovalStats)
	}

	// Public Company Routes
	companiesGP := v1.Group("/companies")
	{
		companiesGP.Use(customerHandler.AuthMiddleware())
		companiesGP.GET("", companyHandler.MyCompany)
	}
}
