package _VisualDVM.ComponentsServer.UserAccount;
import Common.Database.Objects.DBObject;
import Common.Database.Objects.iDBObject;
import Common.Utils.TextLog;
import _VisualDVM.Global;
import com.sun.org.glassfish.gmbal.Description;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.RandomStringUtils;

import java.io.File;
public class UserAccount extends iDBObject {
    public String name = "";
    public String email = "";
    @Description("DEFAULT ''")
    public String telegram_name = "";
    @Description("DEFAULT 1")
    public int subscribe_active = 1;
    @Description("DEFAULT 'Undefined'")
    public AccountRole role = AccountRole.Undefined;  //права доступа
    public UserAccount() {
    }
    public UserAccount(UserAccount account_in) {
        this.SynchronizeFields(account_in);
    }
    public UserAccount(String name_in, String email_in) {
        name = name_in;
        email = email_in;
    }
    @Override
    public void SynchronizeFields(DBObject src) {
        super.SynchronizeFields(src);
        UserAccount src_ = (UserAccount) src;
        name = src_.name;
        email = src_.email;
        telegram_name = src_.telegram_name;
        subscribe_active = src_.subscribe_active;
        role = src_.role;
    }
    public File getClientKeyFile() {
        return new File(Global.KeysDirectory, "key");
    }
    public File getServerKeyFile() {
        return new File(Global.KeysDirectory, String.valueOf(id));
    }
    public String getKey() throws Exception {
        return FileUtils.readFileToString(getServerKeyFile());
    }
    public void generateKey() throws Exception {
        FileUtils.writeStringToFile(getServerKeyFile(), RandomStringUtils.random(100, true, true));
    }
    //todo часть устарело.разобрать.
    public boolean CheckRegistered(TextLog Log) {
        if (role.equals(AccountRole.Undefined)) {
            if (Log != null) {
                Log.Writeln("Пользователь не зарегистрирован");
                if (Global.mainModule.getUI().hasMainWindow())
                    Global.mainModule.getUI().getMainWindow().FocusCallback();
            }
            return false;
        }
        return true;
    }
    public boolean isRegistered() {
        return !role.equals(AccountRole.Undefined);
    }
    public boolean CheckAuthorship(String address_in, TextLog log) {
        if (!isAdmin() && (!email.equals(address_in))) {
            if (log != null)
                log.Writeln_("Вы не являетесь автором или администратором");
            return false;
        }
        return true;
    }
    public boolean CheckAccessRights(String address_in, TextLog log) {
        return (CheckRegistered(log) && CheckAuthorship(address_in, log));
    }
    public boolean isAdmin() {
        return role.equals(AccountRole.Admin);
    }
    public boolean CheckAdmin(TextLog log) {
        if (!isAdmin()) {
            log.Writeln_("Вы не являетесь администратором!");
            return false;
        }
        return true;
    }
    //---
}
