import { ProductOneTimeDetailsBookingPortalCard } from '@/manager/modules/product/components/ProductOneTimeDetailsBookingPortalCard';
import { ProductOneTimeDetailsGeneralCard } from '@/manager/modules/product/components/ProductOneTimeDetailsGeneralCard';
import { ProductUnitTypeCard } from '@/manager/modules/product/components/ProductUnitTypeCard';
import { ProductListPage } from '@/manager/modules/product/views/ProductListPage';
import { ProductEditUnitTypesDialog } from '@/manager/modules/product/views/ProductEditUnitTypesDialog';
import { ProductOneTimeEditBookingPortalDialog } from '@/manager/modules/product/views/ProductOneTimeEditBookingPortalDialog';
import { ProductOneTimeEditGeneralDialog } from '@/manager/modules/product/views/ProductOneTimeEditGeneralDialog';
import { TaxCard } from '@/manager/modules/ui/tax/components/TaxCard';
import { TaxEditDialog } from '@/manager/modules/ui/tax/views/TaxEditDialog';
import { BasePage } from '@/manager/shared/base/BasePage';
import {
  getPageHeaderBackButtonHost,
  getPageHeaderStatusHost,
  getSnackbarHost,
} from '@/manager/shared/utils/locator-utils';
import { getDetailsPageIdFromUrl } from '@/manager/shared/utils/url-utils';
import { ProductDeleteDialog } from '@/manager/modules/product/views/ProductDeleteDialog';

export class ProductOneTimeDetailsPage extends BasePage {
  readonly backButton = getPageHeaderBackButtonHost(this.header);
  readonly publishStatusChip = getPageHeaderStatusHost(this.header);
  readonly actionMenu = this.host.getByTestId('product-action-list');
  readonly actionMenuButton = this.header.getByTestId('product-action-button');
  readonly actionMenuDeleteItem = this.actionMenu.getByTestId('product-action-delete');
  readonly actionMenuTogglePublishItem = this.actionMenu.getByTestId('product-action-toggle-publish');
  readonly generalCard = new ProductOneTimeDetailsGeneralCard(this.body);
  readonly bookingPortalCard = new ProductOneTimeDetailsBookingPortalCard(this.body);
  readonly taxCard = new TaxCard(this.body);
  readonly unitTypeCard = new ProductUnitTypeCard(this.body);
  readonly snackbar = getSnackbarHost(this.host, 'Changed status successfully');

  async goto(id: number): Promise<void> {
    await this.host.goto(`/products/one-time/${id}`);
  }

  getProductId(): number {
    return getDetailsPageIdFromUrl(this.host.url(), 'products/one-time');
  }

  async openProductOneTimeEditGeneralDialog(): Promise<ProductOneTimeEditGeneralDialog> {
    await Promise.all([
      this.host.waitForURL('**/products/one-time/*/edit/general'),
      this.generalCard.editButton.click(),
    ]);
    return new ProductOneTimeEditGeneralDialog(this.host);
  }

  async openProductOneTimeEditBookingPortalDialog(): Promise<ProductOneTimeEditBookingPortalDialog> {
    await Promise.all([
      this.host.waitForURL('**/products/one-time/*/edit/booking-portal'),
      this.bookingPortalCard.editButton.click(),
    ]);
    return new ProductOneTimeEditBookingPortalDialog(this.host);
  }

  async openTaxEditDialog(): Promise<TaxEditDialog> {
    return this.taxCard.openTaxEditDialog();
  }

  async openProductEditUnitTypesDialog(): Promise<ProductEditUnitTypesDialog> {
    return this.unitTypeCard.openProductEditUnitTypesDialog(true);
  }

  async openProductDeleteDialog(): Promise<ProductDeleteDialog> {
    await this.actionMenuButton.click();
    await this.actionMenuDeleteItem.click();
    return new ProductDeleteDialog(this.host);
  }

  async togglePublishStatus(): Promise<void> {
    await this.actionMenuButton.click();
    await Promise.all([this.snackbar.waitFor(), this.actionMenuTogglePublishItem.click()]);
  }

  async returnToProductListPage(): Promise<ProductListPage> {
    await Promise.all([this.host.waitForURL('/products'), this.backButton.click()]);
    return new ProductListPage(this.host);
  }
}
