import {
    Component,
    ComponentFactoryResolver,
} from '@angular/core';
import { ActivatedRoute } from '@angular/router';

import { ApiService } from 'jslib/abstractions/api.service';
import { MessagingService } from 'jslib/abstractions/messaging.service';
import { UserService } from 'jslib/abstractions/user.service';

import { TwoFactorProviderType } from 'jslib/enums/twoFactorProviderType';

import { TwoFactorDuoComponent } from '../../settings/two-factor-duo.component';
import { TwoFactorSetupComponent as BaseTwoFactorSetupComponent } from '../../settings/two-factor-setup.component';

@Component({
    selector: 'app-two-factor-setup',
    templateUrl: '../../settings/two-factor-setup.component.html',
})
export class TwoFactorSetupComponent extends BaseTwoFactorSetupComponent {
    constructor(apiService: ApiService, userService: UserService,
        componentFactoryResolver: ComponentFactoryResolver, messagingService: MessagingService,
        private route: ActivatedRoute) {
        super(apiService, userService, componentFactoryResolver, messagingService);
    }

    async ngOnInit() {
        this.route.parent.parent.params.subscribe(async (params) => {
            this.organizationId = params.organizationId;
            await super.ngOnInit();
        });
    }

    manage(type: TwoFactorProviderType) {
        switch (type) {
            case TwoFactorProviderType.OrganizationDuo:
                const duoComp = this.openModal(this.duoModalRef, TwoFactorDuoComponent);
                duoComp.type = TwoFactorProviderType.OrganizationDuo;
                duoComp.organizationId = this.organizationId;
                duoComp.onUpdated.subscribe((enabled: boolean) => {
                    this.updateStatus(enabled, TwoFactorProviderType.OrganizationDuo);
                });
                break;
            default:
                break;
        }
    }

    protected getTwoFactorProviders() {
        return this.apiService.getTwoFactorOrganizationProviders(this.organizationId);
    }

    protected filterProvider(type: TwoFactorProviderType) {
        return type !== TwoFactorProviderType.OrganizationDuo;
    }
}
