import { ModalLimits } from './modal_limits';
import { User } from '../model/user';
import { updateState } from './decorators';
import { Component, ElementRef } from '@angular/core';
import { AppState } from '../app.service';
import { NotificationMessageData } from './types';

export interface ILimitsModal {
    loading: boolean;
    update(): Promise<void>;
}

@Component({
    selector: 'modal_limits_user',
    template: require('./../../templates/modal_limits.html'),
    styles: [
        require('../../styles/modal_limits.less'),
    ]
})
export class ModalLimitsUser extends ModalLimits implements ILimitsModal {
    row: User;

    constructor(appState: AppState, elementRef: ElementRef) {
        super(appState, elementRef);
    }

    loadEditing(row: User, provider?) {
        this.row = row;
        this._loadEditing(row, provider);
    }

    update() {
        let isReseller = this.row.isReseller;
        let loadUser = (isReseller)
            ? this.provider.usersRepo.loadReseller(this.row.username)
            : this.provider.usersRepo.loadUser(this.row.id);
        return loadUser.then(({user, response}) => {
            this.row.loadData(response, 0);
            this._loadEditing(this.row);
        });
    }

    save_changing() {
        this.changing_status = false;
        switch (this.changing_type) {
            case 'cagefs':
                this.toggleCagefs();
                break;
            case 'mysql':
                this.toggleMysql();
                break;
            case 'reset':
                this.reset();
                break;
            case 'unlim':
                this.unlimited();
                break;
            case 'switchLimits':
                this.switchLimitsForReseller(this.stringNSSOL);
                break;
            default:
                this.save();
                break;
        }
    }

    @updateState
    toggleMysql() {
        this.row['mysql_gov'] = this.is_mysql ? 'ignored' : 'watched';
        return this.provider.toggleMySQL(this.row);
    }

    @updateState
    reset() {
        return this.provider.reset(this.row);
    }

    @updateState
    unlimited() {
        return this.provider.doNotLimit(this.row);
    }

    @updateState
    toggleCagefs() {
        this.row['cagefs'] = this.is_cagefs ? 'disabled' : 'enabled';
        return this.provider.toggleCageFS(this.row);
    }

    switchLimitsForReseller(status: string) {
        this.loading = true;
        return this.provider.switchLimitsForReseller(status, this.row);
    }

    private _loadEditing(row: User, provider?) {
        this.columns = Object.keys(row.cells);
        if (provider) this.provider = provider;
        this.type = 'user';
        this.resellerWarningMessage = [{
            title: 'WARNING.UserOfResellerManageWarning.title',
            description: 'WARNING.UserOfResellerManageWarning.description'
        }];
        this.is_cagefs = row.cagefs === 'enabled';
        this.is_mysql = row.mysql_gov === 'watched';
        this.notSavedStatusOfLimits = row.enabledLimits;
        this.currentConfirmationMessage = this.getConfirmationMessage('default');
        this.prepareLines();
    }
}
