import { Component, OnInit, NgZone, OnDestroy } from "@angular/core";
import { CommonService } from "src/app/hmg-common/services/common/common.service";
import { AuthenticationService } from "src/app/hmg-common/services/authentication/authentication.service";
import { Router } from "@angular/router";
import { AlertController, Platform } from "@ionic/angular";
import { TranslatorService } from "src/app/hmg-common/services/translator/translator.service";
import { CheckUserAuthenticationResponse } from "src/app/hmg-common/services/authentication/models/check-user-auth.response";
import { SmsReaderService } from "src/app/hmg-common/services/sms/sms-reader.service";
import { FingerprintAIO } from "@ionic-native/fingerprint-aio/ngx";
import { Device } from "@ionic-native/device/ngx";
import { SplashScreen } from "@ionic-native/splash-screen/ngx";
import { SharedDataService } from "src/app/hmg-common/services/shared-data-service/shared-data.service";
import { LoginModel } from "../models/LoginModel";
import { LoginRequest } from "src/app/hmg-common/services/authentication/models/login.request";
import { Password } from '../models/password';
import { CheckUserAuthenticationRequest } from 'src/app/hmg-common/services/authentication/models/check-user-auth.request';
import { CheckAppVersionResponse } from 'src/app/hmg-common/services/authentication/models/check-app-version.response';

@Component({
    selector: "login",
    templateUrl: "./login.component.html",
    styleUrls: ["./login.component.scss"]
})
export class LoginComponent implements OnInit, OnDestroy {
    appLang: number = 1;
    isExpired: boolean = false;
    isSupportAr: boolean = false;
    isAppleStore: boolean = false;
    memberLogin: any = {};
    private password: string;
    private language: string;
    private username: string;
    private remeberMe: boolean;
    private iosLink: string;
    private androidLink: string;
    private currentLang: any = 1;
    private patientOutSA: boolean;
    private loginTokenID: string;
    private isMobileFingerPrint: boolean;
    private FingerPrintPatientIdentificationID: string;
    private loginData = new LoginModel();

    constructor(
        public cs: CommonService,
        public authService: AuthenticationService,
        public router: Router,
        public alertController: AlertController,
        public ts: TranslatorService,
        public smsService: SmsReaderService,
        private faio: FingerprintAIO,
        public ngZone: NgZone,
        public device: Device,
        public splash: SplashScreen,
        public sharedData: SharedDataService,
        public plt: Platform
    ) { }

    ngOnInit() {

        this.username = localStorage.getItem("user");
        this.password = localStorage.getItem("password");
        let remember = localStorage.getItem("remember");
        if (remember == "true") { this.remeberMe = true } else { this.remeberMe = false }
        // alert("user>>" + this.username);
        // alert("pass>>>" + this.password);
        // alert("remember>>>" + this.remeberMe);

    }

    ngOnDestroy(): void {
        this.backClicked();
    }
    public changeLanguage() {
        this.ts.switchLanguage();
        if (TranslatorService.CURRENT_LANGUAGE == TranslatorService.EN) {
            this.language = "US";
        } else {
            this.language = "AR";
        }
        this.currentLang = TranslatorService.getCurrentLanguageCode();
    }
    private forgetPasswordPage() {
        this.cs.openUserForgot();
    }
    private hideSplashScreen(stopLoading = false) {
        // this.splash.hide();
        if (stopLoading) {
            this.cs.stopLoading();
        }
    }

    public addValue(e): void {
        // console.log(e.currentTarget.checked);	
        this.remeberMe = e.currentTarget.checked;
        this.remeberMyInfo();
    }
    public remeberMyInfo() {
        if (this.remeberMe) {
            if(this.username){localStorage.setItem("user", this.username);}
            if(this.password){localStorage.setItem("password", this.password);}
            localStorage.setItem("remember", "true");
        } else {
            localStorage.setItem("user", "");
            localStorage.setItem("password", "");
            localStorage.setItem("remember", "false");
        }
    }

    public onLogin() {
        this.checkAppUpdated();
       // this.checkUserAuthentication();
    }

    public checkAppUpdated() {
        this.authService.checkApplicationVersion(
            () => {
                /* Write code for error */
            }).subscribe((result: CheckAppVersionResponse) => {
                if (result.MessageStatus == 2 && result.ErrorType == 4) {
                    this.cs.presentAcceptDialog(result.ErrorEndUserMessage,()=>{
                        this.handleAppUpdate(result)
                    });
                } else if (result.MessageStatus == 1) {
                   this.checkUserAuthentication();
                }
            });
    }

