package com.joanfuentes.hintcaseassets.hintcontentholders;

import android.content.Context;
import android.text.SpannableString;
import android.text.style.TextAppearanceSpan;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.joanfuentes.hintcase.HintCase;

public class SimpleHintContentHolder extends HintContentHolder {
    public static final int NO_IMAGE = -1;

    private ImageView imageView;
    private int imageResourceId;
    private CharSequence contentTitle;
    private CharSequence contentText;
    private int titleStyleId;
    private int textStyleId;
    private int marginLeft;
    private int marginTop;
    private int marginRight;
    private int marginBottom;
    private int gravity;

    @Override
    public View getView(Context context, final HintCase hintCase, ViewGroup parent) {
        FrameLayout.LayoutParams frameLayoutParamsBlock = getParentLayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT,
                gravity, marginLeft, marginTop, marginRight, marginBottom);
        LinearLayout linearLayout = new LinearLayout(context);
        linearLayout.setLayoutParams(frameLayoutParamsBlock);
        linearLayout.setGravity(Gravity.CENTER);
        linearLayout.setOrientation(LinearLayout.VERTICAL);
        if (contentTitle != null) {
            linearLayout.addView(getTextViewTitle(context));
        }
        if (existImage()) {
            linearLayout.addView(getImage(context, imageView, imageResourceId));
        }
        if (contentText != null) {
            linearLayout.addView(getTextViewDescription(context));
        }
        return linearLayout;
    }

    private ImageView getImage(Context context, ImageView image, int imageResourceId) {
        LinearLayout.LayoutParams linearLayoutParamsImage =
                new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT,
                        1.0f);
        linearLayoutParamsImage.setMargins(0, 20, 0, 50);
        if (image == null) {
            image = new ImageView(context);
        }
        if (imageResourceId != SimpleHintContentHolder.NO_IMAGE) {
            image.setImageResource(imageResourceId);
        }
        image.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
        image.setAdjustViewBounds(true);
        image.setLayoutParams(linearLayoutParamsImage);
        return image;
    }

    private View getTextViewTitle(Context context) {
        LinearLayout.LayoutParams linearLayoutParamsTitle =
                new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT);
        linearLayoutParamsTitle.setMargins(0, 20, 0, 20);
        TextView textViewTitle = new TextView(context);
        textViewTitle.setLayoutParams(linearLayoutParamsTitle);
        textViewTitle.setGravity(Gravity.CENTER_HORIZONTAL);
        SpannableString spannableStringTitle= new SpannableString(contentTitle);
        TextAppearanceSpan titleTextAppearanceSpan = new TextAppearanceSpan(context, titleStyleId);
        spannableStringTitle.setSpan(titleTextAppearanceSpan, 0, spannableStringTitle.length(), 0);
        textViewTitle.setText(spannableStringTitle);
        return textViewTitle;
    }

    private View getTextViewDescription(Context context) {
        LinearLayout.LayoutParams linearLayoutParamsText =
                new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT);
        TextView textViewDescription = new TextView(context);
        textViewDescription.setLayoutParams(linearLayoutParamsText);
        textViewDescription.setGravity(Gravity.CENTER_HORIZONTAL);
        SpannableString spannableStringText= new SpannableString(contentText);
        TextAppearanceSpan textTextAppearanceSpan = new TextAppearanceSpan(context, textStyleId);
        spannableStringText.setSpan(textTextAppearanceSpan, 0, spannableStringText.length(), 0);
        textViewDescription.setText(spannableStringText);
        return textViewDescription;
    }

    private boolean existImage() {
        return imageView != null ||
                imageResourceId != SimpleHintContentHolder.NO_IMAGE;
    }

    public static class Builder {
        private SimpleHintContentHolder blockInfo;
        private Context context;

        public Builder(Context context) {
            this.context = context;
            this.blockInfo = new SimpleHintContentHolder();
            this.blockInfo.imageResourceId = NO_IMAGE;
            this.blockInfo.gravity = Gravity.CENTER;
        }

        public Builder setImageDrawableId(int resourceId) {
            blockInfo.imageResourceId = resourceId;
            return this;
        }

        public Builder setImageView(ImageView imageView) {
            blockInfo.imageView = imageView;
            return this;
        }

        public Builder setContentTitle(CharSequence title) {
            blockInfo.contentTitle = title;
            return this;
        }

        public Builder setContentTitle(int resId) {
            blockInfo.contentTitle = context.getString(resId);
            return this;
        }

        public Builder setTitleStyle(int resId) {
            blockInfo.titleStyleId = resId;
            return this;
        }

        public Builder setContentText(CharSequence text) {
            blockInfo.contentText = text;
            return this;
        }

        public Builder setContentText(int resId) {
            blockInfo.contentText = context.getString(resId);
            return this;
        }

        public Builder setContentStyle(int resId) {
            blockInfo.textStyleId = resId;
            return this;
        }

        public Builder setGravity(int gravity) {
            blockInfo.gravity = gravity;
            return this;
        }

        public Builder setMargin(int left, int top, int right, int bottom) {
            blockInfo.marginLeft = left;
            blockInfo.marginTop = top;
            blockInfo.marginRight = right;
            blockInfo.marginBottom = bottom;
            return this;
        }

        public Builder setMarginByResourcesId(int left, int top, int right, int bottom) {
            blockInfo.marginLeft = context.getResources().getDimensionPixelSize(left);
            blockInfo.marginTop = context.getResources().getDimensionPixelSize(top);
            blockInfo.marginRight = context.getResources().getDimensionPixelSize(right);
            blockInfo.marginBottom = context.getResources().getDimensionPixelSize(bottom);
            return this;
        }

        public SimpleHintContentHolder build() {
            return blockInfo;
        }
    }
}