import { BaseDialog } from '@/manager/shared/base/BaseDialog';
import { BookingPlanPeriodRadioGroup } from '@/manager/modules/ui/booking-plan/components/BookingPlanPeriodRadioGroup';
import { BookingPlan } from '@/shared/types/booking-plan-types';
import { Checkbox } from '@/manager/shared/components/Checkbox';
import { LanguageAwareInput } from '@/manager/shared/components/LanguageAwareInput';
import { NumberField } from '@/manager/shared/components/NumberField';
import { TextField } from '@/manager/shared/components/TextField';
import { getDialogErrorsHost, getInputHostByLabel, getSnackbarHost } from '@/manager/shared/utils/locator-utils';
import { UnsavedChangesDialog } from '@/manager/shared/views/UnsavedChangesDialog';
import { Page } from '@playwright/test';

export class BookingPlanAddDialog extends BaseDialog {
  readonly periodRadioGroup = new BookingPlanPeriodRadioGroup(this.main);
  readonly nameTextField = new TextField(getInputHostByLabel(this.main, 'Name'));
  readonly shortDescriptionInput = new LanguageAwareInput(this.main);
  readonly priceExclVatNumberField = new NumberField(getInputHostByLabel(this.main, 'Price excl. VAT'));
  readonly amountNumberField = new NumberField(getInputHostByLabel(this.main, 'Billing period'));
  readonly discountNumberField = new NumberField(getInputHostByLabel(this.main, 'Discount'));
  readonly publishCheckbox = new Checkbox(this.main.locator('.v-checkbox'));
  readonly errors = getDialogErrorsHost(this.main);
  readonly updatedSnackbar = getSnackbarHost(this.host, 'Booking plan successfully created');
  readonly notUniqueSnackbar = getSnackbarHost(this.host, 'Already existing.');

  constructor(
    host: Page,
    readonly showAlerts: boolean
  ) {
    super(host, 'add-booking-plan-dialog');
  }

  async add(data: BookingPlan): Promise<void> {
    await this.fill(data);
    const waits: Promise<unknown>[] = [this.submit()];

    if (this.showAlerts) {
      waits.unshift(this.updatedSnackbar.waitFor());
    }

    await Promise.all(waits);
  }

  async fill(plan: BookingPlan): Promise<void> {
    await this.periodRadioGroup.fill(plan);

    if (plan.name != null) {
      await this.nameTextField.fill(plan.name);
    }

    if (plan.shortDescription != null) {
      await this.shortDescriptionInput.fill(plan.shortDescription);
    }

    await this.priceExclVatNumberField.fill(plan.priceExclVat);
    await this.amountNumberField.fill(plan.amount);

    if (plan.discount != null) {
      await this.discountNumberField.fill(plan.discount);
    }

    await this.publishCheckbox.set(plan.publish);
  }

  async submit(): Promise<void> {
    await this.submitButton.click();
  }

  async cancel(): Promise<void> {
    await this.closeButton.click();

    if (this.showAlerts) {
      await this.discardUnsavedChanges();
    }
  }

  private discardUnsavedChanges(): Promise<void> {
    const dialog = new UnsavedChangesDialog(this.host);
    return dialog.discard();
  }
}
