package cm.aptoide.pt.store.view;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.os.Build;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.ColorRes;
import cm.aptoide.pt.R;
import cm.aptoide.pt.themes.ThemeManager;

public class BadgeDialogFactory {
  public static final float MEDAL_SCALE = 1.25f;
  private final Context context;
  private final ThemeManager themeManager;
  private int normalMedalSize;
  private int selectedMedalSize;

  public BadgeDialogFactory(Context context, ThemeManager themeManager) {
    this.context = context;
    this.themeManager = themeManager;
  }

  public Dialog create(GridStoreMetaWidget.HomeMeta.Badge badge, boolean storeOwner) {
    View view = LayoutInflater.from(new ContextThemeWrapper(context,
        themeManager.getAttributeForTheme(R.attr.dialogsTheme).resourceId))
        .inflate(R.layout.store_badge_dialog, null);
    ImageView bronzeMedal = ((ImageView) view.findViewById(R.id.bronze_medal));
    normalMedalSize = bronzeMedal.getLayoutParams().width;
    selectedMedalSize = (int) (normalMedalSize * MEDAL_SCALE);
    Resources resources = view.getContext()
        .getResources();
    createViewModel(badge, resources, badge, view, storeOwner);
    Dialog dialog = new AlertDialog.Builder(context).setView(view)
        .create();
    View okButton = view.findViewById(R.id.ok_button);
    okButton.setOnClickListener(v -> dialog.dismiss());
    return dialog;
  }

