import {Component, OnInit} from '@angular/core';
import {LocalStorageService} from '../../services/local-storage.service';
import {
    DATA,
    ROUTENAME,
    MENUNAME,
    CHILDMENUNAME,
    INIT_FLAG,
    ADMIN_INFO_OBJECT,
    TOKEN
} from '../../services/local-storage.namespace';
import {LoginService} from '../../services/login.service';
import {NzMessageService, NzModalService} from 'ng-zorro-antd';
import {Router} from '@angular/router';
import {IconService} from '../../services/icon.service';
import {CommonsService} from '../../services/commons.service';
import {FormBuilder, FormControl, FormGroup, Validators} from '@angular/forms';
import {ValidatorsService} from '../../services/validators.service';
import {Md5} from 'ts-md5';
import {environment} from '../../../environments/environment';
import {HttpClient} from '@angular/common/http';
import {CompanyTwoPwdService} from '../../services/company-two-pwd.service';

@Component({
    selector: 'app-navigation',
    templateUrl: './navigation.component.html',
    styleUrls: ['./navigation.component.less']
})
export class NavigationComponent implements OnInit {

    visibleUpdatePwd = false;  // 修改密码抽屉
    validateForm: FormGroup; // 定义表单
    passwordVisible = false;

    isCollapsed = false;
    userInfo: any;
    menuList: any;
    routeName: string;
    switchValue = false;

    constructor(
        private storage: LocalStorageService,
        private loginService: LoginService,
        private message: NzMessageService,
        private commonsService: CommonsService,
        private companyTwoPwdService: CompanyTwoPwdService,
        private http: HttpClient, // http请求
        private iconService: IconService,
        private modal: NzModalService,
        private common: CommonsService,
        private fb: FormBuilder, // 表单
        private router: Router,
    ) {
    }

    ngOnInit(): void {
        this.validateForm = this.fb.group({
            oldPassword: [null, [Validators.required, ValidatorsService.minLength(6), ValidatorsService.maxLength(16)]],
            newPassword: [null, [Validators.required, ValidatorsService.minLength(6), ValidatorsService.maxLength(16)]],
            checkNewPassword: [null, [Validators.required, this.checkPwd]],
        });

        this.routeName = this.storage.get(ROUTENAME) == null ? 'index' : this.storage.get(ROUTENAME);
        this.userInfo = this.storage.getList(ADMIN_INFO_OBJECT);
        this.commonsService.mappingSysNameOl('RECHARGE', data => {
            this.switchValue = data['return_data']['codeValue'] === '1';
        });
        this.menuList = this.storage.getList(ADMIN_INFO_OBJECT)['menuList']; // 定义菜单数据

    }


    public activeLi(routeName): void {
        this.routeName = routeName;
        this.storage.set(ROUTENAME, routeName);
    }

    // 菜单姓名
    public getRouteName(menuName, childMenuName): void {
        this.storage.set(MENUNAME, menuName);
        this.storage.set(CHILDMENUNAME, childMenuName);
    }

    // 登出
    public loginOut(): void {
        this.loginService.loginOut(data => {
            if (data.return_code === '000000') {
                this.storage.set(ADMIN_INFO_OBJECT, null);
                this.storage.set(INIT_FLAG, false);
                this.storage.set(TOKEN, null);
                this.router.navigateByUrl('/adminLogin').then();
            } else {
                this.message.warning(data.return_msg);
            }
        });
    }

    // 返回
    public getBack(): void {
        history.back();
    }

    clickSwitch(): void {
        this.switchValue = !this.switchValue;
        this.commonsService.updateDictionary('RECHARGE', this.switchValue === true ? '1' : '0', data => {
            if (data['return_code'] === '000000') {
                this.message.success(data['return_data']);
            } else {
                this.message.error(data['return_msg']);
            }
        });
    }

    // 打开抽屉
    openUpdatePwd(): void {
        this.visibleUpdatePwd = true;
    }

    // 关闭抽屉
    closeUser(): void {
        this.visibleUpdatePwd = false;
    }

    // 提交表单
    submitForm(value): void {
        // 表单验证
        // tslint:disable-next-line:forin
        for (const i in this.validateForm.controls) {
            this.validateForm.controls[i].markAsDirty();
            this.validateForm.controls[i].updateValueAndValidity();
        }
        if (this.validateForm.status == null || this.validateForm.status !== 'VALID') {
            this.modal.info({
                nzTitle: '提示',
                nzContent: '请正确填写必填信息',
            });
            return;
        }
        const timeNum = new Date().getTime();
        const signStr = 'userId=' + this.storage.get(ADMIN_INFO_OBJECT)['secUser'].id + '&newPassword=' + value.newPassword + '&nonceStr=' + timeNum;
        // 定义请求数据
        const params = {
            userId: this.storage.get(ADMIN_INFO_OBJECT)['secUser'].id,
            oldPassword: value.oldPassword,
            newPassword: value.newPassword,
            nonceStr: timeNum,
            sign: String(Md5.hashStr(signStr)).toLocaleUpperCase(),
        };
        this.http.post(environment.baseUrl + '/secUser/sendUserPass', params).subscribe(data => {
            if (data['return_code'] === '000000') {
                this.modal.success({
                    nzTitle: '提示',
                    nzContent: '密码修改成功',
                    nzOkText: '重新登录',
                    nzOkType: 'primary',
                    nzOnOk: () => this.loginOut()
                });
            } else {
                this.modal.warning({
                    nzTitle: '提示',
                    nzContent: data['return_msg'],
                    nzOkText: '取消',
                    nzOkType: 'primary',
                });
            }
            setTimeout(() => {
            }, 1000);
        }, error => {
            this.message.create('error', `未知错误！`);
        });
    }

    /**
     * 新密码校验两次密码是否一致
     * @param control
     */
    checkPwd = (control: FormControl): { [s: string]: boolean } => {
        if (!control.value) {
            return {required: true};
        } else if (control.value !== this.validateForm.controls.newPassword.value) {
            return {confirm: true, error: true};
        }
        return {};
    }


}
