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

import de.oaa.xxx.app.data.model.Aufgabe
import de.oaa.xxx.app.data.model.AufgabenGruppe
import de.oaa.xxx.app.data.model.AufgabenGruppeDisplay
import de.oaa.xxx.app.data.model.Favorit
import de.oaa.xxx.app.data.model.Finisher
import de.oaa.xxx.app.data.model.Sperre
import de.oaa.xxx.app.data.model.Strafe
import de.oaa.xxx.app.data.model.Toy
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 AufgabenApi {

    // --- Aufgabengruppen ---
    @GET("gruppe/list/user")
    suspend fun getUserGruppen(
        @Query("page") page: Int = 0,
        @Query("size") size: Int = 20
    ): Response<List<AufgabenGruppeDisplay>>

    @GET("gruppe/list/system")
    suspend fun getSystemGruppen(
        @Query("page") page: Int = 0,
        @Query("size") size: Int = 20
    ): Response<List<AufgabenGruppeDisplay>>

    @GET("gruppe/all")
    suspend fun getAllGruppen(
        @Query("name") name: String? = null,
        @Query("page") page: Int = 0,
        @Query("size") size: Int = 20
    ): Response<List<AufgabenGruppeDisplay>>

    @GET("gruppe/{gruppeId}")
    suspend fun getGruppe(@Path("gruppeId") gruppeId: String): Response<AufgabenGruppe>

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

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

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

    @POST("gruppe/copy/{gruppeId}")
    suspend fun copyGruppe(@Path("gruppeId") gruppeId: String): Response<AufgabenGruppe>

    // --- Aufgaben ---
    @GET("aufgabe/{aufgabeId}")
    suspend fun getAufgabe(@Path("aufgabeId") aufgabeId: String): Response<Aufgabe>

    @POST("aufgabe")
    suspend fun createAufgabe(@Body aufgabe: Aufgabe): Response<Aufgabe>

    @PUT("aufgabe/{aufgabeId}")
    suspend fun updateAufgabe(
        @Path("aufgabeId") aufgabeId: String,
        @Body aufgabe: Aufgabe
    ): Response<Aufgabe>

    @DELETE("aufgabe")
    suspend fun deleteAufgabe(@Body aufgabe: Aufgabe): Response<Unit>

    // --- Toys ---
    @GET("toy/list/user")
    suspend fun getUserToys(
        @Query("page") page: Int = 0,
        @Query("size") size: Int = 20
    ): Response<List<Toy>>

    @GET("toy/list/system")
    suspend fun getSystemToys(
        @Query("page") page: Int = 0,
        @Query("size") size: Int = 20
    ): Response<List<Toy>>

    @GET("toy/available")
    suspend fun getAvailableToys(): Response<List<Toy>>

    @POST("toy")
    suspend fun createToy(@Body toy: Toy): Response<Toy>

    @PUT("toy/{toyId}")
    suspend fun updateToy(@Path("toyId") toyId: String, @Body toy: Toy): Response<Toy>

    @DELETE("toy/{toyId}")
    suspend fun deleteToy(@Path("toyId") toyId: String): Response<Unit>

    @POST("toy/copy/{toyId}")
    suspend fun copyToy(@Path("toyId") toyId: String): Response<Toy>

    // --- Favoriten ---
    @GET("favorit")
    suspend fun getFavoriten(): Response<List<Favorit>>

    @POST("favorit")
    suspend fun addFavorit(@Body favorit: Favorit): Response<Favorit>

    @DELETE("favorit")
    suspend fun removeFavorit(@Body favorit: Favorit): Response<Unit>

    // --- Abonnements ---
    @GET("abo/list")
    suspend fun getAbonnements(
        @Query("page") page: Int = 0,
        @Query("size") size: Int = 20
    ): Response<List<AufgabenGruppeDisplay>>

    @GET("abo/discover")
    suspend fun discoverGruppen(@Query("name") name: String? = null): Response<List<AufgabenGruppeDisplay>>

    @POST("abo/{gruppenId}")
    suspend fun subscribe(@Path("gruppenId") gruppenId: String): Response<Unit>

    @DELETE("abo/{gruppenId}")
    suspend fun unsubscribe(@Path("gruppenId") gruppenId: String): Response<Unit>

    // --- Sperren ---
    @POST("sperre")
    suspend fun createSperre(@Body sperre: Sperre): Response<Sperre>

    @PUT("sperre/{sperreId}")
    suspend fun updateSperre(@Path("sperreId") sperreId: String, @Body sperre: Sperre): Response<Sperre>

    @DELETE("sperre")
    suspend fun deleteSperre(@Body sperre: Sperre): Response<Unit>

    // --- Strafen ---
    @POST("strafe")
    suspend fun createStrafe(@Body strafe: Strafe): Response<Strafe>

    @PUT("strafe/{strafeId}")
    suspend fun updateStrafe(@Path("strafeId") strafeId: String, @Body strafe: Strafe): Response<Strafe>

    @DELETE("strafe")
    suspend fun deleteStrafe(@Body strafe: Strafe): Response<Unit>

    // --- Finisher ---
    @POST("finisher")
    suspend fun createFinisher(@Body finisher: Finisher): Response<Finisher>

    @PUT("finisher/{finisherId}")
    suspend fun updateFinisher(
        @Path("finisherId") finisherId: String,
        @Body finisher: Finisher
    ): Response<Finisher>

    @DELETE("finisher")
    suspend fun deleteFinisher(@Body finisher: Finisher): Response<Unit>
}
