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, Events } 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';
import { PushService } from 'src/app/hmg-common/services/push/push.service';

@Component({
    selector: 'login',
    templateUrl: './login.component.html',
    styleUrls: ['./login.component.scss']
})
export class LoginComponent implements OnInit, OnDestroy {
    deviceToken1: any;

    constructor(
        public cs: CommonService,
        public authService: AuthenticationService,
        public router: Router,
        public alertController: AlertController,
        public ts: TranslatorService,
        public smsService: SmsReaderService,
        private faio: FingerprintAIO,
        public events: Events,
        public ngZone: NgZone,
        public device: Device,
        public splash: SplashScreen,
        public sharedData: SharedDataService,
        public plt: Platform,
        public pushService: PushService
    ) {
        this.events.subscribe('logoutFlage', logoutFlage => {
            console.log('login compont logoutFlage: ' + logoutFlage);
            // tslint:disable-next-line: triple-equals
            if (logoutFlage == true) {
              console.log(' subscribe check logoutFlage: ' + logoutFlage);
              this.logoutFlage = logoutFlage;
              localStorage.setItem('logoutFlage', logoutFlage);
            }
        });

        this.getuser = this.cs.sharedService.getSharedData(
            AuthenticationService.IMEI_USER_DATA,
            false
          );
         // alert(" this.getuser "+this.getuser);
        if (this.getuser) {
            this.user = true;

        } else {
            this.user = false;

        }
    }
    appLang = 1;
    isExpired = false;
    isSupportAr = false;
    isAppleStore = false;
    memberLogin: any = {};
    public password: string;
    private language: string;
    public username: string;
    public remeberMe = true;
    private iosLink: string;
    private androidLink: string;
    public currentLang = 1;
    private patientOutSA: boolean;
    private loginTokenID: string;
    private isMobileFingerPrint: boolean;
    private FingerPrintPatientIdentificationID: string;
    private loginData = new LoginModel();
    private empname: any;
    private logintype: any;
    public loginDiv = true;
    public welcomeBack = false;
    public logo = 'assets/icon/login/password.png';
    deviceToken: any = '';
    user = false;
    DeviceType: string;
    requestGetLoginInfo: any;
    logoutFlage: boolean ;
    getuser: any = '';
    getlastlogin: any;

    private checkUserResult: CheckUserAuthenticationResponse;

    ngOnInit() {
        // if(!this.cs.getIsTimeSessionOut()){
        //     this.getlastlogin = this.cs.sharedService.getSharedData(
        //         AuthenticationService.IMEI_USER_DATA,
        //         false
        //       );
        //        console.log("this.getlastlogin"+ this.getlastlogin);
        // }
        this.currentLang = TranslatorService.getCurrentLanguageCode();
        console.log(TranslatorService.CURRENT_LANGUAGE)
        console.log(TranslatorService.EN)
        if (TranslatorService.CURRENT_LANGUAGE == TranslatorService.EN) {
            this.language = "US";
            this.changeLanguage('2')
        } else {
            this.language = "AR";
            this.changeLanguage('1')
        }
        console.log("current lang: "+this.currentLang)
        //this.ts.switchLanguage();
    //     this.deviceToken= this.cs.sharedService.getSharedData(AuthenticationService.DEVICE_TOKEN, false);
    //   console.log("get deviceToken login"+ this.deviceToken)


        // this.getuser = this.cs.sharedService.getSharedData(
        //     AuthenticationService.IMEI_USER_DATA,
        //     false
        //   );

        // if(this.getuser){
        //     console.log("this.getuser"+this.getuser);
        //     this.logoutFlage = true;

        // }

        this.events.subscribe('user', user => {
          this.user = user;
        });

        //this.deviceToken =  localStorage.getItem('devicyeToken');
        //this.deviceToken1 =this.cs.getDeviceToken();
        
          console.log(" this.user login in init" +  this.user);
        //this.deviceToken =  localStorage.getItem('devicyeToken');
        this.deviceToken =this.cs.getDeviceToken();


        console.log('lngOnInit localStorage: ' + this.deviceToken1);
        console.log('lngOnInit getDeviceToken: ' + this.deviceToken);

        if (this.deviceToken) {
            console.log('login enabled first time: ' + this.deviceToken);
       } else {
        console.log('no deviceToken' );
        this.pushService.startReceiving();
       }

          // here will delete below part and depdding on user (response from getMobileInfo)
        this.username = localStorage.getItem('user');
        this.password = localStorage.getItem('password'); // ****//
        const remember = localStorage.getItem('remember'); // ****//
        this.empname =  localStorage.getItem('emp-name');
        this.logintype = localStorage.getItem('login-type');
        // tslint:disable-next-line: triple-equals
        if (remember == 'true') { this.remeberMe = true ; } else { this.remeberMe = false; }
    }