  private void createViewModel(GridStoreMetaWidget.HomeMeta.Badge storeBadge, Resources resources,
      GridStoreMetaWidget.HomeMeta.Badge selectedBadge, View view, boolean storeOwner) {

    ImageView headerBackground = ((ImageView) view.findViewById(R.id.header_background));
    View followersBackground = view.findViewById(R.id.followers_background);
    ImageView medalIcon = ((ImageView) view.findViewById(R.id.medal_icon));
    ImageView tinMedal = ((ImageView) view.findViewById(R.id.tin_medal));
    ImageView bronzeMedal = ((ImageView) view.findViewById(R.id.bronze_medal));
    ImageView silverMedal = ((ImageView) view.findViewById(R.id.silver_medal));
    ImageView goldMedal = ((ImageView) view.findViewById(R.id.gold_medal));
    ImageView platinumMedal = ((ImageView) view.findViewById(R.id.platinum_medal));
    View tinMedalLayout = view.findViewById(R.id.tin_medal_layout);
    View bronzeMedalLayout = view.findViewById(R.id.bronze_medal_layout);
    View silverMedalLayout = view.findViewById(R.id.silver_medal_layout);
    View goldMedalLayout = view.findViewById(R.id.gold_medal_layout);
    View platinumMedalLayout = view.findViewById(R.id.platinum_medal_layout);
    TextView medalTextTv = (TextView) view.findViewById(R.id.medal_title);
    TextView congratulationsMessageTv = (TextView) view.findViewById(R.id.congratulations_message);
    TextView uploadedAppsTv = (TextView) view.findViewById(R.id.uploaded_apps);
    TextView downloadsTv = (TextView) view.findViewById(R.id.downloads);
    TextView followersTv = (TextView) view.findViewById(R.id.followers);
    TextView reviewsTv = (TextView) view.findViewById(R.id.reviews);
    View progress1 = view.findViewById(R.id.progress1);
    View progress2 = view.findViewById(R.id.progress2);
    View progress3 = view.findViewById(R.id.progress3);
    View progress4 = view.findViewById(R.id.progress4);
    @ColorRes int mainColor;
    @ColorRes int secondaryColor;
    boolean tinBadgeSelected = false;
    boolean bronzeBadgeSelected = false;
    boolean silverBadgeSelected = false;
    boolean goldBadgeSelected = false;
    boolean platinumBadgeSelected = false;
    @ColorRes int tinBadgeColor;
    @ColorRes int bronzeBadgeColor;
    @ColorRes int silverBadgeColor;
    @ColorRes int goldBadgeColor;
    @ColorRes int platinumBadgeColor;
    @ColorRes int progress1Color;
    @ColorRes int progress2Color;
    @ColorRes int progress3Color;
    @ColorRes int progress4Color;

    switch (selectedBadge) {
      case NONE:
      default:
        mainColor = R.color.tin_medal;
        secondaryColor = R.color.tin_medal_secodary;
        medalIcon.setImageResource(R.drawable.tin_medal_gradient);
        medalTextTv.setText(resources.getString(R.string.badgedialog_title_tin));
        congratulationsMessageTv.setText(
            resources.getString(R.string.badgedialog_message_tin, "\uD83C\uDF89"));
        uploadedAppsTv.setText(resources.getString(R.string.badgedialog_message_tin_1));
        uploadedAppsTv.setVisibility(View.VISIBLE);
        downloadsTv.setVisibility(View.GONE);
        followersTv.setVisibility(View.GONE);
        followersBackground.setVisibility(View.GONE);
        reviewsTv.setVisibility(View.GONE);
        tinBadgeSelected = true;
        break;
      case BRONZE:
        if (isRankLocked(storeBadge, selectedBadge)) {
          medalIcon.setImageResource(R.drawable.lock_medal_gradient);
          mainColor = R.color.grey_fog_dark;
          secondaryColor = R.color.grey_fog_light;
          congratulationsMessageTv.setText(
              resources.getString(R.string.badgedialog_message_bronze_lock, " \uD83D\uDCAA"));
        } else {
          medalIcon.setImageResource(R.drawable.bronze_medal_gradient);
          mainColor = R.color.bronze_medal;
          secondaryColor = R.color.bronze_medal_secodary;
          congratulationsMessageTv.setText(
              resources.getString(R.string.badgedialog_message_bronze, "\uD83C\uDF89"));
        }
        medalTextTv.setText(resources.getString(R.string.badgedialog_title_bronze));
        uploadedAppsTv.setText(resources.getString(R.string.badgedialog_message_bronze_1));
        downloadsTv.setText(resources.getString(R.string.badgedialog_message_bronze_2));
        followersTv.setText(resources.getString(R.string.badgedialog_message_bronze_3));
        reviewsTv.setText(resources.getString(R.string.badgedialog_message_bronze_4));
        uploadedAppsTv.setVisibility(View.VISIBLE);
        downloadsTv.setVisibility(View.VISIBLE);
        followersTv.setVisibility(View.VISIBLE);
        followersBackground.setVisibility(View.VISIBLE);
        reviewsTv.setVisibility(View.VISIBLE);
        bronzeBadgeSelected = true;
        break;
      case SILVER:
        if (isRankLocked(storeBadge, selectedBadge)) {
          medalIcon.setImageResource(R.drawable.lock_medal_gradient);
          mainColor = R.color.grey_fog_dark;
          secondaryColor = R.color.grey_fog_light;
          congratulationsMessageTv.setText(
              resources.getString(R.string.badgedialog_message_silver_lock, " \uD83D\uDCAA"));
        } else {
          medalIcon.setImageResource(R.drawable.silver_medal_gradient);
          mainColor = R.color.silver_medal;
          secondaryColor = R.color.silver_medal_secodary;
          congratulationsMessageTv.setText(
              resources.getString(R.string.badgedialog_message_silver, "\uD83C\uDF89"));
        }
        medalTextTv.setText(resources.getString(R.string.badgedialog_title_silver));
        uploadedAppsTv.setText(resources.getString(R.string.badgedialog_message_silver_1));
        downloadsTv.setText(resources.getString(R.string.badgedialog_message_silver_2));
        followersTv.setText(resources.getString(R.string.badgedialog_message_silver_3));
        reviewsTv.setText(resources.getString(R.string.badgedialog_message_silver_4));
        uploadedAppsTv.setVisibility(View.VISIBLE);
        downloadsTv.setVisibility(View.VISIBLE);
        followersTv.setVisibility(View.VISIBLE);
        followersBackground.setVisibility(View.VISIBLE);
        reviewsTv.setVisibility(View.VISIBLE);
        silverBadgeSelected = true;
        break;
      case GOLD:
        if (isRankLocked(storeBadge, selectedBadge)) {
          medalIcon.setImageResource(R.drawable.lock_medal_gradient);
          mainColor = R.color.grey_fog_dark;
          secondaryColor = R.color.grey_fog_light;
          congratulationsMessageTv.setText(
              resources.getString(R.string.badgedialog_message_gold_lock, " \uD83D\uDCAA"));
        } else {
          medalIcon.setImageResource(R.drawable.gold_medal_gradient);
          mainColor = R.color.gold_medal;
          secondaryColor = R.color.gold_medal_secodary;
          congratulationsMessageTv.setText(
              resources.getString(R.string.badgedialog_message_gold, "\uD83C\uDF89"));
        }
        medalTextTv.setText(resources.getString(R.string.badgedialog_title_gold));
        uploadedAppsTv.setText(resources.getString(R.string.badgedialog_message_gold_1));
        uploadedAppsTv.setVisibility(View.VISIBLE);
        downloadsTv.setVisibility(View.VISIBLE);
        followersTv.setVisibility(View.VISIBLE);
        followersBackground.setVisibility(View.VISIBLE);
        reviewsTv.setVisibility(View.VISIBLE);
        downloadsTv.setText(resources.getString(R.string.badgedialog_message_gold_2));
        followersTv.setText(resources.getString(R.string.badgedialog_message_gold_3));
        reviewsTv.setText(resources.getString(R.string.badgedialog_message_gold_4));
        goldBadgeSelected = true;
        break;
      case PLATINUM:
        if (isRankLocked(storeBadge, selectedBadge)) {
          medalIcon.setImageResource(R.drawable.lock_medal_gradient);
          mainColor = R.color.grey_fog_dark;
          secondaryColor = R.color.grey_fog_light;
          congratulationsMessageTv.setText(
              resources.getString(R.string.badgedialog_message_platinum_lock, " \uD83D\uDCAA"));
        } else {
          medalIcon.setImageResource(R.drawable.platinum_medal_gradient);
          mainColor = R.color.platinum_medal;
          secondaryColor = R.color.platinum_medal_secodary;
          congratulationsMessageTv.setText(
              resources.getString(R.string.badgedialog_message_platinum, "\uD83C\uDF89"));
        }
        medalTextTv.setText(resources.getString(R.string.badgedialog_title_platinum));
        uploadedAppsTv.setText(resources.getString(R.string.badgedialog_message_platinum_1));
        uploadedAppsTv.setVisibility(View.VISIBLE);
        downloadsTv.setVisibility(View.VISIBLE);
        followersTv.setVisibility(View.VISIBLE);
        followersBackground.setVisibility(View.VISIBLE);
        reviewsTv.setVisibility(View.VISIBLE);
        downloadsTv.setText(resources.getString(R.string.badgedialog_message_platinum_2));
        followersTv.setText(resources.getString(R.string.badgedialog_message_platinum_3));
        reviewsTv.setText(resources.getString(R.string.badgedialog_message_platinum_4));
        platinumBadgeSelected = true;
        break;
    }

    tinBadgeColor = getProgressColor(mainColor, secondaryColor, storeBadge, selectedBadge,
        GridStoreMetaWidget.HomeMeta.Badge.NONE);

    bronzeBadgeColor = getProgressColor(mainColor, secondaryColor, storeBadge, selectedBadge,
        GridStoreMetaWidget.HomeMeta.Badge.BRONZE);
    progress1Color = bronzeBadgeColor;

    silverBadgeColor = getProgressColor(mainColor, secondaryColor, storeBadge, selectedBadge,
        GridStoreMetaWidget.HomeMeta.Badge.SILVER);
    progress2Color = silverBadgeColor;

    goldBadgeColor = getProgressColor(mainColor, secondaryColor, storeBadge, selectedBadge,
        GridStoreMetaWidget.HomeMeta.Badge.GOLD);
    progress3Color = goldBadgeColor;

    platinumBadgeColor = getProgressColor(mainColor, secondaryColor, storeBadge, selectedBadge,
        GridStoreMetaWidget.HomeMeta.Badge.PLATINUM);
    progress4Color = platinumBadgeColor;

    headerBackground.setBackgroundColor(resources.getColor(mainColor));

    if (!isRankLocked(storeBadge, selectedBadge)) {
      setDrawableColor(resources, mainColor, uploadedAppsTv);
      setDrawableColor(resources, mainColor, downloadsTv);
      setDrawableColor(resources, mainColor, followersTv);
      setDrawableColor(resources, mainColor, reviewsTv);
    } else {
      setDrawableColor(resources, R.color.grey_fog_light, uploadedAppsTv);
      setDrawableColor(resources, R.color.white, downloadsTv);
      setDrawableColor(resources, R.color.grey_fog_light, followersTv);
      setDrawableColor(resources, R.color.white, reviewsTv);
    }

    setupMedal(tinMedal, tinBadgeSelected, tinBadgeColor, resources);
    setupMedal(bronzeMedal, bronzeBadgeSelected, bronzeBadgeColor, resources);
    setupMedal(silverMedal, silverBadgeSelected, silverBadgeColor, resources);
    setupMedal(goldMedal, goldBadgeSelected, goldBadgeColor, resources);
    setupMedal(platinumMedal, platinumBadgeSelected, platinumBadgeColor, resources);

    tinMedalLayout.setOnClickListener(
        v -> createViewModel(storeBadge, resources, GridStoreMetaWidget.HomeMeta.Badge.NONE, view,
            storeOwner));
    bronzeMedalLayout.setOnClickListener(
        v -> createViewModel(storeBadge, resources, GridStoreMetaWidget.HomeMeta.Badge.BRONZE, view,
            storeOwner));
    silverMedalLayout.setOnClickListener(
        v -> createViewModel(storeBadge, resources, GridStoreMetaWidget.HomeMeta.Badge.SILVER, view,
            storeOwner));
    goldMedalLayout.setOnClickListener(
        v -> createViewModel(storeBadge, resources, GridStoreMetaWidget.HomeMeta.Badge.GOLD, view,
            storeOwner));
    platinumMedalLayout.setOnClickListener(
        v -> createViewModel(storeBadge, resources, GridStoreMetaWidget.HomeMeta.Badge.PLATINUM,
            view, storeOwner));

    progress1.setBackgroundColor(resources.getColor(progress1Color));
    progress2.setBackgroundColor(resources.getColor(progress2Color));
    progress3.setBackgroundColor(resources.getColor(progress3Color));
    progress4.setBackgroundColor(resources.getColor(progress4Color));

    if (storeOwner) {
      congratulationsMessageTv.setVisibility(View.VISIBLE);
      tinMedalLayout.setVisibility(View.VISIBLE);
      bronzeMedalLayout.setVisibility(View.VISIBLE);
      silverMedalLayout.setVisibility(View.VISIBLE);
      goldMedalLayout.setVisibility(View.VISIBLE);
      platinumMedalLayout.setVisibility(View.VISIBLE);
      progress1.setVisibility(View.VISIBLE);
      progress2.setVisibility(View.VISIBLE);
      progress3.setVisibility(View.VISIBLE);
      progress4.setVisibility(View.VISIBLE);
    } else {
      congratulationsMessageTv.setVisibility(View.GONE);
      tinMedalLayout.setVisibility(View.GONE);
      bronzeMedalLayout.setVisibility(View.GONE);
      silverMedalLayout.setVisibility(View.GONE);
      goldMedalLayout.setVisibility(View.GONE);
      platinumMedalLayout.setVisibility(View.GONE);
      progress1.setVisibility(View.GONE);
      progress2.setVisibility(View.GONE);
      progress3.setVisibility(View.GONE);
      progress4.setVisibility(View.GONE);
    }
  }

