import { OzgCloudComponentFactory } from '@alfa-client/tech-shared';
import { DIALOG_COMPONENT, OzgcloudDialogService } from '@alfa-client/ui';
import { DIALOG_DATA } from '@angular/cdk/dialog';
import { ComponentType } from '@angular/cdk/portal';
import { Component, ComponentRef, EventEmitter, inject, Injector, Input, Output, ViewContainerRef } from '@angular/core';
import { ButtonComponent, ButtonVariants } from '@ods/system';
import { first } from 'rxjs';

@Component({
  selector: 'ods-open-dialog-button',
  standalone: true,
  imports: [ButtonComponent],
  template: ` <ods-button
    (clickEmitter)="open()"
    [variant]="variant"
    [text]="label"
    [size]="size"
    [dataTestId]="dataTestId"
    [dataTestClass]="dataTestClass"
    data-test-id="open-dialog"
  >
    <ng-container icon>
      <ng-content select="[icon]" />
    </ng-container>
  </ods-button>`,
})
export class OpenDialogButtonComponent {
  private readonly component: ComponentType<any> = inject(DIALOG_COMPONENT);
  private readonly componentFactory = inject(OzgCloudComponentFactory);

  private readonly dialogService = inject(OzgcloudDialogService);

  readonly viewContainerRef = inject(ViewContainerRef);
  private readonly injector = inject(Injector);

  @Input() label: string;
  @Input() dataTestId: string;
  @Input() dataTestClass: string;
  @Input() variant: ButtonVariants['variant'] = 'primary';
  @Input() dialogData: any;
  @Input() size: ButtonVariants['size'];

  @Output() close: EventEmitter<void> = new EventEmitter();

  public open(): void {
    this.dialogService
      .openInContext(this._createComponent().instance.constructor, this.viewContainerRef, this.dialogData)
      .closed.pipe(first())
      .subscribe(() => this.close.emit());
  }

  _createComponent(): ComponentRef<any> {
    return this.componentFactory.createComponent<any>(this.component, this.injector, [
      { provide: DIALOG_DATA, useValue: this.dialogData },
    ]);
  }
}