Ext.define('pmx-users', {
    extend: 'Ext.data.Model',
    fields: [
	'userid', 'firstname', 'lastname', 'email', 'comment',
	{ type: 'boolean', name: 'enable', defaultValue: true },
	{ type: 'date', dateFormat: 'timestamp', name: 'expire' },
    ],
    idProperty: 'userid',
    proxy: {
	type: 'proxmox',
	url: '/api2/json/access/users',
    },
});

Ext.define('PBS.config.UserView', {
    extend: 'Ext.grid.GridPanel',
    alias: 'widget.pbsUserView',

    stateful: true,
    stateId: 'grid-users',

    title: gettext('Users'),

    controller: {
	xclass: 'Ext.app.ViewController',

	addUser: function() {
	    let me = this;
            Ext.create('PBS.window.UserEdit', {
		listeners: {
		    destroy: function() {
			me.reload();
		    },
		},
            }).show();
	},

	editUser: function() {
	    let me = this;
	    let view = me.getView();
	    let selection = view.getSelection();
	    if (selection.length < 1) return;

            Ext.create('PBS.window.UserEdit', {
                userid: selection[0].data.userid,
		listeners: {
		    destroy: function() {
			me.reload();
		    },
		},
            }).show();
	},

	setPassword: function() {
	    let me = this;
	    let view = me.getView();
	    let selection = view.getSelection();

	    if (selection.length < 1) return;

	    Ext.create('PBS.window.UserPassword', {
		url: '/api2/extjs/access/users/' + selection[0].data.userid,
	    }).show();
	},

	showPermissions: function() {
	    let me = this;
	    let view = me.getView();
	    let selection = view.getSelection();

	    if (selection.length < 1) return;

	    Ext.create('Proxmox.PermissionView', {
		auth_id: selection[0].data.userid,
		auth_id_name: 'auth-id',
	    }).show();
	},

	renderName: function(val, cell, rec) {
	    let name = [];
	    if (rec.data.firstname) {
		name.push(rec.data.firstname);
	    }
	    if (rec.data.lastname) {
		name.push(rec.data.lastname);
	    }
	    return name.join(' ');
	},

	renderUsername: function(userid) {
	    return Ext.String.htmlEncode(userid.match(/^(.+)@([^@]+)$/)[1]);
	},

	renderRealm: function(userid) {
	    return Ext.String.htmlEncode(userid.match(/^(.+)@([^@]+)$/)[2]);
	},

	reload: function() { this.getView().getStore().rstore.load(); },

	init: function(view) {
	    Proxmox.Utils.monStoreErrors(view, view.getStore().rstore);
	},
    },

    listeners: {
	activate: 'reload',
	itemdblclick: 'editUser',
    },

    store: {
	type: 'diff',
	autoDestroy: true,
	autoDestroyRstore: true,
	sorters: 'userid',
	rstore: {
	    type: 'update',
	    storeid: 'pmx-users',
	    model: 'pmx-users',
	    autoStart: true,
	    interval: 5000,
	},
    },

    tbar: [
	{
	    xtype: 'proxmoxButton',
	    text: gettext('Add'),
	    handler: 'addUser',
	    selModel: false,
	},
	'-',
	{
	    xtype: 'proxmoxButton',
	    text: gettext('Edit'),
	    handler: 'editUser',
	    disabled: true,
	},
	{
	    xtype: 'proxmoxStdRemoveButton',
	    baseurl: '/access/users/',
	    enableFn: (rec) => rec.data.userid !== 'root@pam',
	    getUrl: (rec) =>
		`/access/users/${encodeURIComponent(rec.getId())}`,
	    callback: 'reload',
	},
	'-',
	{
	    xtype: 'proxmoxButton',
	    text: gettext('Change Password'),
	    handler: 'setPassword',
	    disabled: true,
	},
	{
	    xtype: 'proxmoxButton',
	    text: gettext('Show Permissions'),
	    handler: 'showPermissions',
	    disabled: true,
	},
    ],

    viewConfig: {
	trackOver: false,
    },

    columns: [
	{
	    header: gettext('User name'),
	    width: 200,
	    sortable: true,
	    renderer: 'renderUsername',
	    dataIndex: 'userid',
	},
	{
	    header: gettext('Realm'),
	    width: 100,
	    sortable: true,
	    renderer: 'renderRealm',
	    dataIndex: 'userid',
	},
	{
	    header: gettext('Enabled'),
	    width: 80,
	    sortable: true,
	    renderer: Proxmox.Utils.format_boolean,
	    dataIndex: 'enable',
	},
	{
	    header: gettext('Expire'),
	    width: 80,
	    sortable: true,
	    renderer: Proxmox.Utils.format_expire,
	    dataIndex: 'expire',
	},
	{
	    header: gettext('Name'),
	    width: 150,
	    sortable: true,
	    dataIndex: 'firstname',
	    renderer: 'renderName',
	},
	{
	    header: gettext('Comment'),
	    sortable: false,
	    renderer: Ext.String.htmlEncode,
	    dataIndex: 'comment',
	    flex: 1,
	},
    ],
});
