import { Component, Injector, ViewChild, ViewEncapsulation } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { appModuleAnimation } from '@shared/animations/routerTransition';
import { AppComponentBase } from '@shared/common/app-component-base';
import {
    CreateOrUpdateContactUserInput, DriversServiceProxy,
    LocationServiceProxy, CreateLocationInput, UpdateLocationInput,
    UserLocationServiceProxy, CreateUserLocationInput, UpdateUserLocationInput,
    PasswordComplexitySetting, UserRoleDto, UserEditDto,
    CreateContactUserAddressInput, CreateAddressInput,
    CreateContactInput, CreatePhoneInput, CreateEmailInput,
    ContactServiceProxy, AddressTypeServiceProxy, PostalCodeServiceProxy,
    EmailServiceProxy, PhoneServiceProxy, ProfileServiceProxy, AddressServiceProxy
} from '@shared/service-proxies/service-proxies';
import { LazyLoadEvent } from 'primeng/components/common/lazyloadevent';
import { finalize } from 'rxjs/operators';
import * as moment from 'moment';
import * as _ from 'lodash';
import { ContactFormComponent } from '@app/shared/layout/form/contact.form.component';
import { AddressFormComponent } from '@app/shared/layout/form/address-form.component';
declare var KTWizard: any;
declare var $: any;
declare var KTApp: any;
declare let swal: any;

@Component({
    templateUrl: './create-driver.component.html',
    encapsulation: ViewEncapsulation.None,
    animations: [appModuleAnimation()]
})
export class CreateDriverComponent extends AppComponentBase {

    @ViewChild(ContactFormComponent, { static: false }) contactForm;
    @ViewChild(AddressFormComponent, { static: false }) addressForm;

    active = false;
    saving = false;
    id: any;

    driver: UserEditDto = new UserEditDto();
    contact: CreateContactUserAddressInput = new CreateContactUserAddressInput();
    address: CreateAddressInput = new CreateAddressInput();
    contactInput: CreateContactInput = new CreateContactInput();


    defaultLocation: any;
    selectedLocation: any;
    location: any;
    filteredLocations: any;
    getUserLocationId: any;
    getAddressId: any;
    getLocationId: any;

    defaultAddressType: any;
    defaultCountry: any;
    defaultState: any;
    defaultPostal: any;
    defaultCity: any;

    selectedAddressType: any;
    selectedCountry: any;
    selectedPostalCode: any;
    selectedState: any;
    selectedCity: any;

    country: any;
    filteredCountries: any;
    city: any;
    filteredCities: any;
    state: any;
    filteredStates: any;
    postal: any;
    filteredPostal: any;
    addressType: any;
    filteredAddressType: any;

    canChangeUserName = true;
    isActive = true;
    isTwoFactorEnabled: boolean = false //this.setting.getBoolean('Abp.Zero.UserManagement.TwoFactorLogin.IsEnabled');
    isLockoutEnabled: boolean = false //this.setting.getBoolean('Abp.Zero.UserManagement.UserLockOut.IsEnabled');
    passwordComplexitySetting: PasswordComplexitySetting = new PasswordComplexitySetting();
    roles: UserRoleDto[];
    sendActivationEmail = false;
    setRandomPassword = false;
    passwordComplexityInfo = '';

    addressCheckBox = false;
    requiredState = true;

    constructor(
        injector: Injector,
        private _locationService: LocationServiceProxy,
        private _driverService: DriversServiceProxy,
        private _userLocationService: UserLocationServiceProxy,
        private _contactService: ContactServiceProxy,

        // private _countryService: CountryServiceProxy,
        // private _cityService: CityServiceProxy,
        // private _stateService: StateServiceProxy,

        private _addressTypeService: AddressTypeServiceProxy,
        private _postalCodeService: PostalCodeServiceProxy,
        private _profileService: ProfileServiceProxy,
        private _addressService: AddressServiceProxy,
        private _emailService: EmailServiceProxy,
        private _phoneService: PhoneServiceProxy,
        private router: Router,
        private route: ActivatedRoute
    ) {
        super(injector);
    }

    setPasswordComplexityInfo(): void {

        this.passwordComplexityInfo = '<ul>';

        if (this.passwordComplexitySetting.requireDigit) {
            this.passwordComplexityInfo += '<li>' + this.l('PasswordComplexity_RequireDigit_Hint') + '</li>';
        }

        if (this.passwordComplexitySetting.requireLowercase) {
            this.passwordComplexityInfo += '<li>' + this.l('PasswordComplexity_RequireLowercase_Hint') + '</li>';
        }

        if (this.passwordComplexitySetting.requireUppercase) {
            this.passwordComplexityInfo += '<li>' + this.l('PasswordComplexity_RequireUppercase_Hint') + '</li>';
        }

        if (this.passwordComplexitySetting.requireNonAlphanumeric) {
            this.passwordComplexityInfo += '<li>' + this.l('PasswordComplexity_RequireNonAlphanumeric_Hint') + '</li>';
        }

        if (this.passwordComplexitySetting.requiredLength) {
            this.passwordComplexityInfo += '<li>' + this.l('PasswordComplexity_RequiredLength_Hint', this.passwordComplexitySetting.requiredLength) + '</li>';
        }

        this.passwordComplexityInfo += '</ul>';
    }


