package de.oaa.xxx.app.data.api

import de.oaa.xxx.app.data.model.BeitrittsanfrageDto
import de.oaa.xxx.app.data.model.CountResponse
import de.oaa.xxx.app.data.model.GruppeDto
import de.oaa.xxx.app.data.model.GruppenbeitragDto
import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.DELETE
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.PUT
import retrofit2.http.Path
import retrofit2.http.Query

interface GruppenApi {

    @GET("gruppen/search")
    suspend fun search(@Query("q") query: String): Response<List<GruppeDto>>

    @GET("gruppen/mine")
    suspend fun getMine(): Response<List<GruppeDto>>

    @GET("gruppen/{id}")
    suspend fun getGruppe(@Path("id") id: String): Response<GruppeDto>

    @POST("gruppen")
    suspend fun createGruppe(@Body gruppe: GruppeDto): Response<GruppeDto>

    @PUT("gruppen/{id}")
    suspend fun updateGruppe(@Path("id") id: String, @Body gruppe: GruppeDto): Response<GruppeDto>

    @DELETE("gruppen/{id}")
    suspend fun deleteGruppe(@Path("id") id: String): Response<Unit>

    @POST("gruppen/{id}/join")
    suspend fun join(@Path("id") id: String): Response<Unit>

    @DELETE("gruppen/{id}/leave")
    suspend fun leave(@Path("id") id: String): Response<Unit>

    @GET("gruppen/{id}/members")
    suspend fun getMembers(@Path("id") id: String): Response<List<Map<String, Any>>>

    @DELETE("gruppen/{id}/members/{userId}")
    suspend fun removeMember(@Path("id") id: String, @Path("userId") userId: String): Response<Unit>

    @POST("gruppen/{id}/members/{userId}/promote")
    suspend fun promoteMember(@Path("id") id: String, @Path("userId") userId: String): Response<Unit>

    @GET("gruppen/{id}/requests")
    suspend fun getRequests(@Path("id") id: String): Response<List<BeitrittsanfrageDto>>

    @POST("gruppen/{id}/requests/{reqId}/approve")
    suspend fun approveRequest(@Path("id") id: String, @Path("reqId") reqId: String): Response<Unit>

    @DELETE("gruppen/{id}/requests/{reqId}")
    suspend fun rejectRequest(@Path("id") id: String, @Path("reqId") reqId: String): Response<Unit>

    @GET("gruppen/requests/pending/count")
    suspend fun getPendingRequestsCount(): Response<CountResponse>

    @GET("gruppen/requests/mine")
    suspend fun getMyRequests(): Response<List<BeitrittsanfrageDto>>

    // --- Beitraege ---
    @GET("gruppen/{id}/beitraege")
    suspend fun getBeitraege(
        @Path("id") id: String,
        @Query("page") page: Int = 0,
        @Query("size") size: Int = 20
    ): Response<List<GruppenbeitragDto>>

    @POST("gruppen/{id}/beitraege")
    suspend fun createBeitrag(
        @Path("id") id: String,
        @Body beitrag: GruppenbeitragDto
    ): Response<GruppenbeitragDto>

    @POST("gruppen/{id}/beitraege/{beitragId}/like")
    suspend fun toggleLike(@Path("id") id: String, @Path("beitragId") beitragId: String): Response<Unit>

    @POST("gruppen/{id}/beitraege/{beitragId}/vote")
    suspend fun vote(
        @Path("id") id: String,
        @Path("beitragId") beitragId: String,
        @Body body: Map<String, String>
    ): Response<Unit>

    @DELETE("gruppen/{id}/beitraege/{beitragId}")
    suspend fun deleteBeitrag(
        @Path("id") id: String,
        @Path("beitragId") beitragId: String
    ): Response<Unit>
}
