package com.secureline.ui;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class SecureLineHeroView extends LinearLayout {
    private final FrameLayout iconFrame;
    private final ImageView iconView;
    private final TextView titleView;
    private final TextView subtitleView;
    private final TextView statusView;

    public SecureLineHeroView(Context context) { this(context, null); }
    public SecureLineHeroView(Context context, AttributeSet attrs) { this(context, attrs, 0); }
    public SecureLineHeroView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setOrientation(VERTICAL);
        setGravity(Gravity.CENTER_HORIZONTAL);
        int horizontal = getResources().getDimensionPixelSize(R.dimen.sl_screen_padding_horizontal);
        setPadding(horizontal, dp(36), horizontal, dp(24));

        iconFrame = new FrameLayout(context);
        LayoutParams frameParams = new LayoutParams(dp(84), dp(84));
        iconFrame.setLayoutParams(frameParams);
        addView(iconFrame);

        iconView = new ImageView(context);
        iconView.setPadding(dp(18), dp(18), dp(18), dp(18));
        iconView.setBackgroundResource(R.drawable.sl_icon_container);
        iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
        iconFrame.addView(iconView, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

        titleView = new TextView(context);
        titleView.setTextAppearance(R.style.SecureLineUI_Text_Display);
        titleView.setGravity(Gravity.CENTER);
        LayoutParams titleParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        titleParams.topMargin = dp(15);
        addView(titleView, titleParams);

        subtitleView = new TextView(context);
        subtitleView.setTextAppearance(R.style.SecureLineUI_Text_Body);
        subtitleView.setGravity(Gravity.CENTER);
        subtitleView.setMaxWidth(dp(330));
        LayoutParams subtitleParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        subtitleParams.topMargin = dp(8);
        addView(subtitleView, subtitleParams);

        statusView = new TextView(context);
        statusView.setTextColor(getResources().getColor(R.color.sl_color_blue_soft, context.getTheme()));
        statusView.setTextSize(12);
        statusView.setGravity(Gravity.CENTER);
        statusView.setBackgroundResource(R.drawable.sl_status_pill);
        statusView.setPadding(dp(12), dp(7), dp(12), dp(7));
        statusView.setAllCaps(true);
        statusView.setLetterSpacing(.10f);
        statusView.setTypeface(android.graphics.Typeface.create("sans-serif-medium", 0));
        LayoutParams statusParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        statusParams.topMargin = dp(11);
        addView(statusView, statusParams);

        if (attrs != null) {
            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SecureLineHeroView);
            setTitle(a.getText(R.styleable.SecureLineHeroView_slHeroTitle));
            setSubtitle(a.getText(R.styleable.SecureLineHeroView_slHeroSubtitle));
            setStatus(a.getText(R.styleable.SecureLineHeroView_slHeroStatus));
            Drawable icon = a.getDrawable(R.styleable.SecureLineHeroView_slHeroIcon);
            if (icon != null) iconView.setImageDrawable(icon);
            boolean large = a.getBoolean(R.styleable.SecureLineHeroView_slHeroLargeIcon, false);
            boolean compact = a.getBoolean(R.styleable.SecureLineHeroView_slHeroCompactHeader, false);
            if (large) setLargeLogoMode();
            if (compact) setCompactHeaderMode();
            a.recycle();
        }
        if (iconView.getDrawable() == null) iconView.setImageResource(R.drawable.sl_ic_shield);
    }

    private void setLargeLogoMode() {
        // Keep protect_logo.png at its current approved render size of 124dp.
        // The wider frame gives the 3D platform room to extend beyond the logo,
        // matching the presentation used on lemenzo.eu/wipe.
        setBackgroundResource(R.drawable.sl_hero_security_background);
        setPadding(dp(20), dp(28), dp(20), dp(26));
        LayoutParams ownParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        ownParams.leftMargin = dp(16);
        ownParams.rightMargin = dp(16);
        ownParams.topMargin = dp(14);
        ownParams.bottomMargin = dp(10);
        setLayoutParams(ownParams);
        setElevation(dp(4));

        LayoutParams params = new LayoutParams(dp(206), dp(168));
        iconFrame.setLayoutParams(params);
        iconFrame.setBackground(null);
        iconFrame.setPadding(0, 0, 0, 0);

        View platform = new View(getContext());
        platform.setBackgroundResource(R.drawable.sl_logo_platform);
        FrameLayout.LayoutParams platformParams = new FrameLayout.LayoutParams(dp(184), dp(40));
        platformParams.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
        platformParams.bottomMargin = dp(18);
        iconFrame.addView(platform, 0, platformParams);

        FrameLayout.LayoutParams iconParams = new FrameLayout.LayoutParams(dp(132), dp(132));
        iconParams.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
        iconParams.topMargin = dp(2);
        iconView.setLayoutParams(iconParams);
        iconView.setPadding(0, 0, 0, 0);
        iconView.setBackground(null);
        iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
        iconView.setElevation(dp(6));
    }

    private void setCompactHeaderMode() {
        setOrientation(HORIZONTAL);
        setGravity(Gravity.CENTER_VERTICAL);
        setBackgroundColor(android.graphics.Color.TRANSPARENT);
        setPadding(dp(20), dp(18), dp(20), dp(14));
        setElevation(0);

        LayoutParams ownParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        ownParams.leftMargin = 0;
        ownParams.rightMargin = 0;
        ownParams.topMargin = 0;
        ownParams.bottomMargin = dp(4);
        setLayoutParams(ownParams);

        LayoutParams iconParams = new LayoutParams(dp(48), dp(48));
        iconParams.rightMargin = dp(12);
        iconFrame.setLayoutParams(iconParams);
        iconFrame.setBackground(null);
        iconFrame.setPadding(0, 0, 0, 0);
        iconView.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        iconView.setBackground(null);
        iconView.setPadding(0, 0, 0, 0);
        iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);

        removeView(titleView);
        removeView(subtitleView);
        removeView(statusView);

        LinearLayout textColumn = new LinearLayout(getContext());
        textColumn.setOrientation(VERTICAL);
        textColumn.setGravity(Gravity.START);
        addView(textColumn, new LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f));

        titleView.setGravity(Gravity.START);
        titleView.setTextSize(23);
        titleView.setMaxLines(1);
        titleView.setEllipsize(android.text.TextUtils.TruncateAt.END);
        textColumn.addView(titleView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

        subtitleView.setGravity(Gravity.START);
        subtitleView.setTextSize(12.5f);
        subtitleView.setMaxLines(2);
        LayoutParams subtitleParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        subtitleParams.topMargin = dp(2);
        textColumn.addView(subtitleView, subtitleParams);

        statusView.setGravity(Gravity.CENTER);
        statusView.setTextSize(10.5f);
        statusView.setPadding(dp(9), dp(4), dp(9), dp(4));
        LayoutParams statusParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        statusParams.topMargin = dp(7);
        textColumn.addView(statusView, statusParams);
    }

    public void setTitle(CharSequence value) { titleView.setText(value); }
    public void setSubtitle(CharSequence value) {
        subtitleView.setText(value);
        subtitleView.setVisibility(value == null || value.length() == 0 ? GONE : VISIBLE);
    }
    public void setStatus(CharSequence value) {
        statusView.setText(value);
        statusView.setVisibility(value == null || value.length() == 0 ? GONE : VISIBLE);
    }
    public void setStatusColor(int color) { statusView.setTextColor(color); }
    public void setIconResource(int resourceId) { iconView.setImageResource(resourceId); }
    public void setDetailIconSize(int sizeDp, int paddingDp) {
        // Every detail page uses the exact same 84dp hero box and top spacing.
        // 8dp internal padding leaves roughly 80% of the box for the icon.
        int horizontal = getResources().getDimensionPixelSize(R.dimen.sl_screen_padding_horizontal);
        setBackgroundResource(R.drawable.sl_hero_security_background);
        setPadding(horizontal, dp(28), horizontal, dp(24));
        LayoutParams ownParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        ownParams.leftMargin = dp(16);
        ownParams.rightMargin = dp(16);
        ownParams.topMargin = dp(16);
        ownParams.bottomMargin = dp(14);
        setLayoutParams(ownParams);
        setElevation(dp(3));
        LayoutParams params = new LayoutParams(dp(sizeDp), dp(sizeDp));
        iconFrame.setLayoutParams(params);
        iconFrame.setBackground(null);
        iconFrame.setPadding(0, 0, 0, 0);
        iconView.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        iconView.setBackgroundResource(R.drawable.sl_icon_container);
        iconView.setPadding(dp(paddingDp), dp(paddingDp), dp(paddingDp), dp(paddingDp));
        iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
        iconView.setColorFilter(android.graphics.Color.WHITE, android.graphics.PorterDuff.Mode.SRC_IN);
    }
    public void setTitleTextSize(float sp) { titleView.setTextSize(sp); }

    /**
     * Premium utility hero used by License Information and Info.
     * It adds extra top breathing room and gives the icon substantially more visual weight
     * without changing the approved Protect-logo hero.
     */
    public void setUtilityIconMode(int boxSizeDp, int paddingDp, int topPaddingDp) {
        int horizontal = getResources().getDimensionPixelSize(R.dimen.sl_screen_padding_horizontal);
        setBackgroundResource(R.drawable.sl_hero_security_background);
        // Keep the icon close to the top inside the card while the complete card
        // is pushed below the status bar and camera cutout.
        setPadding(horizontal, dp(topPaddingDp), horizontal, dp(28));
        LayoutParams ownParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        ownParams.leftMargin = dp(16);
        ownParams.rightMargin = dp(16);
        ownParams.topMargin = dp(39);
        ownParams.bottomMargin = dp(14);
        setLayoutParams(ownParams);
        setElevation(dp(3));
        LayoutParams params = new LayoutParams(dp(boxSizeDp), dp(boxSizeDp));
        iconFrame.setLayoutParams(params);
        iconFrame.setBackground(null);
        iconFrame.setPadding(0, 0, 0, 0);
        iconView.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        iconView.setBackgroundResource(R.drawable.sl_icon_container);
        iconView.setPadding(dp(paddingDp), dp(paddingDp), dp(paddingDp), dp(paddingDp));
        iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
    }
    private int dp(int value) { return Math.round(value * getResources().getDisplayMetrics().density); }
}
