/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.dialer.callcomposer.camera.camerafocus;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Path;
import android.graphics.drawable.Drawable;
import java.util.List;

/** Pie menu item. */
public class PieItem {

  /** Listener to detect pie item clicks. */
  public interface OnClickListener {
    void onClick(PieItem item);
  }

  private Drawable mDrawable;
  private int level;
  private float mCenter;
  private float start;
  private float sweep;
  private float animate;
  private int inner;
  private int outer;
  private boolean mSelected;
  private boolean mEnabled;
  private List<PieItem> mItems;
  private Path mPath;
  private OnClickListener mOnClickListener;
  private float mAlpha;

  // Gray out the view when disabled
  private static final float ENABLED_ALPHA = 1;
  private static final float DISABLED_ALPHA = (float) 0.3;

  public PieItem(Drawable drawable, int level) {
    mDrawable = drawable;
    this.level = level;
    setAlpha(1f);
    mEnabled = true;
    setAnimationAngle(getAnimationAngle());
    start = -1;
    mCenter = -1;
  }

  public boolean hasItems() {
    return mItems != null;
  }

  public List<PieItem> getItems() {
    return mItems;
  }

  public void setPath(Path p) {
    mPath = p;
  }

  public Path getPath() {
    return mPath;
  }

  public void setAlpha(float alpha) {
    mAlpha = alpha;
    mDrawable.setAlpha((int) (255 * alpha));
  }

  public void setAnimationAngle(float a) {
    animate = a;
  }

  private float getAnimationAngle() {
    return animate;
  }

  public void setEnabled(boolean enabled) {
    mEnabled = enabled;
    if (mEnabled) {
      setAlpha(ENABLED_ALPHA);
    } else {
      setAlpha(DISABLED_ALPHA);
    }
  }

  public boolean isEnabled() {
    return mEnabled;
  }

  public void setSelected(boolean s) {
    mSelected = s;
  }

  public boolean isSelected() {
    return mSelected;
  }

  public int getLevel() {
    return level;
  }

  public void setGeometry(float st, float sw, int inside, int outside) {
    start = st;
    sweep = sw;
    inner = inside;
    outer = outside;
  }

  public float getCenter() {
    return mCenter;
  }

  public float getStart() {
    return start;
  }

  public float getStartAngle() {
    return start + animate;
  }

  public float getSweep() {
    return sweep;
  }

  public int getInnerRadius() {
    return inner;
  }

  public int getOuterRadius() {
    return outer;
  }

  public void setOnClickListener(OnClickListener listener) {
    mOnClickListener = listener;
  }

  public void performClick() {
    if (mOnClickListener != null) {
      mOnClickListener.onClick(this);
    }
  }

  public int getIntrinsicWidth() {
    return mDrawable.getIntrinsicWidth();
  }

  public int getIntrinsicHeight() {
    return mDrawable.getIntrinsicHeight();
  }

  public void setBounds(int left, int top, int right, int bottom) {
    mDrawable.setBounds(left, top, right, bottom);
  }

  public void draw(Canvas canvas) {
    mDrawable.draw(canvas);
  }

  public void setImageResource(Context context, int resId) {
    Drawable d = context.getResources().getDrawable(resId).mutate();
    d.setBounds(mDrawable.getBounds());
    mDrawable = d;
    setAlpha(mAlpha);
  }
}
