import { EitService } from "./../eit/services/eit.service";
import { Component, OnInit } from "@angular/core";
import { TranslatorService } from "src/app/hmg-common/services/translator/translator.service";
import { MenuController, Events, ActionSheetController } from "@ionic/angular";
import { AuthenticationService } from "src/app/hmg-common/services/authentication/authentication.service";
import { AuthenticatedUser } from "src/app/hmg-common/services/authentication/models/authenticated-user";
import { MenuService } from "src/app/hmg-common/services/menu/menuservice.service";
import { MenuResponse } from "src/app/hmg-common/services/menu/models/menu-response";
import { CommonService } from "src/app/hmg-common/services/common/common.service";
import { Geolocation } from "@ionic-native/geolocation/ngx";
import { ZBar, ZBarOptions } from "@ionic-native/zbar/ngx";
import { BarcodeScanner } from '@ionic-native/barcode-scanner/ngx';
import { Device } from "@ionic-native/device/ngx";
import { attendanceSwipeScannerRequest } from "./models/attendanceSwipe.Request";
import { Response } from "src/app/hmg-common/services/models/response";
import { AttendanceService } from "./services/attendance.services";
import { LoginRequest } from "../hmg-common/services/authentication/models/login.request";
import {FileUploaderComponent} from '../hmg-common/ui/file-uploader/file-uploader.component'
import { Camera, CameraOptions,PictureSourceType} from "@ionic-native/Camera/ngx";
//import { FileChooser } from "@ionic-native/file-chooser/ngx";
import { File } from "@ionic-native/file/ngx";
import { DomSanitizer } from '@angular/platform-browser';
//import { FilePath } from "@ionic-native/file-path/ngx";
//import { Base64 } from "@ionic-native/base64/ngx";
import {FileUploderProfileComponent} from '../hmg-common/ui/file-uploder-profile/file-uploder-profile.component'
import { SharedDataService } from '../hmg-common/services/shared-data-service/shared-data.service';
import { DevicePermissionsService } from '../hmg-common/services/device-permissions/device-permissions.service';

@Component({
  selector: "app-home",
  templateUrl: "./home.page.html",
  styleUrls: ["./home.page.scss"]
})
export class HomePage implements OnInit {
  userData: any = {};
  user_image: any = "../assets/imgs/profile.png";
  menuList: any = [];
  zbarOptions: any;
  scannedResult: any;
  notBadge: any;
  lat: any;
  longt: any;
  deviceID: string;
  public maxFileSize =10 * 1024 * 1024;
  public fileUploder :FileUploaderComponent;
 // public fileUploderProfile:FileUploderProfileComponent
  location: boolean;
  camera: boolean
  constructor(
    public ts: TranslatorService,
    public menu: MenuController,
    public authService: AuthenticationService,
    public menuService: MenuService,
    public common: CommonService,
    public events: Events,
    private device: Device,
    private zbar: ZBar,
    private geolocation: Geolocation,
    private attendance_service: AttendanceService,
    private eitService: EitService,
    private barcodeScanner: BarcodeScanner,
    public actionSheetCtrl: ActionSheetController,
    private cameraController: Camera,
    public sharedData: SharedDataService,
    private sanitizer: DomSanitizer,
    //private transfer: Transfer, 
    private file: File, 
    //private filePath: FilePath
    private permissions: DevicePermissionsService

  ) {
    this.events.subscribe("img-change", displayImg => {
      
     // this.user_image = "data:image/jpeg;base64"+displayImg;
     // alert("home app: ");
      this.user_image = this.sanitizer.bypassSecurityTrustUrl("data:Image/*;base64,"+displayImg);
      console.log("html saved img: "+this.user_image);
    });
   }

  
  ngOnInit() {
    this.getUserDetails();
    this.getMenu();
    this.setServicesPrivilage();

    this.getCount();

 
    this.events.subscribe("getNotCount", badge => {
      this.notBadge = badge;
    });
  }


