package studio.uphie.one.ui.home;

import android.graphics.drawable.Animatable;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.controller.BaseControllerListener;
import com.facebook.drawee.controller.ControllerListener;
import com.facebook.drawee.interfaces.DraweeController;
import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.imagepipeline.image.ImageInfo;
import com.facebook.imagepipeline.image.QualityInfo;
import com.loopj.android.http.RequestParams;

import io.paperdb.Paper;
import studio.uphie.one.R;
import studio.uphie.one.abs.AbsBaseFragment;
import studio.uphie.one.common.Api;
import studio.uphie.one.common.Constants;
import studio.uphie.one.common.HttpData;
import studio.uphie.one.common.HttpError;
import studio.uphie.one.ui.article.Article;
import studio.uphie.one.ui.article.ArticleFragment;
import studio.uphie.one.utils.JsonUtil;
import studio.uphie.one.utils.TextToast;
import studio.uphie.one.utils.TimeUtil;
import studio.uphie.one.widgets.LikeView;

import org.json.JSONException;
import org.json.JSONObject;

import butterknife.Bind;
import butterknife.ButterKnife;

/**
 * Created by Uphie on 2015/9/6.
 * Email: [email protected]
 */
public class HomeContentFragment extends AbsBaseFragment implements LikeView.OnLikeChangedListener {

    @Bind(R.id.saying_title)
    TextView sayingTitle;
    @Bind(R.id.text_illustration_author)
    TextView textIllustrationAuthor;
    @Bind(R.id.text_day)
    TextView textDay;
    @Bind(R.id.text_month)
    TextView textMonth;
    @Bind(R.id.text_saying)
    TextView textSaying;
    @Bind(R.id.home_content)
    LinearLayout homeContent;
    @Bind(R.id.liv_saying)
    LikeView lvSaying;
    @Bind(R.id.dv_illustrator)
    SimpleDraweeView dvIllustrator;

    private Home curSaying;

    @Override
    public int getLayoutId() {
        return R.layout.layout_home;
    }

    @Override
    public void init() {

        lvSaying.addOnLikeChangeListener(this);

        Bundle bundle = getArguments();
        String date = bundle.getString(Constants.KEY_DATE);
        index = bundle.getInt(Constants.KEY_INDEX);

        curDate = TimeUtil.getPreviousDate(date, index);

        RequestParams params = new RequestParams();
        params.put("strDate", date);
        params.put("strRow", index);
        getHttpData(Api.URL_HOME, params, new HttpData("result", "hpEntity"));
    }

    @Override
    public void onDataOk(String url, String data) {
        switch (url) {
            case Api.URL_HOME:
                Home home = JsonUtil.getEntity(data, Home.class);
                refreshUI(home);
                if (home != null) {
                    Paper.book().write(Constants.TAG_HOME + curDate, home);
                }
                HomeFragment.getInstance().pager.onRefreshComplete();
                break;
            case Api.URL_LIKE_OR_CANCLELIKE:
                try {
                    JSONObject jsonObject = new JSONObject(data);
                    int likeCount = jsonObject.optInt("strPraisednumber");
                    //若实际的喜欢数量与LikeView自增的结果值不同,显示实际的数量
                    if (likeCount != lvSaying.getLikeCount()) {
                        lvSaying.setText(likeCount + "");
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                break;
        }
    }

    @Override
    public void onDataError(String url, HttpError error) {
        switch (url) {
            case Api.URL_HOME:
                HomeFragment.getInstance().pager.onRefreshComplete();
                //没有数据,删除并销毁自己
                finish();
                break;
        }
    }

    @Override
    public void onRestoreData(String url) {
        if (url.equals(Api.URL_HOME)) {
            Home home = Paper.book().read(Constants.TAG_HOME + curDate, null);
            refreshUI(home);
            HomeFragment.getInstance().pager.onRefreshComplete();
        }
    }

    @Override
    public void onLikeChanged() {
        RequestParams requestParams = new RequestParams();
        requestParams.put("strPraiseItemId", curSaying.strHpId);
        requestParams.put("strDeviceId", "");
        requestParams.put("strAppName", "ONE");
        requestParams.put("strPraiseItem", "HP");
        getHttpData(Api.URL_LIKE_OR_CANCLELIKE, requestParams, new HttpData("result", "entPraise"));
    }

    public Home getContentData() {
        return curSaying;
    }

    @Override
    public void refreshUI(Object data) {
        Home home = (Home) data;
        if (home == null) {
            if (!isFirstPage()) {
                //如果不是第一个,销毁之
                finish();
            }
            return;
        }
        if (isExpired()) {
            finish();
        }
        curSaying = home;

        homeContent.setVisibility(View.VISIBLE);

        //标题,如 VOL.1997
        sayingTitle.setText(home.strHpTitle);
        //照片名称及作者简介
        textIllustrationAuthor.setText(home.strAuthor.replace("&", "\n"));
        //日
        textDay.setText(TimeUtil.getDay(home.strMarketTime));
        //月、年
        textMonth.setText(TimeUtil.getMonthAndYear(home.strMarketTime));
        //内容
        textSaying.setText(home.strContent);
        //喜欢的数量
        lvSaying.setText(home.strPn);
        //插画

        ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() {
            @Override
            public void onFailure(String id, Throwable throwable) {
                super.onFailure(id, throwable);
                TextToast.shortShow("加载失败:" + throwable.toString());
            }

            @Override
            public void onIntermediateImageSet(String id, ImageInfo imageInfo) {
                super.onIntermediateImageSet(id, imageInfo);
            }

            @Override
            public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) {
                super.onFinalImageSet(id, imageInfo, animatable);
                if (imageInfo == null) {
                    return;
                }
                float rate = (float) imageInfo.getWidth() / (float) imageInfo.getHeight();
                dvIllustrator.setAspectRatio(rate);
            }
        };
        DraweeController controller = Fresco.newDraweeControllerBuilder()
                .setUri(Uri.parse(home.strThumbnailUrl))
                .setControllerListener(controllerListener)
                .build();
        dvIllustrator.setController(controller);
    }

    @Override
    public void finish() {
        HomeFragment.adapter.removeFromAdapter(this);
    }

    public static HomeContentFragment newInstance(int index) {
        Bundle bundle = new Bundle();
        bundle.putString(Constants.KEY_DATE, TimeUtil.getDate());
        bundle.putInt(Constants.KEY_INDEX, index);
        HomeContentFragment fragment = new HomeContentFragment();
        fragment.setArguments(bundle);

        return fragment;
    }
}