/*******************************************************************************
 * Copyright 2011, 2012, 2013 fanfou.com, Xiaoke, Zhang
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *******************************************************************************/
/**
 * 
 */
package com.fanfou.app.opensource.service;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
import android.util.Log;
import android.widget.BaseAdapter;

import com.fanfou.app.opensource.AppContext;
import com.fanfou.app.opensource.api.bean.Status;
import com.fanfou.app.opensource.api.bean.User;
import com.fanfou.app.opensource.ui.ActionManager.ResultListener;
import com.fanfou.app.opensource.ui.UIManager.ActionResultHandler;
import com.fanfou.app.opensource.util.CommonHelper;
import com.fanfou.app.opensource.util.StringHelper;

/**
 * @author mcxiaoke
 * 
 */
public final class FanfouServiceManager {
    private static final String TAG = "FanfouServiceManager";

    public static void doDirectMessagesDelete(final Context context,
            final String id, final Handler handler) {
        final Intent intent = new Intent(context, FanFouService.class);
        intent.putExtra(Constants.EXTRA_TYPE,
                Constants.TYPE_DIRECT_MESSAGES_DESTROY);
        intent.putExtra(Constants.EXTRA_ID, id);
        intent.putExtra(Constants.EXTRA_MESSENGER, new Messenger(handler));
        context.startService(intent);
    }

    public static void doFavorite(final Activity activity, final Status status) {
        FanfouServiceManager.doFavorite(activity, status, null, false);
    }

    public static void doFavorite(final Activity activity, final Status s,
            final BaseAdapter adapter) {
        final ActionResultHandler li = new ActionResultHandler() {
            @Override
            public void onActionSuccess(final int type, final String message) {
                if (type == Constants.TYPE_FAVORITES_CREATE) {
                    s.favorited = true;
                } else {
                    s.favorited = false;
                }
                adapter.notifyDataSetChanged();
            }
        };
        FanfouServiceManager.doFavorite(activity, s, li);
    }

    public static void doFavorite(final Activity activity, final Status status,
            final boolean finish) {
        FanfouServiceManager.doFavorite(activity, status, null, finish);
    }

    public static void doFavorite(final Activity activity, final Status s,
            final Cursor c) {
        final ActionResultHandler li = new ActionResultHandler() {
            @Override
            public void onActionSuccess(final int type, final String message) {
                c.requery();
            }
        };
        FanfouServiceManager.doFavorite(activity, s, li);
    }

    public static void doFavorite(final Activity activity, final Status status,
            final ResultListener li) {
        FanfouServiceManager.doFavorite(activity, status, li, false);
    }

    public static void doFavorite(final Activity activity, final Status status,
            final ResultListener li, final boolean finish) {
        if ((status == null) || status.isNull()) {
            if (AppContext.DEBUG) {
                Log.d(FanfouServiceManager.TAG, "doFavorite: status is null.");
            }
            throw new NullPointerException("status cannot be null.");
        }
        final int type = status.favorited ? Constants.TYPE_FAVORITES_DESTROY
                : Constants.TYPE_FAVORITES_CREATE;

        final Handler handler = new Handler() {

            @Override
            public void handleMessage(final Message msg) {
                switch (msg.what) {
                case Constants.RESULT_SUCCESS:
                    final Status result = (Status) msg.getData().getParcelable(
                            Constants.EXTRA_DATA);
                    final String text = result.favorited ? "收藏成功" : "取消收藏成功";
                    CommonHelper.notify(activity.getApplicationContext(), text);
                    FanfouServiceManager.onSuccess(li, type, text);
                    if (finish) {
                        activity.finish();
                    }
                    break;
                case Constants.RESULT_ERROR:
                    final String errorMessage = msg.getData().getString(
                            Constants.EXTRA_ERROR);
                    CommonHelper.notify(activity.getApplicationContext(),
                            errorMessage);
                    FanfouServiceManager.onFailed(li, type, "收藏失败");
                    break;
                default:
                    break;
                }
            }
        };
        if (status.favorited) {
            FanfouServiceManager.doUnfavorite(activity, status.id, handler);
        } else {
            FanfouServiceManager.doFavorite(activity, status.id, handler);
        }
    }