  private boolean isRankLocked(GridStoreMetaWidget.HomeMeta.Badge storeBadge,
      GridStoreMetaWidget.HomeMeta.Badge selectedBadge) {
    return storeBadge.ordinal() < selectedBadge.ordinal();
  }

  private int getProgressColor(int mainColor, int secondaryColor,
      GridStoreMetaWidget.HomeMeta.Badge storeBadge,
      GridStoreMetaWidget.HomeMeta.Badge selectedBadge,
      GridStoreMetaWidget.HomeMeta.Badge currentSetup) {
    int tinBadgeColor =
        themeManager.getAttributeForTheme(R.attr.storeBadgeDialogProgress).resourceId;
    if (currentSetup.ordinal() <= storeBadge.ordinal()
        && currentSetup.ordinal() <= selectedBadge.ordinal()) {
      tinBadgeColor = mainColor;
    } else if (currentSetup.ordinal() <= storeBadge.ordinal()) {
      tinBadgeColor = secondaryColor;
    }
    return tinBadgeColor;
  }

  private void setBackground(ImageView view, int color) {
    GradientDrawable shape = new GradientDrawable();
    shape.setShape(GradientDrawable.OVAL);
    shape.setColor(color);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
      view.setBackground(shape);
    } else {
      view.setBackgroundDrawable(shape);
    }
  }

  private void setupMedal(ImageView badge, boolean isBadgeSelected, int badgeColor,
      Resources resources) {
    if (isBadgeSelected) {
      badge.getLayoutParams().width = selectedMedalSize;
      badge.getLayoutParams().height = selectedMedalSize;
      badge.setScaleType(ImageView.ScaleType.FIT_XY);
      badge.requestLayout();
    } else {
      badge.getLayoutParams().width = normalMedalSize;
      badge.getLayoutParams().height = normalMedalSize;
      badge.setScaleType(ImageView.ScaleType.FIT_XY);
      badge.requestLayout();
    }
    Drawable drawable = badge.getDrawable();
    setDrawableColor(resources, badgeColor, drawable);
    badge.setImageDrawable(drawable);
    setBackground(badge, resources.getColor(R.color.white));
  }

  private void setDrawableColor(Resources resources, @ColorRes int color, TextView view) {

    Drawable[] compoundDrawables = view.getCompoundDrawables();
    for (int i = 0, compoundDrawablesLength = compoundDrawables.length; i < compoundDrawablesLength;
        i++) {
      Drawable drawable = compoundDrawables[i];
      if (drawable != null) {
        drawable.mutate();
        drawable.setColorFilter(
            new PorterDuffColorFilter(resources.getColor(color), PorterDuff.Mode.SRC_IN));
        compoundDrawables[i] = drawable;
      }
    }
    view.setCompoundDrawablesWithIntrinsicBounds(compoundDrawables[0], compoundDrawables[1],
        compoundDrawables[2], compoundDrawables[3]);
  }

  private void setDrawableColor(Resources resources, @ColorRes int color,
      Drawable... compoundDrawables) {
    for (Drawable drawable : compoundDrawables) {
      if (drawable != null) {
        drawable.setColorFilter(
            new PorterDuffColorFilter(resources.getColor(color), PorterDuff.Mode.SRC_IN));
      }
    }
  }
}