// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// 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 dev.cobalt.coat;

import android.app.Dialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * A fullscreen dialog to show an error, with up to 3 buttons. This has a look similar to the
 * Android TV leanback ErrorFragment. As a dialog, it creates its own window so it can be shown on
 * top of our NativeActivity, unlike a fragment.
 */
class ErrorDialog extends Dialog {

  public static final int MAX_BUTTONS = 3;

  private final Params params;

  private static class Params {
    private int messageId;
    private int numButtons = 0;
    private int[] buttonIds = new int[MAX_BUTTONS];
    private int[] buttonLabelIds = new int[MAX_BUTTONS];
    private OnClickListener buttonClickListener;
    private OnDismissListener dismissListener;
  }

  public static class Builder {

    private Context context;
    private Params params = new Params();

    public Builder(Context context) {
      this.context = context;
    }

    public Builder setMessage(int messageId) {
      params.messageId = messageId;
      return this;
    }

    public Builder addButton(int id, int labelId) {
      if (params.numButtons >= MAX_BUTTONS) {
        throw new IllegalArgumentException("Too many buttons");
      }
      params.buttonIds[params.numButtons] = id;
      params.buttonLabelIds[params.numButtons] = labelId;
      params.numButtons++;
      return this;
    }

    public Builder setButtonClickListener(OnClickListener buttonClickListener) {
      params.buttonClickListener = buttonClickListener;
      return this;
    }

    public Builder setOnDismissListener(OnDismissListener dismissListener) {
      params.dismissListener = dismissListener;
      return this;
    }

    public ErrorDialog create() {
      return new ErrorDialog(context, params);
    }
  }

  private ErrorDialog(Context context, Params params) {
    super(context);
    this.params = params;
  }

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.coat_error_dialog);

    ImageView imageView = (ImageView) findViewById(R.id.image);
    Drawable drawable =
        getContext()
            .getResources()
            .getDrawable(R.drawable.lb_ic_sad_cloud, getContext().getTheme());
    imageView.setImageDrawable(drawable);

    TextView messageView = (TextView) findViewById(R.id.message);
    messageView.setText(params.messageId);

    Button button = (Button) findViewById(R.id.button_1);
    ViewGroup container = (ViewGroup) button.getParent();
    int buttonIndex = container.indexOfChild(button);

    for (int i = 0; i < params.numButtons; i++) {
      button = (Button) container.getChildAt(buttonIndex + i);
      button.setText(params.buttonLabelIds[i]);
      button.setVisibility(View.VISIBLE);

      final int buttonId = params.buttonIds[i];
      button.setOnClickListener(
          new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              params.buttonClickListener.onClick(ErrorDialog.this, buttonId);
            }
          });
    }

    setOnDismissListener(params.dismissListener);
  }
}