    public static void doFavorite(final Context context, final String id,
            final Handler handler) {
        final Intent intent = new Intent(context, FanFouService.class);
        intent.putExtra(Constants.EXTRA_TYPE, Constants.TYPE_FAVORITES_CREATE);
        intent.putExtra(Constants.EXTRA_ID, id);
        intent.putExtra(Constants.EXTRA_MESSENGER, new Messenger(handler));
        context.startService(intent);
    }

    public static void doFetchDirectMessagesConversationList(
            final Context context, final Messenger messenger,
            final boolean doGetMore) {
        final Intent intent = new Intent(context, FanFouService.class);
        intent.putExtra(Constants.EXTRA_TYPE,
                Constants.TYPE_DIRECT_MESSAGES_CONVERSTATION_LIST);
        intent.putExtra(Constants.EXTRA_MESSENGER, messenger);
        intent.putExtra(Constants.EXTRA_BOOLEAN, doGetMore);
        context.startService(intent);
    }

    public static void doFetchDirectMessagesInbox(final Context context,
            final Messenger messenger, final boolean doGetMore) {
        final Intent intent = new Intent(context, FanFouService.class);
        intent.putExtra(Constants.EXTRA_TYPE,
                Constants.TYPE_DIRECT_MESSAGES_INBOX);
        intent.putExtra(Constants.EXTRA_MESSENGER, messenger);
        intent.putExtra(Constants.EXTRA_BOOLEAN, doGetMore);
        context.startService(intent);
    }

    public static void doFetchFavorites(final Context context,
            final Messenger messenger, final int page, final String userId) {
        FanfouServiceManager.doFetchTimeline(context,
                Constants.TYPE_FAVORITES_LIST, messenger, page, userId, null,
                null);
    }

    public static void doFetchFollowers(final Context context,
            final Handler handler, final int page, final String userId) {
        FanfouServiceManager.doFetchUsers(context,
                Constants.TYPE_USERS_FOLLOWERS, handler, page, userId);
    }

    public static void doFetchFriends(final Context context,
            final Handler handler, final int page, final String userId) {
        FanfouServiceManager.doFetchUsers(context,
                Constants.TYPE_USERS_FRIENDS, handler, page, userId);
    }

    public static void doFetchHomeTimeline(final Context context,
            final Messenger messenger, final String sinceId, final String maxId) {
        FanfouServiceManager.doFetchTimeline(context,
                Constants.TYPE_STATUSES_HOME_TIMELINE, messenger, 0, null,
                sinceId, maxId);
    }

    public static void doFetchMentions(final Context context,
            final Messenger messenger, final String sinceId, final String maxId) {
        FanfouServiceManager.doFetchTimeline(context,
                Constants.TYPE_STATUSES_MENTIONS, messenger, 0, null, sinceId,
                maxId);
    }

    public static void doFetchPublicTimeline(final Context context,
            final Messenger messenger) {
        FanfouServiceManager.doFetchTimeline(context,
                Constants.TYPE_STATUSES_PUBLIC_TIMELINE, messenger, 0, null,
                null, null);
    }

    private static void doFetchTimeline(final Context context, final int type,
            final Messenger messenger, final int page, final String userId,
            final String sinceId, final String maxId) {
        final Intent intent = new Intent(context, FanFouService.class);
        intent.putExtra(Constants.EXTRA_TYPE, type);
        intent.putExtra(Constants.EXTRA_MESSENGER, messenger);
        intent.putExtra(Constants.EXTRA_COUNT, Constants.MAX_TIMELINE_COUNT);
        intent.putExtra(Constants.EXTRA_PAGE, page);
        intent.putExtra(Constants.EXTRA_ID, userId);
        intent.putExtra(Constants.EXTRA_SINCE_ID, sinceId);
        intent.putExtra(Constants.EXTRA_MAX_ID, maxId);
        if (AppContext.DEBUG) {
            Log.d(FanfouServiceManager.TAG, "doFetchTimeline() type=" + type
                    + " page=" + page + " userId=" + userId);
        }
        context.startService(intent);
    }

