import { BasePage } from '@/manager/shared/base/BasePage';
import { DepositDeleteDialog } from '@/manager/modules/deposit/views/DepositDeleteDialog';
import { DepositDetailsGeneralCard } from '@/manager/modules/deposit/components/DepositDetailsGeneralCard';
import { DepositEditGeneralDialog } from '@/manager/modules/deposit/views/DepositEditGeneralDialog';
import { DepositListPage } from '@/manager/modules/deposit/views/DepositListPage';
import { TaxCard } from '@/manager/modules/ui/tax/components/TaxCard';
import { TaxEditDialog } from '@/manager/modules/ui/tax/views/TaxEditDialog';
import { getPageHeaderBackButtonHost } from '@/manager/shared/utils/locator-utils';
import { getDetailsPageIdFromUrl } from '@/manager/shared/utils/url-utils';

export class DepositDetailsPage extends BasePage {
  readonly backButton = getPageHeaderBackButtonHost(this.header);
  readonly actionMenu = this.host.getByTestId('deposit-action-menu');
  readonly actionMenuButton = this.header.getByTestId('deposit-action-button');
  readonly actionMenuDeleteItem = this.actionMenu.getByTestId('deposit-action-delete');
  readonly generalCard = new DepositDetailsGeneralCard(this.body);
  readonly taxCard = new TaxCard(this.body);

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

  async openDepositEditGeneralDialog(): Promise<DepositEditGeneralDialog> {
    await Promise.all([this.host.waitForURL('**/deposits/*/edit/general'), this.generalCard.editButton.click()]);
    return new DepositEditGeneralDialog(this.host);
  }

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

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

  getDepositId(): number {
    return getDetailsPageIdFromUrl(this.host.url(), 'deposits');
  }

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