    ngOnInit() {
        $('.kt-select2').select2({
            placeholder: "Select.."
        });
        this.route.paramMap.subscribe(params => {
            this.id = params.get("id")
        })
        // this.KTWizard2();
        // $('#addressCheckbox').prop('checked', false);
        // $('#address').fadeOut('slow');

        $("#addressTypeSelectInput").change(function () {
            this.selectedAddressType = $("#addressTypeSelectInput option:selected").text();
            $("#selectedAddressType").text(this.selectedAddressType);
        });

        $("#countrySelectInput").change(function () {
            this.selectedCountry = $("#countrySelectInput option:selected").text();
            $("#selectedCountry").text(this.selectedCountry + ",");
        });

        $("#postalSelectInput").change(function () {
            this.selectedPostalCode = $("#postalSelectInput option:selected").text();
            $("#selectedPostalCode").text(this.selectedPostalCode + ",");
        });

        $("#stateSelectInput").change(function () {
            this.selectedState = $("#stateSelectInput option:selected").text();
            $("#selectedState").text(this.selectedState + ",");
        });
        $("#citySelectInput").change(function () {
            this.selectedCity = $("#citySelectInput option:selected").text();
            $("#selectedCity").text(this.selectedCity + ",");
        });
        $("#locationSelectInput").change(function () {
            this.selectedCity = $("#locationSelectInput option:selected").text();
            $("#locationSelected").text(this.selectedCity + "");
        });

        var KTWizard2 = function () {
            var e, r, i;
            return {
                init: function () {
                    var t; KTUtil.get("kt_wizard_v2"), e = $("#kt_form"),
                        (i = new KTWizard("kt_wizard_v2",
                            { startStep: 1, clickableSteps: !0 })).on("beforeNext", function (e) { !0 !== r.form() && e.stop() }),
                        i.on("beforePrev", function (e) { !0 !== r.form() && e.stop() }), i.on("change", function (e) { KTUtil.scrollTop() }),
                        r = e.validate({
                            ignore: ":hidden",
                            rules: {
                                Name: { required: !0 },
                                Surname: { required: !0 },
                                EmailAddress: { required: !0, email: !0 },
                                locationSelectInput: { required: !0 },
                                UserName: { required: !0 },
                                Password: { required: !0, minlength: 5 },
                                PasswordRepeat: { required: !0,minlength: 5, equalTo:"#Password" },
                                Address1: { required: !0 },
                                postalSelectInput: { required: !0 },
                                countrySelectInput: { required: !0 },
                                stateSelectInput: { required: !0 },
                                citySelectInput: { required: !0 }
                            },
                            invalidHandler: function (e, r) {
                                KTUtil.scrollTop(), swal.fire({
                                    title: "", text: "There are some errors in your submission. Please correct them.",
                                    type: "error", confirmButtonClass: "btn btn-secondary"
                                })
                            },
                            submitHandler: function (e) { }
                        })
                }
            }
        }();
        jQuery(document).ready(function () { KTWizard2.init() });

    }

    ngAfterViewInit(userId?: number) {
        let maxcount = 1000;
        this.filterLocations(maxcount);

        // this.filterPostal(maxcount);
        // this.filterCountries(maxcount);
        // this.filterCities(maxcount);
        // this.filterStates(maxcount);

        this.filterAddressTypes(maxcount);

        $('#addressCheckbox').change(function () {
            if (!this.checked)
                $('#address').fadeOut('slow');
            else
                $('#address').fadeIn('slow');

        });

        this._driverService.getDriverForEdit(userId).subscribe(res => {
            this.driver = res.user;

            this._profileService.getPasswordComplexitySetting().subscribe(passwordComplexityResult => {
                this.passwordComplexitySetting = passwordComplexityResult.setting;
                this.setPasswordComplexityInfo();
            });
        });
    }

