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> todoLiveData;
private final MutableLiveData<Boolean> successSetCheckLiveData;
private final MutableLiveData<Boolean> successDeleteTodoLiveData;
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.todoLiveData = new MutableLiveData<>();
this.successSetCheckLiveData = new MutableLiveData<>();
this.successDeleteTodoLiveData = new MutableLiveData<>();
this.errorLiveData = new MutableLiveData<>();
}
//LiveDatać®getter
public MutableLiveData<HashMap<Integer, HashMap<Integer, HashMap<Integer, HashMap<Integer, Todo>>>>> getAllTodosLiveData()
{
return allTodosLiveData;
}
public MutableLiveData<HashMap<Integer, HashMap<Integer, Todo>>> getTodosByMonthLiveData() {return todosByMonthLiveData;}
public MutableLiveData<HashMap<Integer, Todo>> getTodosByDayLiveData() {return todosByDayLiveData;}
public MutableLiveData<Todo> getTodoLiveData() {return todoLiveData;}
public MutableLiveData<Boolean> getSuccessSetCheckLiveData() {return successSetCheckLiveData;}
public MutableLiveData<Boolean> getSuccessDeleteTodoLiveData() {return successDeleteTodoLiveData;}
public MutableLiveData<String> getErrorLiveData() {return errorLiveData;}
public void loadAllTodos(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("NetworkError : getAllTodos" + t);
errorLiveData.setValue(parseStatusCode(-1));
}
});
}
public void loadTodosByMonth(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("NetworkError : getTodosByMonth" + t);
errorLiveData.setValue(parseStatusCode(-1));
}
});
}
public void loadTodosByDay(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("NetworkError : getTodosByDay" + t);
errorLiveData.setValue(parseStatusCode(-1));
}
});
}
public void loadTodoById(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");
todoLiveData.setValue(response.body());
} else {
System.out.println("Error: getTodoById" + response.code());
}
}
@Override
public void onFailure(Call<Todo> call, Throwable t) {
System.out.println("NetworkError : 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("NetworkError : 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");
successSetCheckLiveData.setValue(true);
} else {
System.out.println("Error: setCheck" + response.code());
}
}
@Override
public void onFailure(Call<Void> call, Throwable t) {
System.out.println("NetworkError : 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");
successDeleteTodoLiveData.setValue(true);
} else {
System.out.println("Error: deleteTodo" + response.code());
}
}
@Override
public void onFailure(Call<Void> call, Throwable t) {
System.out.println("NetworkError : 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";
}
}
}