package com.example.lovetalk.service;

import android.content.Context;

import com.avos.avoscloud.AVException;
import com.avos.avoscloud.AVObject;
import com.avos.avoscloud.AVQuery;
import com.avos.avoscloud.AVUser;
import com.avos.avoscloud.SaveCallback;
import com.example.lovetalk.DemoApplication;
import com.example.lovetalk.R;
import com.example.lovetalk.util.MyAsyncTask;
import com.example.lovetalk.util.Utils;

import java.util.List;

/**
 * Created by lzw on 14-9-27.
 */
public class AddRequestService {
	public static int countAddRequests() throws AVException {
		AVQuery<AddRequest> q = AVObject.getQuery(AddRequest.class);
		q.setCachePolicy(AVQuery.CachePolicy.NETWORK_ELSE_CACHE);
		q.whereEqualTo(AddRequest.TO_USER, AVUser.getCurrentUser());
		try {
			return q.count();
		} catch (AVException e) {
			if (e.getCode() == AVException.CACHE_MISS) {
				return 0;
			} else {
				throw e;
			}
		}
	}

	public static List<AddRequest> findAddRequests() throws AVException {
		AVUser user = AVUser.getCurrentUser();
		AVQuery<AddRequest> q = AVObject.getQuery(AddRequest.class);
		q.include(AddRequest.FROM_USER);
		q.whereEqualTo(AddRequest.TO_USER, user);
		q.orderByDescending("createdAt");
		q.setCachePolicy(AVQuery.CachePolicy.NETWORK_ELSE_CACHE);
		return q.find();
	}

	public static boolean hasAddRequest() throws AVException {
		PreferenceMap preferenceMap = PreferenceMap.getMyPrefDao(DemoApplication.context);
		int addRequestN = preferenceMap.getAddRequestN();
		int requestN = countAddRequests();
		if (requestN > addRequestN) {
			return true;
		} else {
			return false;
		}
	}

	public static void agreeAddRequest(final AddRequest addRequest, final SaveCallback saveCallback) {
		UserService.addFriend(addRequest.getFromUser().getObjectId(), new SaveCallback() {
			@Override
			public void done(AVException e) {
				if (e != null) {
					if (e.getCode() == AVException.DUPLICATE_VALUE) {
						addRequest.setStatus(AddRequest.STATUS_DONE);
						addRequest.saveInBackground(saveCallback);
					} else {
						saveCallback.done(e);
					}
				} else {
					addRequest.setStatus(AddRequest.STATUS_DONE);
					addRequest.saveInBackground(saveCallback);
				}
			}
		});
	}

	public static void createAddRequest(AVUser toUser) throws Exception {
		AVUser curUser = AVUser.getCurrentUser();
		AVQuery<AddRequest> q = AVObject.getQuery(AddRequest.class);
		q.whereEqualTo(AddRequest.FROM_USER, curUser);
		q.whereEqualTo(AddRequest.TO_USER, toUser);
		q.whereEqualTo(AddRequest.STATUS, AddRequest.STATUS_WAIT);
		int count = 0;
		try {
			count = q.count();
		} catch (AVException e) {
			e.printStackTrace();
			if (e.getCode() == AVException.OBJECT_NOT_FOUND) {
				count = 0;
			} else {
				throw e;
			}
		}
		if (count > 0) {
			throw new Exception(DemoApplication.context.getString(R.string.contact_alreadyCreateAddRequest));
		} else {
			AddRequest add = new AddRequest();
			add.setFromUser(curUser);
			add.setToUser(toUser);
			add.setStatus(AddRequest.STATUS_WAIT);
			add.save();
		}
	}

	public static void createAddRequestInBackground(Context ctx, final AVUser user) {
		new MyAsyncTask(ctx) {
			@Override
			protected void doInBack() throws Exception {
				AddRequestService.createAddRequest(user);
			}

			@Override
			protected void onSucceed() {
				Utils.toast(R.string.contact_sendRequestSucceed);
			}
		}.execute();
	}
}