    ngOnDestroy(): void {
        this.backClicked();
    }

    public changeLanguage(langNumber) {
        console.log("current lang: "+this.currentLang)
        console.log("click lang: "+langNumber)
        if(this.currentLang == langNumber){
            this.currentLang = langNumber;
            return;
        } else {
            this.ts.switchLanguage();
            // tslint:disable-next-line: triple-equals
            if (TranslatorService.CURRENT_LANGUAGE == TranslatorService.EN) {
                this.language = 'US';
            } else {
                this.language = 'AR';
            }
            this.currentLang = TranslatorService.getCurrentLanguageCode();
        }
        this.currentLang = langNumber;
    }
    public forgetPasswordPage() {
        this.cs.openUserForgot();
    }

    private hideSplashScreen(stopLoading = false) {
        // this.splash.hide();
        if (stopLoading) {
            this.cs.stopLoading();
        }
    }

    public addValue(e): void {
        this.remeberMe = true;
        this.remeberMyInfo();
    }
    public remeberMyInfo() {
            if (this.username) {localStorage.setItem('user', this.username); }
            if (this.password) {localStorage.setItem('password', this.password); }
            localStorage.setItem('remember', 'true');
    }

    public onLogin() {
    this.deviceToken = localStorage.getItem('deviceToken');
    if (this.deviceToken) {
            this.checkAppUpdated();
       } else {
        this.pushService.startReceiving();
        setTimeout(() => {
                this.deviceToken = localStorage.getItem('deviceToken');
                this.checkAppUpdated();
                console.log('login enabled second time: ' + this.deviceToken);
            }, 1000);
       }
    }

    public checkAppUpdated() {
        this.authService.checkApplicationVersion(
            () => {
                /* Write code for error */
            }).subscribe((result: CheckAppVersionResponse) => {
                // tslint:disable-next-line: triple-equals
                if (result.MessageStatus == 2 && result.ErrorType == 4) {
                    this.cs.presentAcceptDialog(result.ErrorEndUserMessage, () => {
                        this.handleAppUpdate(result);
                    });
                // tslint:disable-next-line: triple-equals
                } 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!!');
        console.log(this.username);
        console.log(this.language);
        console.log(this.password);

        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)) {
                    // alert("result.MemberLoginList.EMPLOYEE_NAME :" + result.MemberLoginList[0].EMPLOYEE_NAME);

                    this.loginData.LogInTokenID = result.LogInTokenID;
                    this.loginData.MobileNumber = result.MemberLoginList.P_MOBILE_NUMBER;
                    this.loginData.P_USER_NAME = this.username;
                    //  this.loginData.EMPLOYEE_NAME =result.MemberLoginList[0].EMPLOYEE_NAME;
                    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
                    // if(!this.welcomeBack){
                    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 sendSMSForForgotPassword() {
        this.cs.startLoading();
        const 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.loginData.EmployeeName =result.MemberLoginList[0].EMPLOYEE_NAME;

                    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();
                }
            });
    }

    login() {
        let anotherUser = this.sharedData.getSharedData('anotherUser');
        if(anotherUser){
            this.username = '';
            this.password = '';
        }
        console.log('login emit');
        console.log('login');
       // this.checkUserAuthentication();
        // this.loginDiv=true;
        this.user = false;
      }


      loginWithUser() {
        console.log('loginWithUser');
        this.cs.openConfirmLoginPage();
      }


      ///

      getLastLoginInfo() {
        this.requestGetLoginInfo = {
            DeviceType: this.cs.getDeviceType(), // "Android",//this.cs.getDeviceType(),
            DeviceToken: this.cs.getDeviceToken()// "5ca8a69cf1804db55264c349edffb99b9d63acd9fa9b6b18956bcb2ad3f2ba36"//this.deviceToken
        };
        this.authService.getLoginInfo(this.requestGetLoginInfo, () => {}, this.ts.trPK('general', 'ok')).subscribe(res => {
          if (this.cs.validResponse(res)) {

              if (res.Mohemm_GetMobileLoginInfoList.length > 0) {

            this.cs.sharedService.setSharedData(
            //   res.Patient_SELECTDeviceIMEIbyIMEIList[0],
             res.Mohemm_GetMobileLoginInfoList[0],
              AuthenticationService.IMEI_USER_DATA
            );
            this.user = true;

          } else {
            this.user = false;

          }
        }
        });
      }



}