    private static void doFetchUsers(final Context context, final int type,
            final Handler handler, final int page, final String userId) {
        final Intent intent = new Intent(context, FanFouService.class);
        intent.putExtra(Constants.EXTRA_TYPE, type);
        intent.putExtra(Constants.EXTRA_MESSENGER, new Messenger(handler));
        intent.putExtra(Constants.EXTRA_COUNT, Constants.MAX_USERS_COUNT);
        intent.putExtra(Constants.EXTRA_PAGE, page);
        intent.putExtra(Constants.EXTRA_ID, userId);
        context.startService(intent);
    }

    public static void doFetchUserTimeline(final Context context,
            final Messenger messenger, final String userId,
            final String sinceId, final String maxId) {
        FanfouServiceManager.doFetchTimeline(context,
                Constants.TYPE_STATUSES_USER_TIMELINE, messenger, 0, userId,
                sinceId, maxId);
    }

    public static void doFollow(final Context context, final String userId,
            final Handler handler) {
        final Intent intent = new Intent(context, FanFouService.class);
        intent.putExtra(Constants.EXTRA_TYPE, Constants.TYPE_FRIENDSHIPS_CREATE);
        intent.putExtra(Constants.EXTRA_ID, userId);
        intent.putExtra(Constants.EXTRA_MESSENGER, new Messenger(handler));
        context.startService(intent);

    }

    public static void doFollow(final Context context, final User user,
            final Handler handler) {
        if (user.following) {
            FanfouServiceManager.doUnFollow(context, user.id, handler);
        } else {
            FanfouServiceManager.doFollow(context, user.id, handler);
        }
    }

    public static void doFriendshipsExists(final Context context,
            final String userA, final String userB, final Handler handler) {
        final Intent intent = new Intent(context, FanFouService.class);
        intent.putExtra(Constants.EXTRA_TYPE, Constants.TYPE_FRIENDSHIPS_EXISTS);
        intent.putExtra("user_a", userA);
        intent.putExtra("user_b", userB);
        intent.putExtra(Constants.EXTRA_MESSENGER, new Messenger(handler));
        context.startService(intent);
    }

    public static void doMessageDelete(final Activity activity,
            final String id, final ResultListener li, final boolean finish) {
        if (StringHelper.isEmpty(id)) {
            if (AppContext.DEBUG) {
                Log.d(FanfouServiceManager.TAG,
                        "doMessageDelete: status id is null.");
            }
            throw new NullPointerException("directmessageid cannot be null.");
        }

        final Handler handler = new Handler() {

            @Override
            public void handleMessage(final Message msg) {
                switch (msg.what) {
                case Constants.RESULT_SUCCESS:
                    CommonHelper.notify(AppContext.getAppContext(), "删除成功");
                    FanfouServiceManager.onSuccess(li,
                            Constants.TYPE_DIRECT_MESSAGES_DESTROY, "删除成功");
                    if (finish && (activity != null)) {
                        activity.finish();
                    }
                    break;
                case Constants.RESULT_ERROR:
                    final String errorMessage = msg.getData().getString(
                            Constants.EXTRA_ERROR);
                    CommonHelper.notify(activity.getApplicationContext(),
                            errorMessage);
                    FanfouServiceManager.onFailed(li,
                            Constants.TYPE_DIRECT_MESSAGES_DESTROY, "删除失败");
                    break;
                default:
                    break;
                }
            }
        };
        FanfouServiceManager.doDirectMessagesDelete(activity, id, handler);
    }

