package com.heybuluo.overseastribe.common.api.request;

import android.widget.LinearLayout;

import com.heybuluo.overseastribe.common.api.discovery.PostBean;
import com.heybuluo.overseastribe.common.api.life.ChooseCountryBean;
import com.heybuluo.overseastribe.common.api.discovery.CountryBean;
import com.heybuluo.overseastribe.common.api.life.LifeBean;
import com.heybuluo.overseastribe.common.api.life.LifeDetailBean;
import com.heybuluo.overseastribe.common.api.life.TakePartPerson;
import com.heybuluo.overseastribe.common.api.message.EaseUserTotal;
import com.heybuluo.overseastribe.common.api.message.SearchUserBean;
import com.heybuluo.overseastribe.common.api.message.UserFansBean;
import com.heybuluo.overseastribe.common.api.mine.UserBeanRepc;
import com.heybuluo.overseastribe.common.api.mine.RegisterResponse;
import com.heybuluo.overseastribe.common.api.nearby.NearbyListPerson;
import com.heybuluo.overseastribe.common.api.nearby.NearbyPerson;
import com.heybuluo.overseastribe.common.api.message.CommentBean;

import java.util.List;
import java.util.Map;

import io.reactivex.Observable;
import okhttp3.MultipartBody;
import retrofit2.http.Field;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;

/**
 * Created by funnyzhao on 2017/8/23.
 */

public interface ApiService {
     String BASEURL="http://www.l-zh.com/";
    String BASEURLPIC="http://www.l-zh.com";
    /**
     * 判断邮箱是否存在
     * @param email
     * @return
     */
    @FormUrlEncoded
    @POST("api.php?m=member&a=email")
    Observable<HttpResult<String>> tocheckEmial(@Field("email") String email);


    /**
     * 用户注册
     * @param mapBody
     * @return
     */
    @FormUrlEncoded
    @POST("api.php?m=member&a=register")
    Observable<HttpResult<RegisterResponse>> toRegister(@FieldMap Map<String,String> mapBody);

    /**
     * 上传单张图片
     * @param file
     * @return
     */
    @Multipart
    @POST("api.php?m=Upload&a=upload")
    Observable<HttpResult> toUploadSingle(@Part MultipartBody.Part file);

    /**
     * 用户登录
     * @param mapBody
     * @return 因为登录时返回三种情况,data数据可能是对象,也可能是数组,所以使用Object统一代替,在响应成功后做判断处理
     */
    @FormUrlEncoded
    @POST("api.php?m=member&a=login")
    Observable<HttpResult> tologin(@FieldMap Map<String,String> mapBody);

    /**
     * 获取用户信息
     * @param userid  用户id
     * @return 个人信息
     */
    @FormUrlEncoded
    @POST("api.php?m=member&a=getUserInfo")
    Observable<HttpResult<UserBeanRepc>> getUserInfoById(@Field("userid") String userid);

    ///////////////////////////////////////////退出登录/////////////////////////////////////////

    /**
     * 用户下线
     * @param userid 用户id
     * @param type  0(默认)在线,1隐身,2下线
     * @return
     */
    @FormUrlEncoded
    @POST("api.php?m=member&a=userStatus")
    Observable<HttpResult<String>> loginoutUser(@Field("userid") String userid,@Field("type") String type);

    ///////////////////////////////////////////忘记密码/////////////////////////////////////////

    /**
     * 发送验证码、不知道返回值类型,接口待定中
    */


    /**
     * 上传多图
     */
    @Multipart
    @POST("api.php?m=Upload&a=upload")
    Observable<PhotoResult> uploadMemberIcon(@Part List<MultipartBody.Part> parts);

    /**
     * 更新用户信息
     * @param mapBody
     * @return
     */
    @FormUrlEncoded
    @POST("api.php?m=member&a=update")
    Observable<HttpResult<Integer>> updateUserInfo(@FieldMap Map<String,String> mapBody);


    /**
     * 获取他人用户信息
     * @param userid  用户id
     * @return 他人个人信息与自己的关系等
     */
    @FormUrlEncoded
    @POST("api.php?m=member&a=getUserInfo")
    Observable<HttpResult<UserBeanRepc>> getOtherUserInfo(@Field("userid") String userid, @Field("userbyid") String userbyid);

    /**
     * 获取国家是否开放
     * @param country_id
     * @return
     */
    @FormUrlEncoded
    @POST("api.php?m=Country&a=getList")
    Observable<HttpResult<List<ChooseCountryBean>>> getCountryIsOpen(@Field("country_id") String country_id);