  getDeviceLocation() {
    let isVirtual = this.device.isVirtual;
    if(isVirtual==true){
      alert("emulater>>>>>>>"+isVirtual);
      alert("You are using virtual device");
      return false;
    }
   
    this.permissions.requestLocationAutherization().then(granted => {
      this.location = granted as boolean;
      if (this.location) {
        this.geolocation
          .getCurrentPosition({ maximumAge: 3000, timeout: 10000, enableHighAccuracy: true })
          .then(resp => {
          //  console.log(resp.coords.latitude);
           // console.log(resp.coords.longitude);
            this.lat = resp.coords.latitude;
            this.longt = resp.coords.longitude;
            this.attendance();
          })
          .catch(error => {
            console.log("Error getting location", error);
          });
     
      } else {
        return false;
      }
    });

  }


  setServicesPrivilage() {
    for (let i = 0; i < AuthenticationService.servicePrivilage.length; i++)
      if (AuthenticationService.servicePrivilage[i].Previlege == false) {
        document.getElementById(AuthenticationService.servicePrivilage[i].ServiceName).setAttribute("disabled", "disabled");
        document.getElementById(AuthenticationService.servicePrivilage[i].ServiceName).style.filter = "grayscale(1)"
      }
  }
  getCount() {
    const req: any = {};
    this.menuService.getNotificationCount(req).subscribe((result: any) => {
      if (this.common.validResponse(result)) {
        this.notBadge =
          result.GetOpenNotificationsNumList.P_OPEN_NOTIFICATIONS_NUM;
        if (this.notBadge <= 0) {
          this.notBadge = null;
        }
        this.events.publish("getNotCount", this.notBadge);
      }
    });
  }
  // ionViewDidLoad() {
  //   this.geolocation
  //     .getCurrentPosition()
  //     .then(resp => {
  //       // resp.coords.latitude
  //       // resp.coords.longitude
  //       console.log(resp.coords.latitude);
  //       console.log(resp.coords.longitude);
  //     })
  //     .catch(error => {
  //       console.log("Error getting location", error);
  //     });
  //   this.geolocation.getCurrentPosition().then((resp) => {
  //     // resp.coords.latitude
  //     // resp.coords.longitude
  //     console.log(resp.coords.latitude);
  //     console.log(resp.coords.longitude);
  //   }).catch((error) => {
  //     console.log('Error getting location', error);
  //   });
  // }

  ionViewDidLoad() {
    this.getUserDetails();
    console.log("getUserDetails");
    this.geolocation
      .getCurrentPosition()
      .then(resp => {
        // resp.coords.latitude
        // resp.coords.longitude
        //console.log("Loc 1");
        console.log(resp.coords.latitude);
        console.log(resp.coords.longitude);
        this.lat = resp.coords.latitude;
        this.longt = resp.coords.longitude;
      })
      .catch(error => {
        console.log("Error getting location", error);
      });
  }
  private openMenu() {
    this.menu.toggle();
  }
  private getUserDetails() {
    this.authService
      .loadAuthenticatedUser()
      .subscribe((user: AuthenticatedUser) => {
        if (user) {
          this.events.publish("setMenu");
          this.userData = user;
          //set User Info
          this.sharedData.setSharedData(this.userData, AuthenticatedUser.SHARED_DATA);
          this.user_image = user.EMPLOYEE_IMAGE
            ? "data:image/png;base64," + user.EMPLOYEE_IMAGE
            : this.user_image;
          console.log(user);
        } else {
          console.log(user);
        }
      });
  }
  public Vacation_Rule() {
    this.common.navigateForward("/vacation-rule/home");
  }
  private getMenu() {
    this.menuService.getMenu().subscribe((result: MenuResponse) => {
      this.handleMenuResult(result);
    });
  }
  private handleMenuResult(result) {
    if (this.common.validResponse(result)) {
      if (this.common.hasData(result.List_Menu)) {
        console.log("list menu");
        this.menuList = result.List_Menu;
      }
    }
  }
  private accrualBalance() {
    this.common.openAccuralPage();
  }

  private changeImage() {
    this.common.openChangeImagePage();
  }

  public getMeunDetails(index) {
    let item = this.menuList[index];
    let selMenu: MenuResponse = new MenuResponse();
    selMenu.List_Menu = item;
    selMenu.userid = this.userData.EMPLOYEE_NUMBER;
    console.log("menu: "+selMenu.List_Menu);
    this.common.sharedService.setSharedData(selMenu, MenuResponse.SHARED_DATA);
    if (item.MENU_TYPE == "M") {
      this.common.openMyTeamPage();
      // this.navCtrl.push("MySubordinatePage");
    } else if (item.MENU_TYPE == "S") {
      this.common.sharedService.setSharedData(item, 'mySpecList');
      this.common.openMySpecialistPage();
      //this.navCtrl.push('MySpecialistPage',{"mySpecList":item});
    } else {
      this.getMenuEntries(item);
    }
  }

