package com.example.citrusclient.viewmodels; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; import com.example.citrusclient.models.Todo; import com.example.citrusclient.models.Book; import com.example.citrusclient.rest.TodosRest; import java.util.ArrayList; import java.util.HashMap; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; import retrofit2.Retrofit; import retrofit2.converter.jackson.JacksonConverterFactory; public class TodosViewModel extends ViewModel { private final Retrofit retrofit; private final TodosRest todosRest; //LiveData private final MutableLiveData<HashMap<Integer, HashMap<Integer, HashMap<Integer, HashMap<Integer, Todo>>>>> allTodosLiveData; private final MutableLiveData<HashMap<Integer, HashMap<Integer, Todo>>> TodosByMonthLiveData; private final MutableLiveData<HashMap<Integer, Todo>> TodosByDayLiveData; private final MutableLiveData<Todo> TodoByIdLiveData; private final MutableLiveData<String> errorLiveData; //Constructor public TodosViewModel() { this.retrofit = new Retrofit.Builder() .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/citrus/") .addConverterFactory(JacksonConverterFactory.create()) .build(); this.todosRest = retrofit.create(TodosRest.class); this.allTodosLiveData = new MutableLiveData<>(); this.TodosByMonthLiveData = new MutableLiveData<>(); this.TodosByDayLiveData = new MutableLiveData<>(); this.TodoByIdLiveData = new MutableLiveData<>(); this.errorLiveData = new MutableLiveData<>(); } //getter public MutableLiveData<HashMap<Integer, HashMap<Integer, HashMap<Integer, HashMap<Integer, Todo>>>>> getTodosLiveData() { return allTodosLiveData; } public MutableLiveData<String> getErrorLiveData() {return errorLiveData;} public void getAllTodos(String accountId,Integer bookId, String token) { Call<HashMap<Integer, HashMap<Integer, HashMap<Integer, HashMap<Integer, Todo>>>>> call = todosRest.getAllTodos(accountId, bookId, token); call.enqueue(new Callback<HashMap<Integer, HashMap<Integer, HashMap<Integer, HashMap<Integer, Todo>>>>>() { @Override public void onResponse(Call<HashMap<Integer, HashMap<Integer, HashMap<Integer, HashMap<Integer, Todo>>>>> call, Response<HashMap<Integer, HashMap<Integer, HashMap<Integer, HashMap<Integer, Todo>>>>> response) { if (response.isSuccessful()) { System.out.println("Success: getAllTodos"); allTodosLiveData.setValue(response.body()); } else { System.out.println("Error: getAllTodos" + response.code()); errorLiveData.setValue(parseStatusCode(response.code())); } } @Override public void onFailure(Call<HashMap<Integer, HashMap<Integer, HashMap<Integer, HashMap<Integer, Todo>>>>> call, Throwable t) { System.out.println("CommunicationError: getAllTodos" + t); errorLiveData.setValue(parseStatusCode(-1)); } }); } public void getTodosByMonth(String accountId,Integer bookId, Integer year, Integer month, String token) { Call<HashMap<Integer, HashMap<Integer, Todo>>> call = todosRest.getTodosByMonth(accountId, bookId, year, month, token); call.enqueue(new Callback<HashMap<Integer, HashMap<Integer, Todo>>>() { @Override public void onResponse(Call<HashMap<Integer, HashMap<Integer, Todo>>> call, Response<HashMap<Integer, HashMap<Integer, Todo>>> response) { if (response.isSuccessful()) { System.out.println("Success: getTodosByMonth"); TodosByMonthLiveData.setValue(response.body()); } else { System.out.println("Error: getTodosByMonth" + response.code()); } } @Override public void onFailure(Call<HashMap<Integer, HashMap<Integer, Todo>>> call, Throwable t) { System.out.println("CommunicationError: getTodosByMonth" + t); errorLiveData.setValue(parseStatusCode(-1)); } }); } public void getTodosByDay(String accountId,Integer bookId, Integer year, Integer month, Integer day, String token) { Call<HashMap<Integer, Todo>> call = todosRest.getTodosByDay(accountId, bookId, year, month, day, token); call.enqueue(new Callback<HashMap<Integer, Todo>>() { @Override public void onResponse(Call<HashMap<Integer, Todo>> call, Response<HashMap<Integer, Todo>> response) { if (response.isSuccessful()) { System.out.println("Success: getTodosByDay"); TodosByDayLiveData.setValue(response.body()); } else { System.out.println("Error: getTodosByDay" + response.code()); } } @Override public void onFailure(Call<HashMap<Integer, Todo>> call, Throwable t) { System.out.println("CommunicationError: getTodosByDay" + t); errorLiveData.setValue(parseStatusCode(-1)); } }); } public void getTodoById(String accountId,Integer bookId, Integer year, Integer month, Integer day, Integer todoId, String token) { Call<Todo> call = todosRest.getTodoById(accountId, bookId, year, month, day, todoId, token); call.enqueue(new Callback<Todo>() { @Override public void onResponse(Call<Todo> call, Response<Todo> response) { if (response.isSuccessful()) { System.out.println("Success: getTodoById"); TodoByIdLiveData.setValue(response.body()); } else { System.out.println("Error: getTodoById" + response.code()); } } @Override public void onFailure(Call<Todo> call, Throwable t) { System.out.println("CommunicationError: getTodoById" + t); errorLiveData.setValue(parseStatusCode(-1)); } }); } public void createTodo(String accountId,Integer bookId, Integer year, Integer month, Integer day, String title, String token) { Call<Todo> call = todosRest.createTodo(accountId, bookId, year, month, day, title, token); call.enqueue(new Callback<Todo>() { @Override public void onResponse(Call<Todo> call, Response<Todo> response) { if (response.isSuccessful()) { System.out.println("Success: createTodo"); } else { System.out.println("Error: createTodo" + response.code()); } } @Override public void onFailure(Call<Todo> call, Throwable t) { System.out.println("CommunicationError: createTodo" + t); errorLiveData.setValue(parseStatusCode(-1)); } }); } public void setCheck(String accountId, Integer BookId, Integer year, Integer month, Integer day, Integer todoId, boolean check, String token) { Call<Void> call = todosRest.setCheck(accountId, BookId, year, month, day, todoId, check, token); call.enqueue(new Callback<Void>() { @Override public void onResponse(Call<Void> call, Response<Void> response) { if (response.isSuccessful()) { System.out.println("Success: setCheck"); } else { System.out.println("Error: setCheck" + response.code()); } } @Override public void onFailure(Call<Void> call, Throwable t) { System.out.println("CommunicationError: setCheck" + t); errorLiveData.setValue(parseStatusCode(-1)); } }); } public void deleteTodo(String accountId, Integer BookId, Integer year, Integer month, Integer day, Integer todoId, String token) { Call<Void> call = todosRest.deleteTodoById(accountId, BookId, year, month, day, todoId, token); call.enqueue(new Callback<Void>() { @Override public void onResponse(Call<Void> call, Response<Void> response) { if (response.isSuccessful()) { System.out.println("Success: deleteTodo"); } else { System.out.println("Error: deleteTodo" + response.code()); } } @Override public void onFailure(Call<Void> call, Throwable t) { System.out.println("CommunicationError: deleteTodo" + t); errorLiveData.setValue(parseStatusCode(-1)); } }); } private String parseStatusCode(Integer stats) { switch (stats) { case 404: return "NotFound"; case 401: return "InvalidToken"; case 400: return "ResponseError"; case 500: return "ServerError"; default: return "UnknownError"; } } }