import { StateResource, createEmptyStateResource } from '@alfa-client/tech-shared';
import { CommonModule } from '@angular/common';
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { Resource } from '@ngxp/rest';
import { ButtonComponent, ErrorMessageComponent, buttonVariants } from '@ods/system';
import { VariantProps } from 'class-variance-authority';
import { isNil } from 'lodash-es';

type ButtonVariants = VariantProps<typeof buttonVariants>;

@Component({
  selector: 'ods-button-with-spinner',
  standalone: true,
  imports: [CommonModule, ButtonComponent, ErrorMessageComponent],
  styles: [':host {@apply flex flex-col}'],
  template: `<ods-error-message
      *ngIf="stateResource.error"
      text="Ein Fehler ist aufgetreten."
      subText="Versuchen Sie es nocheinmal."
    >
    </ods-error-message>
    <ods-button
      [text]="text"
      [variant]="variant"
      [size]="size"
      [dataTestId]="dataTestId"
      [isLoading]="isLoading"
      (click)="clickEmitter.emit()"
    >
    </ods-button>`,
})
export class ButtonWithSpinnerComponent implements OnInit {
  @Input() text: string = '';
  @Input() dataTestId: string = '';
  @Input() stateResource: StateResource<Resource>;
  @Input() variant: ButtonVariants['variant'] = 'primary';
  @Input() size: ButtonVariants['size'] = 'medium';

  @Output() public clickEmitter: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>();

  ngOnInit(): void {
    this.stateResource = this.getStateResource();
  }

  getStateResource(): StateResource<Resource> {
    return isNil(this.stateResource) ? createEmptyStateResource<Resource>() : this.stateResource;
  }

  get isLoading(): boolean {
    return this.stateResource.loading || this.stateResource.reload;
  }
}