package com.example.quiz.data.remote;

import com.example.quiz.data.model.Course;
import com.example.quiz.data.model.MiseInitiale;
import com.example.quiz.data.model.PagedModel;
import com.example.quiz.data.model.Pari;
import com.example.quiz.data.model.PariMise;
import com.example.quiz.data.model.ParisResponse;
import com.example.quiz.data.model.PointDeVente;
import com.example.quiz.data.model.Restriction;
import com.example.quiz.data.model.Reunion;
import com.example.quiz.data.model.Tpe;
import com.example.quiz.data.model.dtos.auth.ChangePin;
import com.example.quiz.data.model.dtos.auth.LoginPayload;
import com.example.quiz.data.model.dtos.auth.LoginResponse;
import com.example.quiz.data.model.TpeResponse;
import com.example.quiz.data.model.dtos.auth.User;
import com.example.quiz.data.model.dtos.paris.SoldeResponse;
import java.util.List;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.PATCH;
import retrofit2.http.POST;

import retrofit2.http.Path;
import retrofit2.http.Query;

public interface ApiService {
    @GET("reunions/date/{date}")
    Call<List<Reunion>> getReunions(@Path("date") String date);

    @GET("courses")
    Call<PagedModel<Course>> getCourses(@Query("reunionDate") String reunionDate, @Query("statut") String statut);

    @POST("paris")
    Call<ParisResponse> createPari(@Body Pari pari);

    @POST("auth/agent/login")
    Call<LoginResponse> login(@Body LoginPayload loginPayload);

    @GET("paris/agent/{agentId}/today")
    Call<List<ParisResponse>> derniersParis(@Path("agentId") String agentId);

    @PATCH("paris/numero/{numeroTicket}/cancel")
    Call<ParisResponse> annulerPari(@Path("numeroTicket") String numeroTicket, @Query("agentId") String agentId);
    @PATCH("paris/numero/{numeroTicket}/rembourser")
    Call<ParisResponse> rembourserPari(@Path("numeroTicket") String numeroTicket);

    @PATCH("paris/numero/{numeroTicket}/pay")
    Call<ParisResponse> payerPari(@Path("numeroTicket") String numeroTicket);


    @GET("paris/numero/{numeroTicket}")
    Call<ParisResponse> getPariByNumero(@Path("numeroTicket") String numeroTicket);

    @GET("paris/agent/{agentId}/solde/course/{courseId}")
    Call<SoldeResponse> getSoldeByCourse(@Path("agentId") String createdBy, @Path("courseId") String courseId);

    @GET("paris/agent/{agentId}/solde")
    Call<SoldeResponse> getSoldeByDay(@Path("agentId") String agentId, @Query("date") String day);

    @POST("terminaux")
    Call<TpeResponse> createTpe(@Body Tpe tpe);

    @GET("terminaux/{id}")
    Call<TpeResponse> getTpeById(@Path("id") String id);

    @GET("points-de-vente")
    Call<PagedModel<PointDeVente>> getPointsDeVente(@Query("nom") String nom);

    @GET("points-de-vente/{id}")
    Call<PointDeVente> getPointDeVenteById(@Path("id") String id);

    @PATCH("agents/me/pin")
    Call<User> changePin(@Body ChangePin pin);

    @GET("config/mise-initiale")
    Call<List<MiseInitiale>> getBetInitMise();

    @GET("agents/byMaster/{masterId}")
    Call<List<User>> getAgentsByMaster(@Path("masterId") String masterId);
    @GET("agents/{agentId}")
    Call<User> getAgent(@Path("agentId") String agentId);
    @GET("agents/{agentId}/available-bets")
    Call<List<Course.TypeParis>> getAvailableBets(@Path("agentId") String agentId);

    @PATCH("agents/{masterId}/slaves/{slaveId}/access")
    Call<Void> setAccess(@Path("masterId") String masterId, @Path("slaveId") String slaveId, @Query("block") boolean access);

    @POST("agents/{masterId}/slaves/{slaveId}/available-bets")
    Call<Void> setRestrictions(@Path("masterId") String masterId, @Path("slaveId") String slaveId, @Body Restriction restrictions);

}
