/* Copyright CloudLinux Zug GmbH 2010-2017 All Rights Reserved
 *
 * Licensed under CLOUD LINUX LICENSE AGREEMENT
 * http://cloudlinux.com/docs/LICENSE.TXT
 */

import { Injectable } from '@angular/core';
import { UsersRepo } from '../repository/users_repo';
import { Access } from '../services/access';
import { User } from '../model/user';
import { AppState } from '../app.service';
import { ViewModes } from '../services/view_modes';

@Injectable()
export class UserEditActions {

    constructor (
        public appState: AppState,
        private viewModeService: ViewModes,
        private usersRepo: UsersRepo,
        private accessService: Access,
    ){}

    public saveCallback: Function = null;
    public closeCallback: Function = null;
    public globalCageFsStatus: boolean;
    public globalMySqlGov: boolean;


    private loadResponse(user: User, response) {
        if (this.appState.get('isAdmin')) {
            if (user.isReseller) {
                response.users = [];
                response.resellers = response.resellers.filter(
                    reseller => reseller.name === user.username
                );
            }
            this.viewModeService.concatResellerWithUser(response);
            this.viewModeService.detectUserTypes(response, ViewModes.availableModes);
        }
        for (let userData of response.users) {
          this.accessService.dropPermission(response, userData);
        }
        user.loadData(response, 0);
    }

    public toggleCageFS(user: User) {
        let cageFS = user.cagefs,
            newCageFs = (cageFS === 'enabled') ? 'disabled' : 'enabled';
        return this.usersRepo.saveUser(user, {'cagefs': newCageFs})
            .then(() => {user.loadingStage = false;})
            .catch(() => {user.loadingStage = false;});
    }

    public toggleMySQL(user: User) {
      let MySQLGov = user.mysql_gov;
      let newMySQLGov = (MySQLGov == 'ignored') ? 'watched' : 'ignored';
      return this.usersRepo.saveUser(user, {'mysql-gov': newMySQLGov})
          .then(() => {user.loadingStage = false;})
          .catch(() => {user.loadingStage = false;});
    }

    public reset(user: User) {
        return this.usersRepo.saveUser(user, {'default': 'all'})
            .then(response => {
                this.loadResponse(user, response);
            }).catch(() => {user.loadingStage = false;});
    }

    public doNotLimit(user: User) {
        return this.usersRepo.saveUser(user, {'unlimited': ''})
            .then(response => {
                this.loadResponse(user, response);
            }).catch(() => {user.loadingStage = false;});

    }

    public switchLimitsForReseller(status: string, user: User) {
        user.loadingStage = true;
        return new Promise((resolve, reject) => {
            this.usersRepo[status + 'LimitsForReseller'](user.username)
                .then(() => {
                    this.usersRepo.getReseller(user.username).then((response) => {
                        this.viewModeService.removeReseller(user.username);
                        this.loadResponse(user, response);
                        user.loadingStage = false;
                        resolve(response);
                    }).catch(() => {
                        user.loadingStage = false;
                        reject();
                    });
                }).catch(() => {
                    user.loadingStage = false;
                    reject();
                });

        });
    }

    public save(user: User) {
        if (this.saveCallback) {
            return this.saveCallback(user);
        } else {
            return this.defaultSave(user);
        }
    }

    public closeEdit(user: User) {
        if (this.closeCallback) {
            return this.closeCallback(user);
        }
    }


    defaultSave(user: User) {
        user.save()
          .then(() => {user.loadingStage = false;})
          .catch(() => {user.loadingStage = false;});
    }

}