    private handleAppUpdate(result){
        this.iosLink = result.IOSLink;
        this.androidLink = result.AndroidLink;
        if (this.plt.is('android')) {
            if (this.androidLink)
                window.open(this.androidLink, '_system');
        }
        else if (this.plt.is('ios')) {
            if (this.iosLink)
                window.open(this.iosLink, '_system');
        }
    }

    private checkUserAuthentication() {
        console.log("debug Here!!");
        this.cs.startLoading();
        const request = new LoginRequest();
        request.P_USER_NAME = this.username;
        request.P_LANGUAGE = this.language;
        request.P_PASSWORD = this.password;
        console.log(request);
        this.authService
            .login(request, () => {
                console.log("error here");
                //console.log(result.MessageStatus);
                //this.sharedData.setSharedData(true, Password.IS_EXPIRED_PSW);
                //this.userCheck();
            }, this.ts.trPK("general", "ok"))
            .subscribe((result: CheckUserAuthenticationResponse) => {
                console.log("success");
                this.cs.stopLoading();
                if (this.cs.validResponse(result)) {
                    this.loginData.LogInTokenID = result.LogInTokenID;
                    this.loginData.MobileNumber = result.MemberLoginList.P_MOBILE_NUMBER;
                    this.loginData.P_USER_NAME = this.username;
                    this.sharedData.setSharedData(this.loginData, AuthenticationService.LOGIN_DATA);
                    this.cs.sharedService.setSharedData(this.loginData.P_USER_NAME, LoginRequest.SHARED_DATA);
                    this.remeberMyInfo();
                    //this.cs.openSMSPage(); phase#1 one type of OTP
                    this.cs.openConfirmLoginPage();//phase#2 add 4 types for OTP


                } else {
                    console.log("result.IsPasswordExpired");
                    console.log(result.IsPasswordExpired);
                    if (result.IsPasswordExpired) {
                        this.presentPasswordExpiredDialog();
                    }
                }
            });
    }

    public backClicked() {
        this.smsService.stopSMSMonitoring();
    }

    async presentPasswordExpiredDialog() {
        const alert = await this.alertController.create({
            header: this.ts.trPK("general", "confirm"),
            message: this.ts.trPK("login", "password-expired"),
            buttons: [
                {
                    text: this.ts.trPK("general", "ok"),
                    handler: () => {
                        console.log('Confirm Okay');
                        this.sharedData.setSharedData(true, Password.IS_EXPIRED_PSW);
                        this.userCheck();
                    }
                }
            ]
        });
        await alert.present();
    }

    public openForgotID() {
        this.cs.openUserForgot();
    }

    public userCheck() {
        this.cs.startLoading();
        const request = new CheckUserAuthenticationRequest();
        request.P_USER_NAME = this.username;
        this.authService.checkUserAuthentication(
            request,
            () => {
                /* Write code for error */
            }, this.ts.trPK('general', 'ok')).subscribe((result: CheckUserAuthenticationResponse) => {
                if (this.cs.validResponse(result)) {
                    this.checkUserResult = result;
                    this.cs.stopLoading();
                    this.sendSMSForForgotPassword();
                }
            });
    }

    private checkUserResult: CheckUserAuthenticationResponse;

    private sendSMSForForgotPassword() {
        this.cs.startLoading();
        let changePwdObj = new LoginRequest();
        changePwdObj.MobileNumber = this.checkUserResult.BasicMemberInformation.P_MOBILE_NUMBER;
        changePwdObj.P_USER_NAME = this.username;
        changePwdObj.P_MOBILE_NUMBER = this.checkUserResult.BasicMemberInformation.P_MOBILE_NUMBER;
        this.authService.sendPublicSMS(
            changePwdObj,
            () => {
                //this.sendSMSForForgotPassword();
                /* Write code for error */
            }, this.ts.trPK('general', 'ok')).subscribe((result: CheckUserAuthenticationResponse) => {
                if (this.cs.validResponse(result)) {
                    this.checkUserResult = result;
                    console.log("2");
                    console.log(result);
                    this.loginData.LogInTokenID = result.LogInTokenID;
                    this.loginData.P_USER_NAME = this.username;
                    this.cs.sharedService.setSharedData(this.loginData.P_USER_NAME, LoginRequest.SHARED_DATA);
                    this.sharedData.setSharedData(this.loginData, AuthenticationService.LOGIN_DATA);
                    this.sharedData.setSharedData(true, Password.IS_FORGET_PSW);
                    this.cs.stopLoading();
                    this.cs.openSMSPage();
                }
            });
    }

}