    public static void doProfile(final Context context, final String userId,
            final Handler handler) {
        final Intent intent = new Intent(context, FanFouService.class);
        intent.putExtra(Constants.EXTRA_TYPE, Constants.TYPE_USERS_SHOW);
        intent.putExtra(Constants.EXTRA_ID, userId);
        intent.putExtra(Constants.EXTRA_MESSENGER, new Messenger(handler));
        context.startService(intent);
    }

    public static void doStatusDelete(final Activity activity, final String id) {
        FanfouServiceManager.doStatusDelete(activity, id, null);
    }

    public static void doStatusDelete(final Activity activity, final String id,
            final boolean finish) {
        FanfouServiceManager.doStatusDelete(activity, id, null, finish);
    }

    public static void doStatusDelete(final Activity activity, final String id,
            final ResultListener li) {
        FanfouServiceManager.doStatusDelete(activity, id, li, false);
    }

    public static void doStatusDelete(final Activity activity, final String id,
            final ResultListener li, final boolean finish) {
        if (StringHelper.isEmpty(id)) {
            if (AppContext.DEBUG) {
                Log.d(FanfouServiceManager.TAG,
                        "doStatusDelete: status id is null.");
            }
            throw new NullPointerException("statusid cannot be null.");
        }
        final Handler handler = new Handler() {

            @Override
            public void handleMessage(final Message msg) {
                switch (msg.what) {
                case Constants.RESULT_SUCCESS:
                    CommonHelper.notify(AppContext.getAppContext(), "删除成功");
                    FanfouServiceManager.onSuccess(li,
                            Constants.TYPE_STATUSES_DESTROY, "删除成功");
                    if (finish && (activity != null)) {
                        activity.finish();
                    }
                    break;
                case Constants.RESULT_ERROR:
                    final String errorMessage = msg.getData().getString(
                            Constants.EXTRA_ERROR);
                    CommonHelper.notify(activity.getApplicationContext(),
                            errorMessage);
                    FanfouServiceManager.onFailed(li,
                            Constants.TYPE_STATUSES_DESTROY, "删除失败");
                    break;
                default:
                    break;
                }
            }
        };
        FanfouServiceManager.doStatusesDelete(activity, id, handler);
    }

    public static void doStatusesDelete(final Context context, final String id,
            final Handler handler) {
        final Intent intent = new Intent(context, FanFouService.class);
        intent.putExtra(Constants.EXTRA_TYPE, Constants.TYPE_STATUSES_DESTROY);
        intent.putExtra(Constants.EXTRA_ID, id);
        intent.putExtra(Constants.EXTRA_MESSENGER, new Messenger(handler));
        context.startService(intent);
    }

    public static void doUnfavorite(final Context context, final String id,
            final Handler handler) {
        final Intent intent = new Intent(context, FanFouService.class);
        intent.putExtra(Constants.EXTRA_TYPE, Constants.TYPE_FAVORITES_DESTROY);
        intent.putExtra(Constants.EXTRA_ID, id);
        intent.putExtra(Constants.EXTRA_MESSENGER, new Messenger(handler));
        context.startService(intent);
    }

    public static void doUnFollow(final Context context, final String userId,
            final Handler handler) {
        final Intent intent = new Intent(context, FanFouService.class);
        intent.putExtra(Constants.EXTRA_TYPE,
                Constants.TYPE_FRIENDSHIPS_DESTROY);
        intent.putExtra(Constants.EXTRA_ID, userId);
        intent.putExtra(Constants.EXTRA_MESSENGER, new Messenger(handler));
        context.startService(intent);

    }

    private static void onFailed(final ResultListener li, final int type,
            final String message) {
        if (li != null) {
            li.onActionFailed(type, message);
        }
    }

    private static void onSuccess(final ResultListener li, final int type,
            final String message) {
        if (li != null) {
            li.onActionSuccess(type, message);
        }
    }
}