package com.gh.common.util;

import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.text.TextUtils;
import android.util.TypedValue;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;

import androidx.core.content.ContextCompat;

import com.gh.gamecenter.common.utils.ExtensionsKt;
import com.gh.gamecenter.core.AppExecutor;
import com.gh.gamecenter.common.view.DrawableView;
import com.gh.gamecenter.R;
import com.gh.gamecenter.core.utils.DisplayUtils;
import com.gh.gamecenter.feature.entity.TagStyleEntity;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;

/**
 * 设置列表中game item视图上的工具类
 */
public class GameViewUtils {

    public static void setLabelList(Context context, LinearLayout labelLayout, List<TagStyleEntity> tagStyle) {
        setLabelList(context, labelLayout, tagStyle, 8);
    }

    public static void setLabelList(Context context, LinearLayout labelLayout, List<TagStyleEntity> tagEntityList, int margin) {
        int childTvCount = labelLayout.getChildCount();

        for (int k = 0; k < childTvCount; k++) {
            labelLayout.getChildAt(k).setVisibility(View.GONE);
        }

        if (tagEntityList == null || tagEntityList.isEmpty()) {
            return;
        }

        for (int i = 0, size = tagEntityList.size(); i < size; i++) {
            TextView tagTv;
            TagStyleEntity tagEntity = tagEntityList.get(i);
            int marginRight = i == size - 1 ? 0 : DisplayUtils.dip2px(context, margin);

            if (i < childTvCount) {
                tagTv = (TextView) labelLayout.getChildAt(i);
                updateTagStyle(context, tagTv, tagEntity, marginRight);
            } else {
                AppExecutor.getLightWeightIoExecutor().execute(() -> {
                    TextView tv = getNewGameTagView(context, tagEntity, marginRight);
                    AppExecutor.getUiExecutor().execute(() -> {
                        // 快速刷新列表会出现重复标签被添加到布局中的问题，这里在实际执行代码前再检查一次数量
                        if (labelLayout.getChildCount() >= tagEntityList.size()) return;

                        labelLayout.addView(tv);
                    });
                });
            }

            if (i >= 2) {
                break;
            }
        }
    }

    // 新的游戏标签样式 version>=4.0.0
    private static TextView getNewGameTagView(Context context, TagStyleEntity tagEntity, int rightMargin) {
        // 参数不全,用旧样式实现
        if (TextUtils.isEmpty(tagEntity.getBackground())) {
            return getGameTagView(context, tagEntity.getName(), rightMargin, "type", tagEntity);
        }

        TextView tag = new TextView(context);
        updateTagStyle(context, tag, tagEntity, rightMargin);
        return tag;
    }

    private static void updateTagStyle(Context context, TextView textView, TagStyleEntity tagEntity, int rightMargin) {
        textView.setVisibility(View.VISIBLE);

        // 同样的内容不用再更新
        if (textView.getText() == tagEntity.getName()) return;

        LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        lparams.rightMargin = rightMargin;
        textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10);
        textView.setSingleLine(true);
        textView.setText(tagEntity.getName());
        textView.setLayoutParams(lparams);
        textView.setPadding(
                DisplayUtils.dip2px(context, 4),
                0,
                DisplayUtils.dip2px(context, 4),
                DisplayUtils.dip2px(context, 1));

        textView.setTextColor(ExtensionsKt.hexStringToIntColor("#" + tagEntity.getColor(), Color.WHITE));
        textView.setBackground(DrawableView.getServerDrawable(ExtensionsKt.hexStringToIntColor("#" + tagEntity.getBackground(), Color.WHITE)));
    }

    private static TextView getGameTagView(Context context, String tagStr, int rightMargin, String tagType, TagStyleEntity tagEntity) {
        LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        lparams.rightMargin = rightMargin;
        TextView tag = new TextView(context);
        tag.setTextSize(TypedValue.COMPLEX_UNIT_SP, 9);
        tag.setSingleLine(true);
        tag.setText(tagStr);
        if ("官方版".equals(tagStr) || "已关注".equals(tagStr)) {
            tag.setBackgroundResource(R.drawable.border_green_bg);
            tag.setTextColor(ContextCompat.getColor(context, R.color.tag_green));
        } else {
            String colorStr;

            if (!TextUtils.isEmpty(tagType) && "type".equals(tagType) && tagEntity != null) { // 游戏标签
                colorStr = "#" + tagEntity.getColor();
                GradientDrawable gradientDrawable = new GradientDrawable();

                if ("border".equals(tagEntity.getStyle())) {
                    gradientDrawable.setColor(Color.TRANSPARENT);
                    gradientDrawable.setStroke(DisplayUtils.dip2px(context, 1f), ExtensionsKt.hexStringToIntColor(colorStr, Color.WHITE));
                    tag.setTextColor(ExtensionsKt.hexStringToIntColor(colorStr, Color.WHITE));
                } else {
                    gradientDrawable.setColor(ExtensionsKt.hexStringToIntColor(colorStr, Color.WHITE));
                    gradientDrawable.setShape(GradientDrawable.RECTANGLE);
                    tag.setTextColor(Color.WHITE);
                }
                gradientDrawable.setCornerRadius(DisplayUtils.dip2px(3F));
                tag.setBackgroundDrawable(gradientDrawable);
            } else {
                colorStr = TagUtils.getInstance(context).getColor(tagStr);
                if (colorStr == null) {
                    return null;
                }
                int color = ExtensionsKt.hexStringToIntColor(colorStr, Color.WHITE);
                GradientDrawable gradientDrawable = new GradientDrawable();
                gradientDrawable.setColor(Color.TRANSPARENT);
                gradientDrawable.setStroke(DisplayUtils.dip2px(context, 1f), color);
                gradientDrawable.setCornerRadius(DisplayUtils.dip2px(3F));
                tag.setBackgroundDrawable(gradientDrawable);
                tag.setTextColor(color);
            }
        }
        tag.setLayoutParams(lparams);
        tag.setPadding(DisplayUtils.dip2px(context, 4),
                0,
                DisplayUtils.dip2px(context, 4),
                DisplayUtils.dip2px(context, 1));
        return tag;
    }

    public static String getGameTestDate(long testTime) {

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA);
        format.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));

        String testDate;
        try {
            long today = format.parse(format.format(new Date())).getTime();
            long day = Long.parseLong(testTime + "000");
            SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm", Locale.CHINA);
            String time = timeFormat.format(day);

            if (day >= today && day < today + 86400 * 1000) {
                testDate = "今天 " + time;
            } else if (day >= today + 86400 * 1000
                    && day < today + 86400 * 1000 * 2) {
                testDate = "明天 " + time;
            } else if (day >= today + 86400 * 1000 * 2
                    && day < today + 86400 * 1000 * 3) {
                testDate = "后天 " + time;
            } else if (day >= today - 86400 * 1000 && day < today) {
                testDate = "昨天 " + time;
            } else {
                testDate = new SimpleDateFormat("MM-dd HH:mm", Locale.CHINA).format(day);
            }
            return testDate;
        } catch (ParseException e) {
            e.printStackTrace();
            long day = Long.parseLong(testTime + "000");
            Calendar calendar = Calendar.getInstance(TimeZone
                    .getTimeZone("Asia/Shanghai"));
            calendar.setTimeInMillis(day);
            int hour = calendar.get(Calendar.HOUR_OF_DAY);
            format = new SimpleDateFormat("MM-dd", Locale.CHINA);
            testDate = format.format(day) + " " + hour + "点";
            return testDate;
        }

    }

}