    save(): void {
        this.saving = true;
        if (this.contactForm.pNumber == null) {
            this.contactForm.pNumber = "n/a";
        }
        let userInput = new CreateOrUpdateContactUserInput({
            user: new UserEditDto({
                id: this.driver.id,
                name: this.contactForm.fName,
                surname: this.contactForm.sName,
                userName: this.driver.userName,
                password: this.driver.password,
                phoneNumber: this.contactForm.pNumber,
                emailAddress: this.contactForm.emailAddress,
                isLockoutEnabled: false,
                isActive: this.isActive,
                isTwoFactorEnabled: this.isTwoFactorEnabled,
                shouldChangePasswordOnNextLogin: false
            }),
            assignedRoleNames: _.map(
                _.filter(this.roles, { isAssigned: true }), role => role.roleName
            ),
            sendActivationEmail: this.sendActivationEmail,
            setRandomPassword: this.setRandomPassword,
            location: $("#locationSelectInput").val()
        });
        this.requiredState = false
        this._driverService.createOrUpdateDriver(userInput)
            .pipe(finalize(() => {
                this.saving = false;
            }))
            .subscribe(success => {
                this.requiredState;
                this.address = this.addressForm.address;
                this.address.postalCodeId = Number((<HTMLInputElement>document.getElementById('postalSelectInput')).value);
                if (Number((<HTMLInputElement>document.getElementById('addressTypeSelectInput')).value) == 0) {
                    this.address.addressTypeId = null;
                }
                else {
                    this.address.addressTypeId = Number((<HTMLInputElement>document.getElementById('addressTypeSelectInput')).value);
                }
                this._addressService.createAddress(this.address)
                    .subscribe(
                        addressResult => {
                            console.log(addressResult);
                            this.contactInput.addressId = addressResult;
                            this.contactInput.firstName = this.contactForm.fName;
                            this.contactInput.lastName = this.contactForm.sName;
                            this.contactInput.userId = success;
                            this.contactInput
                            console.log(this.contactInput);
                            this._contactService.createContact(this.contactInput)
                                .pipe(finalize(() => {
                                    this.saving = false;
                                }))
                                .subscribe(() => {
                                    this.notify.info(this.l('SavedSuccessfully'));
                                    this.router.navigate(['/app/sprintship/drivers']);
                                    console.log(this.contactInput);
                                });
                        });
            });
    }

    filterLocations(maxcount): void {
        this._locationService.getLocation(
            undefined,
            undefined,
            undefined,
            undefined,
            undefined,
            maxcount,
            undefined
        ).subscribe(result => {
            this.filteredLocations = result.items;
        });
    }

    getLocation(id): void {
        this._locationService.getLocation(
            id,
            undefined,
            undefined,
            undefined,
            undefined,
            undefined,
            undefined
        ).subscribe(result => {
            this.getLocationId = result.items[0].contact.address.id;
        });
    }

    getUserlocation(id): void {
        this._userLocationService.getUserLocation(
            undefined,
            id,
            undefined,
            undefined,
            undefined,
            undefined,
            undefined,
            undefined,
            1,
            undefined
        ).subscribe(result => {
            this.getUserLocationId = result.items[0].locationId;
            console.log(this.getUserLocationId + "sa");
            this.getAddressId = this.getLocation(this.getUserLocationId);
            console.log(this.getAddressId + "saa");

        });
    }

    filterAddressTypes(maxCount): void {
        this._addressTypeService.getAddressType(
            undefined,
            undefined,
            undefined,
            maxCount,
            undefined
        ).subscribe(result => {
            this.filteredAddressType = result.items;
        });
    }
    // Class definition
    KTWizard2(): void {
        // Base elements
        var wizardEl;
        var formEl;
        var validator;
        var wizard;

        function validateEmail(sEmail) {
            var filter = /^\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b$/i;
            if (filter.test(sEmail)) {
                return true;
            }
            else {
                return false;
            }
        }

        // Private functions
        var initWizard = function () {
            // Initialize form wizard
            wizard = new KTWizard('kt_wizard_v2', {
                startStep: 1,
            });

            // Validation before going to next page
            wizard.on('beforeNext', function (wizardObj) {
                if (wizardObj.currentStep == 1) {
                    if ($('#Name').val() == ''
                        || ($('#Surname').val() == '')
                        // || ($('#PhoneNumber').val() == ''||  $('#minutesPerStopInput').val()==0) 
                        || $('#EmailAddress').val() == ''
                        || $('#UserName').val() == ''
                        || $('#Password').val() == ''
                        || $('#PasswordRepeat').val() == ''
                    ) {
                        wizardObj.stop();  // don't go to the next step
                    }
                    if (!validateEmail($('#EmailAddress').val())) {
                        wizardObj.stop();
                    }
                } else if (wizardObj.currentStep == 2) {
                    if ($('#locationSelectInput').val() == null || $('#locationSelectInput').val() == 0
                        || $('#address1').val() == ''
                        || ($('#countrySelectInput').val() == null || $('#countrySelectInput').val() == 0)
                        || ($('#postalSelectInput').val() == null || $('#postalSelectInput').val() == 0)
                        || ($('#stateSelectInput').val() == null || $('#stateSelectInput').val() == 0)
                        || ($('#citySelectInput').val() == null || $('#citySelectInput').val() == 0)
                        // || ($('#addressTypeSelectInput').val() == null || $('#addressTypeSelectInput').val() == 0)
                    ) {
                        wizardObj.stop();  // don't go to the next step
                    }
                }
            });
            // Change event
            wizard.on('change', function (wizard) {
                KTUtil.scrollTop();
            });
        }
        wizardEl = KTUtil.get('kt_wizard_v2');
        formEl = $('#kt_form').serialize();

        return initWizard();
        //return initValidation();
        //return initSubmit();
    }
}
