import { IAuthResponse, TRoles } from '@/core';
import { ToastService } from '@/core/services/toast.service';
import { Component, EventEmitter, inject, Input, Output, signal } from '@angular/core';
import { Router } from '@angular/router';
import images from 'src/assets/images';
import config from 'src/config';
import { LoginComponent } from './login/login.component';

type TSteps = 'login' | 'otp' | 'modifyLoginInfo' | 'signup';

@Component({
  selector: 'app-auth',
  templateUrl: './auth.component.html',
  imports: [LoginComponent],
})
export class AuthComponent {
  @Input() redirectUrl!: string;
  @Input() loginApiUrl!: string;
  @Input() role?: TRoles;
  @Input() defaultStep: TSteps = 'login';

  @Output() submit = new EventEmitter<Promise<boolean>>();

  private readonly toastService = inject(ToastService);
  private readonly router = inject(Router);

  readonly logo = images.logo;
  readonly authVector = images.login;

  activeStep = signal<TSteps>(this.defaultStep);

  selectedRole = signal<TRoles | undefined>(this.role);
  accountRole = signal<string>('');

  toSignUp = () => {
    this.activeStep.set('signup');
  };

  onLoggedIn = (data: IAuthResponse) => {
    this.toastService.success({ text: 'شما با موفقیت وارد شدید.' });

    this.selectedRole.set(data.account.type.toUpperCase() as TRoles);
    this.accountRole.set(data.account.role);
    // if (data.mustChangePassword) {
    //   this.activeStep.set('modifyLoginInfo');
    //   return;
    // }

    if (this.submit.observed) {
      return this.submit.emit(Promise.resolve(true));
    }
    this.redirectToDashboard();
  };

  onModifyLoginInfo = () => {
    if (this.submit.observed) {
      return this.submit.emit(Promise.resolve(true));
    }
    this.redirectToDashboard();
  };

  private redirectToDashboard() {
    let redirectUrl = this.redirectUrl;

    if (!redirectUrl) {
      switch (this.selectedRole()) {
        case 'ADMIN':
          redirectUrl = '/super_admin';
          break;
        case 'PROVIDER':
          redirectUrl = '/provider';
          break;
        case 'PARTNER':
          redirectUrl = '/partner';
          break;
        case 'CONSUMER':
          if (this.accountRole() === 'OPERATOR') {
            redirectUrl = config.isPosApplication ? '/' : '/pos';
          } else {
            redirectUrl = '/consumer';
          }
          break;
      }
    }
    this.router.navigateByUrl(redirectUrl);
  }
}