  getMenuEntries(item) {
    let request: any = {};
    let selEmpNo: string = null;
    let nationality: string = null;
    request.P_SELECTED_RESP_ID = -999;
    if (item.MENU_TYPE == "S") {
      request.P_SELECTED_RESP_ID = item.RESP_ID;
    } else {
      selEmpNo = this.common.sharedService.getSharedData(
        LoginRequest.SHARED_DATA,
        false
      );
    }
    nationality = this.common.sharedService.getSharedData(
      LoginRequest.NATIONALITY_CODE,
      false
    );
    request.P_SELECTED_EMPLOYEE_NUMBER = selEmpNo;
    request.P_MENU_TYPE = item.MENU_TYPE;
    request.NationalityCode = nationality;
    //set emp and resp id
    console.log("set data");
    this.common.sharedService.setSharedData(
      selEmpNo,
      MenuResponse.SHARED_SEL_EMP
    );
    this.common.sharedService.setSharedData(
      request.P_SELECTED_RESP_ID,
      MenuResponse.SHARED_SEL_RESP_ID
    );

    this.eitService
      .getMenuEntries(request)
      .subscribe((result: MenuResponse) => {
        this.handleMenuEntiresResult(result);
      });
  }

  sortMenuEntires(list) {
    let tree = this.common.list_to_tree(list);
    this.common.sharedService.setSharedData(tree, "menuEntries");
    // this.common.navigateForward("/eit/homepage");
    this.common.openEITPage();
  }

  private handleMenuEntiresResult(result) {
    if (this.common.validResponse(result)) {
      if (this.common.hasData(result.GetMenuEntriesList)) {
        this.sortMenuEntires(result.GetMenuEntriesList);
      }
    }
  }

  private Change_password() {
    this.common.openChangePassword();
  }
  private openPayslip() {
    this.common.openPayslipPage();
  }
  private attendance() {
    // this.zbarOptions = {
    //   flash: "off",
    //   drawSight: false
    // };
    //console.log("your currnt location is");
    //console.log("Loc");
      this.permissions.requestCameraAutherization().then(granted => {
        this.camera = granted as boolean;
        if (this.camera) {
          this.scanCode();
        }
      }
      );
  }

  scanCode() {
    // this.zbar
    //   .scan(this.zbarOptions)
    //   .then(result => {
    //     console.log(result); // Scanned code
    //     let strResult = JSON.parse(result);
    //     console.log(strResult.QRValue);
    //     this.scannedResult = result;
    //     this.deviceID = this.device.uuid;
    //     this.swipeAttendance();
    //   })
    //   .catch(error => {
    //     alert(error); // Error message
    //   });

    this.barcodeScanner.scan().then(barcodeData => {
      console.log('Barcode data', barcodeData);
      // let strResult = JSON.parse(barcodeData);
      // console.log(strResult.QRValue);
      this.scannedResult = barcodeData;
      this.deviceID = this.device.uuid;
      this.swipeAttendance();
    }).catch(err => {
      console.log('Error', err);
    });
  }

  swipeAttendance() {
    let request: attendanceSwipeScannerRequest = new attendanceSwipeScannerRequest();
    request.Latitude = this.lat;
    request.Longitude = this.longt;
    request.QRValue = this.scannedResult.text;
    request.UID = this.deviceID;
    request.UserName = this.userData.EMPLOYEE_NUMBER;
    console.log("request");
    console.log(JSON.stringify(request));
    this.attendance_service
      .attendanceSwipeScanner(request, () => {
        console.log("Error inside in swipe attendance");
      })
      .subscribe((result: Response) => {
        if (this.common.validResponse(result)) {
          console.log("response");
          console.log(result);
          this.common.presentAlert(this.ts.trPK("home", "swipeAlertSuccess"));
        } else {
          this.common.presentAlert(this.ts.trPK("home", "swipeAlertFailed"));
        }
      });
  }
  openPersonalInfo() {
    this.common.openProfile();
  }
}