    /**
     * (获取开放国家列表)
     */
    @POST("api.php?m=Country&a=getList")
    Observable<HttpResult<List<ChooseCountryBean>>> getOpenCountryList();


    ///////////////////////////////////////////////////////////////////////////////////////////
     // 发现模块API

    /**
     * 获取国家信息列表
     * 模块:发现-->国家
     * @param pageNum
     * @param pageSize
     * @param uid 当前用户id  可获取用户与国家频道的关系
     * @return
     */
    @FormUrlEncoded
    @POST("api.php?m=tieba&a=getList")
    Observable<HttpResult<List<CountryBean>>> getcountryInfoList(@Field("pageNum") String pageNum,@Field("pageSize") String pageSize,
                                                           @Field("uid") String uid);


    /**
     * 获取最新帖子列表
     * 模块:发现-->最新
     * @param pageNum  页码(默认1)
     * @param pageSize 单页数据量(默认5)
     * @return
     */
    @FormUrlEncoded
    @POST("api.php?m=tieba&a=tieziLastList")
    Observable<HttpResult<List<PostBean>>> getNewPostList(@Field("uid") String uid,@Field("pageNum") String pageNum, @Field("pageSize") String pageSize);

    /**
     * 获取当前用户关注的人发布的帖子
     * @param userid
     * @param pageNum 默认为1   加载更多时pageNum++
     * @param pageSize 默认为10
     * @return
     */
    @FormUrlEncoded
    @POST("api.php?m=tieba&a=getFollowBar")
    Observable<HttpResult<List<PostBean>>> getMyAttentionPosts(@Field("userid") String userid,@Field("pageNum") String pageNum,
                                                           @Field("pageSize") String pageSize);

    /**
     * 关注频道
     * @param tieba_id
     * @param userid
     * @return
     */
    @FormUrlEncoded
    @POST("api.php?m=Tieba&a=followTieba")
    Observable<HttpResult<String>> followTieba(@Field("tieba_id") String tieba_id,@Field("userid") String userid);

    /**
     * 取消关注频道
     * @param tieba_id
     * @param userid
     * @return
     */
    @FormUrlEncoded
    @POST("api.php?m=Tieba&a=cancleTieba")
    Observable<HttpResult<String>> cancleTieba(@Field("tieba_id") String tieba_id,@Field("userid") String userid);

    /**
     * 获取帖子列表 可获取全部或者最热  zuire不为空,约定传入"zuire"
     * @return
     */
    @FormUrlEncoded
    @POST("api.php?m=tieba&a=getTieZi")
    Observable<HttpResult<List<PostBean>>> getPostsList(@Field("userid") String userid,
                                                        @Field("pageNum") String pageNum,
                                                        @Field("tieba_id") String tieba_id,
                                                        @Field("zuire") String zuire,
                                                        @Field("pageSize") String pageSize);

    ///////////////////////////////////////////////////////////////////////////////////////////
    /**
     * 附近 模块 api
     */

    //附近的人 改变在线状态
    @Multipart
    @POST("api.php?m=member&a=userStatus")
    Observable<HttpResult<String>> setOnlineState(@Part("userid") String userid,
                                                  @Part("type") String type);
    //附近的人 获取周边的人
    @FormUrlEncoded
    @POST("api.php?m=member&a=neighborPic")
    Observable<HttpResult<List<NearbyPerson>>> getNearbyPersonList(@Field("userid") String userid,
                                                                   @Field("longitude") String longitude,
                                                                   @Field("latitude") String latitude,
                                                                   @Field("sex") String sex);

    //附近的人的列表显示
    @FormUrlEncoded
    @POST("api.php?m=member&a=getNeighbor")
    Observable<HttpResult<List<NearbyListPerson>>> getNearbyListPersonList(@Field("userid") String userid,
                                                                           @Field("pageSize") String pageSize,
                                                                           @Field("pageNum") String pageNum,
                                                                           @Field("longitude") String longitude,
                                                                           @Field("latitude") String latitude,
                                                                           @Field("sex") String sex);

    //////////////////////////////////////////////////////////////////////////////////////////
    /**
     * 生活(活动) 模块 api
     */

    //活动首页数据列表,参数二是搜索框使用,首页一开始不需要传参数二
    @FormUrlEncoded
    @POST("api.php?m=activity&a=getList")
    Observable<HttpResult<List<LifeBean>>> getLifeList(@Field("country_id") String countryId,
                                                       @Field("name") String editContent);

