package org.thoughtcrime.securesms.components;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;

import org.thoughtcrime.securesms.R;

public class ImageDivet extends ImageView {
  private static final float CORNER_OFFSET = 12F;
  private static final String[] POSITIONS  = new String[] {"bottom_right"};

  private Drawable drawable;

  private int drawableIntrinsicWidth;
  private int drawableIntrinsicHeight;
  private int position;
  private float density;

  public ImageDivet(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    initialize(attrs);
  }

  public ImageDivet(Context context, AttributeSet attrs) {
    super(context, attrs);
    initialize(attrs);
  }

  public ImageDivet(Context context) {
    super(context);
    initialize(null);
  }

  private void initialize(AttributeSet attrs) {
    if (attrs != null) {
      position = attrs.getAttributeListValue(null, "position", POSITIONS, -1);
    }

    density = getContext().getResources().getDisplayMetrics().density;
    setDrawable();
  }

  private void setDrawable() {
    int attributes[]     = new int[] {R.attr.lower_right_divet};

    TypedArray drawables = getContext().obtainStyledAttributes(attributes);

    switch (position) {
    case 0:
      drawable = drawables.getDrawable(0);
      break;
    }

    drawableIntrinsicWidth  = drawable.getIntrinsicWidth();
    drawableIntrinsicHeight = drawable.getIntrinsicHeight();

    drawables.recycle();
  }

  @Override
  public void onDraw(Canvas c) {
    super.onDraw(c);
    c.save();
    computeBounds(c);
    drawable.draw(c);
    c.restore();
  }

  public void setPosition(int position) {
    this.position = position;
    setDrawable();
    invalidate();
  }

  public int getPosition() {
    return position;
  }

  public float getCloseOffset() {
    return CORNER_OFFSET * density;
  }

  public ImageView asImageView() {
    return this;
  }

  public float getFarOffset() {
    return getCloseOffset() + drawableIntrinsicHeight;
  }

  private void computeBounds(Canvas c) {
    final int right = getWidth();
    final int bottom = getHeight();

    switch (position) {
    case 0:
     drawable.setBounds(
         right - drawableIntrinsicWidth,
         bottom - drawableIntrinsicHeight,
         right,
         bottom);
     break;
    }
  }
}
