// Copyright (C) 2023 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.

import m from 'mithril';

import {globals} from '../globals';
import {fullscreenModalContainer, ModalDefinition} from '../modal';
import {AnyAttrsVnode} from '../panel_container';
import {ArgumentPopup} from '../pivot_table_argument_popup';

export class AttributeModalHolder {
  showModal = false;
  typedArgument = '';

  callback: (arg: string) => void;

  constructor(callback: (arg: string) => void) {
    this.callback = callback;
  }

  start() {
    this.showModal = true;
    fullscreenModalContainer.createNew(this.renderModal());
    globals.rafScheduler.scheduleFullRedraw();
  }

  private renderModal(): ModalDefinition {
    return {
      title: 'Enter argument name',
      content:
          m(ArgumentPopup, {
            knownArguments:
                globals.state.nonSerializableState.pivotTable.argumentNames,
            onArgumentChange: (arg) => {
              this.typedArgument = arg;
            },
          }) as AnyAttrsVnode,
      buttons: [
        {
          text: 'Add',
          action: () => {
            this.callback(this.typedArgument);
            this.typedArgument = '';
          },
        },
      ],
      onClose: () => {
        this.showModal = false;
      },
    };
  }

  // A method that should be called in `view` method of whatever component is
  // using the attribute modal.
  update() {
    if (this.showModal) {
      fullscreenModalContainer.updateVdom(this.renderModal());
    }
  }
}