    //活动详情页
    @FormUrlEncoded
    @POST("api.php?m=activity&a=getDetail")
    Observable<HttpResult<LifeDetailBean>> getLifeDetailData(@Field("uid") String uid,
                                                             @Field("id") String id);
    //报名活动
    @FormUrlEncoded
    @POST("api.php?m=activity&a=enrollActivity")
    Observable<HttpResult<String>> takePartInTheParty(@Field("activity_id") String partyId,
                                                      @Field("userid") String userId);
    //取消报名
    @FormUrlEncoded
    @POST("api.php?m=activity&a=cancleActivity")
    Observable<HttpResult<String>> cancelPartInTheParty(@Field("activity_id") String partyId,
                                                        @Field("userid") String userId);

    //点赞
    @FormUrlEncoded
    @POST("api.php?m=activity&a=likeActivity")
    Observable<HttpResult<String>> thumbUpForTheParty(@Field("activity_id") String partyId,
                                                      @Field("userid") String userId);

    //参与的人
    @FormUrlEncoded
    @POST("api.php?m=activity&a=getActivityUser")
    Observable<HttpResult<List<TakePartPerson>>> getPartyPersonList(@Field("aid") String partyId,
                                                                    @Field("uid") String userId,
                                                                    @Field("sex") String sex,
                                                                    @Field("pageNum") String pageNum,
                                                                    @Field("pageSize") String pageSize);

    //活动详情 评论
    @FormUrlEncoded
    @POST("api.php/review/add")
    Observable<HttpResult> addActivityOrInvitationComment(@Field("uid") String userId,
                                              @Field("by_uid") String otherId,
                                              @Field("type") String type,
                                              @Field("pid") String pid,
                                              @Field("fid") String fid,
                                              @Field("content") String content);


    //发布活动
    @FormUrlEncoded
    @POST("api.php?m=activity&a=add")
    Observable<HttpResult<String>> releaseActivity(@Field("userid") String userId,
                                                         @Field("country_id") String countryId,
                                                         @Field("name") String name,
                                                         @Field("address") String address,
                                                         @Field("start_time") String startTime,
                                                         @Field("end_time") String endTime,
                                                         @Field("fee") String fee,
                                                         @Field("num") String num,
                                                         @Field("sponsor") String sponsor,
                                                         @Field("desc") String content,
                                                         @Field("index_pics") String coverImg,
                                                         @Field("detail_pics") String detailPics);

    //////////////////////////////////////////////////////////////////////////////////////////
    /**
     * 消息模块
     */
    //通过环信id,获得用户信息
    @FormUrlEncoded
    @POST("api.php?m=member&a=getUserInfoByEasemobUsername")
    Observable<HttpResult<EaseUserTotal>> getUserInfoByEaseUserId(@Field("easemob_username") String easeUserId);

    //模糊搜索,获得查找用户结果
    @FormUrlEncoded
    @POST("api.php?m=member&a=serachEmail")
    Observable<HttpResult<List<SearchUserBean>>> getSearchUserList(@Field("value") String value);



    /*****************************************关注用户相关接口*******************************************/
    //添加对某个用户的关注
    @FormUrlEncoded
    @POST("api.php?m=relation&a=add")
    Observable<HttpResult<Object[]>> addConcern(@Field("userid") String userId,
                                              @Field("user_byid") String otherId);

    //取消对某个用户的关注
    @FormUrlEncoded
    @POST("api.php?m=relation&a=cancle")
    Observable<HttpResult<Object[]>> cancelConcern(@Field("userid") String userId,
                                                 @Field("user_byid") String otherId);

    /*************************************************************************************************/


    //获得当前用户的粉丝关注提醒列表,传入的参数是 当前用户的id
    @FormUrlEncoded
    @POST("api.php?m=relation&a=fensi")
    Observable<HttpResult<List<UserFansBean>>> getUserFansRemindList(@Field("user_byid") String userId);

    //清空 关注提醒列表
    @FormUrlEncoded
    @POST("api.php?m=community&a=clearList")
    Observable<HttpResult<String>> clearUserFansRemindList(@Field("userid") String userId);

    //我的评论列表
    @FormUrlEncoded
    @POST("api.php?m=activity&a=activityList")
    Observable<HttpResult<List<CommentBean>>> getMyCommentList(@Field("userid") String userId);

    //清理评论列表
    @FormUrlEncoded
    @POST("api.php?m=activity&a=clearList")
    Observable<HttpResult<String>> clearCommentList(@Field("userid") String userId);

    ////////////////////////////////////////////////////////////////////////////////////////////
}