define(["angular","lodash","cjt/util/locale","cjt/util/parse","cjt/util/query","cjt/io/uapi-request","cjt/io/batch-request","cjt/io/uapi","cjt/io/api","cjt/services/APIService","cjt/services/alertService"],(function(e,a,t,s,i,r,n){"use strict";var l=e.module("cpanel.emailAccounts.service",["cjt2.services.api","cjt2.services.alert"]);l.value("PAGE",PAGE),l.factory("emailAccountsService",["$q","APIService","alertService","$timeout","PAGE",function(l,o,u,d,m){function c(e){this._init(e)}a.assign(c.prototype,{_init:function(e){if(e.replace)throw"bad replace";var t=a.assign({},e);t.replace=!1,u.add(t);var s=u.getAlerts(e.group).slice(-1)[0].id;this.id=s,this.group=e.group},remove:function(){u.removeById(this.id,this.group)}});var p,_=new o({transformAPISuccess:function(e){return e.data}}),g=function(){};function f(e){var a;e.diskused=parseInt(e.diskused,10),e.humandiskused=t.format_bytes(e._diskused),e.id=e.email,0===e._diskquota||0===e.diskquota||"unlimited"===e.diskquota?(e.diskquota=0,e.humandiskquota="∞",e.diskusedpercent=0,e.quotaType="unlimited",e.quota="",e.displayProgressbar=!1):(e.diskquota=parseInt(e._diskquota,10)/1024/1024,e.humandiskquota=t.format_bytes(e._diskquota),e.diskusedpercent=(e._diskused/e._diskquota*100).toFixed(2),e.quotaProgressType=(a=e.diskusedpercent)>=80?"danger":a>=60?"warning":"success",e.quotaType="userdefined",e.quota=e.diskquota,e.quotaUnit="MB",e.displayProgressbar=!0),e.humandiskusedpercent=t.numf(e.diskusedpercent)+"%",e.suspended_login=s.parsePerlBoolean(e.suspended_login),e.suspended_incoming=s.parsePerlBoolean(e.suspended_incoming),e.suspended_outgoing=s.parsePerlBoolean(e.suspended_outgoing),e.hold_outgoing=s.parsePerlBoolean(e.hold_outgoing),e.has_suspended=s.parsePerlBoolean(e.has_suspended),e.isDefault="Main Account"===e.login;var r=i.make_query_string({user:e.email,return_request_uri:location.pathname});return e.webmailLink="../mail/webmailform.html?"+r,e}function h(e){return!!e.special||a.values(e.services).some((function(e){return s.parsePerlBoolean(e.enabled)}))}return g.prototype=_,e.extend(g.prototype,{getStoredValue:function(e){var a=localStorage.getItem(e);return a=a&&0===a.indexOf(m.securityToken+":")?a.substr(1+m.securityToken.length):""},_dataWrapper:function(e){return this.deferred(e).promise},getUpgradeUrl:function(){return m.upgradeUrl},getEmailStats:function(){if(p)return l.resolve(p);var e=new r.Class;return e.initialize("ResourceUsage","get_usages"),e.addFilter("id","contains","email_accounts"),this.deferred(e).promise.then((function(e){var a;return p={},e&&e.length?(a=e[0],p.maximum=parseInt(a.maximum,10),p.used=parseInt(a.usage,10),!isNaN(p.maximum)&&p.maximum?p.available=p.maximum-p.used:p.available=-1,p):l.reject()}))},getMailDomains:function(){var e=new r.Class;return e.initialize("Email","list_mail_domains"),this.deferred(e).promise.then((function(e){return a.map(e,a.property("domain"))}))},_isClobberableUserPromise:function(e){var a=new r.Class;return a.initialize("UserManager","list_users"),a.addFilter("full_username","eq",e),this._dataWrapper(a).then((function(e){return!e.some(h)&&e[0]}))},createEmail:function(e){if(!p)throw"Call getEmailStats() first.";var s,i,n=new r.Class;e.setPassword?(s={email:e.userName,domain:e.domain,password:e.password,quota:e.quota,send_welcome_email:e.sendWelcomeEmail?1:0},n.initialize("Email","add_pop",s)):(s={username:e.userName,domain:e.domain,alternate_email:e.recoveryEmail,send_invite:1,"services.email.enabled":1,"services.email.quota":e.quota,"services.email.send_welcome_email":e.sendWelcomeEmail?1:0},n.initialize("UserManager","create_user",s),i={transformAPIFailure:Object});var o=this,d=this.presetDefaultHandlers.transformAPIFailure,m=e.userName+"@"+e.domain,_="emailAccounts",g=new c({group:_,type:"info",message:t.maketext("Creating email account …")});return this.deferred(n,i).promise.then((function(a){if(p.used=p.used+1,-1!==p.available&&(p.available=p.available-1),!0!==e.autoCreateSubaddressFolders){var t=new r.Class;return t.initialize("Email","disable_mailbox_autocreate",{email:m}),o.deferred(t).promise.then((function(){return a}))}return a})).catch((function(s){if(s.data&&"AlreadyExists"===s.data.type&&!h(s.data&&s.data.detail.entry)){var i=s.data.detail,n=[t.maketext("“[_1]” already exists in the [asis,User Manager].",a.escape(m)),t.maketext("This account appears to be left over from a previous subaccount.",a.escape(m)),t.maketext("Deleting …")];new c({group:_,type:"info",message:n.join(" ")});var p={username:e.userName,domain:e.domain},g=new r.Class;return g.initialize("UserManager","delete_user",p),o._dataWrapper(g).then((function(){var s;return s=i.alternate_email?t.maketext("The system deleted [asis,User Manager]’s old leftover “[_1]” account (alternate email address: [_2]).",a.escape(m),a.escape(i.alternate_email)):t.maketext("The system deleted [asis,User Manager]’s old leftover “[_1]” account.",a.escape(m)),u.add({group:_,type:"info",message:s,replace:!1}),o.createEmail(e)}))}return l.reject("string"==typeof s?s:d(s))})).finally((function(){g.remove()}))},getDefaultAccountUsage:function(){var e=new r.Class;return e.initialize("Email","get_main_account_disk_usage"),this._dataWrapper(e)},isSharedAddressBookEnabled:function(){var e=new r.Class;return e.initialize("DAV","has_shared_global_addressbook"),this._dataWrapper(e)},enableSharedAddressBook:function(){var e=new r.Class;return e.initialize("DAV","enable_shared_global_addressbook"),this._dataWrapper(e)},disableSharedAddressBook:function(){var e=new r.Class;return e.initialize("DAV","disable_shared_global_addressbook"),this._dataWrapper(e)},isUTF8MailboxNamesEnabled:function(){var e=new r.Class;return e.initialize("Mailboxes","has_utf8_mailbox_names"),this._dataWrapper(e)},enableUTF8MailboxNames:function(){var e=new r.Class;return e.initialize("Mailboxes","set_utf8_mailbox_names"),e.addArgument("enabled",1),this._dataWrapper(e)},disableUTF8MailboxNames:function(){var e=new r.Class;return e.initialize("Mailboxes","set_utf8_mailbox_names"),e.addArgument("enabled",0),this._dataWrapper(e)},getEmailAccountDetails:function(e){if(e){var s=new r.Class;s.initialize("Email","list_pops_with_disk"),s.addFilter("email","eq",e),s.addArgument("no_human_readable_keys",1),s.addArgument("get_restrictions",1);var i=new r.Class;i.initialize("Email","get_mailbox_autocreate",{email:e});var o=new n.Class([s,i]);return this.deferred(o).promise.then((function(e){var a=(e=e.map((function(e){return e.data})))[0];return a[0].autoCreateSubaddressFolders=e[1],a})).then((function(s){return a.isArray(s)&&0===s.length?l.reject(t.maketext("You do not have an email account named “[_1]”.",a.escape(e))):f(s[0])}),(function(e){return e}))}},isPlusAddressFolderCreationEnabled:function(e){if(e){var a=new r.Class;return a.initialize("Email","get_mailbox_autocreate",{email:e}),this.deferred(a).promise.then((function(e){return e}))}},disablePlusAddressFolderCreation:function(e){return this._createAPICall("disable_mailbox_autocreate",{email:e,fullEmail:e},{success:t.translatable("You disabled automatic folder creation for “[_1]”."),error:t.translatable("The system could not disable automatic folder creation for “[_1]”.")})},enablePlusAddressFolderCreation:function(e){return this._createAPICall("enable_mailbox_autocreate",{email:e,fullEmail:e},{success:t.translatable("You enabled automatic folder creation for “[_1]”."),error:t.translatable("The system could not enable automatic folder creation for “[_1]”.")})},deleteEmail:function(e){if(e){var a=new r.Class;return a.initialize("Email","delete_pop",{email:e}),this.deferred(a).promise.then((function(e){return p.used=p.used-1,-1!==p.available&&(p.available=p.available+1),e}))}},deleteEmails:function(e){if(e&&e.length>0){for(var a=[],t=0,s=e.length;t<s;t++){var i=new r.Class;i.initialize("Email","delete_pop",{email:e[t].email}),a.push(i)}var l=new n.Class(a);return this.deferred(l).promise.then((function(a){return p.used=p.used-e.length,-1!==p.available&&(p.available=p.available+e.length),a}))}},_createAPICall:function(e,s,i){var n=new r.Class;return n.initialize("Email",e,s),this._dataWrapper(n).then((function(){return i.success?{method:e,type:"success",message:t.makevar(i.success,a.escape(s.fullEmail)),autoClose:1e4}:{method:e,type:"success"}}),(function(r){return i.error?{method:e,type:"danger",message:t.makevar(i.error,a.escape(s.fullEmail),r)}:{method:e,type:"danger"}}))},getHeldMessageCount:function(e){var a=new r.Class;return a.initialize("Email","get_held_message_count",{email:e}),this._dataWrapper(a)},deleteHeldMessages:function(e,a){var t=new r.Class;return t.initialize("Email","delete_held_messages",{email:e,release_after_delete:a?1:0}),this._dataWrapper(t)},_handleSuspensions:function(e,a,s){var i=[];return s.incoming!==a.incoming&&(s.incoming?i.push(this._createAPICall("suspend_incoming",{email:e.email,fullEmail:e.email},{success:t.translatable("You suspended incoming mail for “[_1]”."),error:t.translatable("We can’t suspend incoming mail for “[_1]”:“[_2]”")})):i.push(this._createAPICall("unsuspend_incoming",{email:e.email,fullEmail:e.email},{success:t.translatable("You unsuspended incoming mail for “[_1]”."),error:t.translatable("We can’t unsuspend incoming mail for “[_1]”:“[_2]”")}))),s.login!==a.login&&(s.login?i.push(this._createAPICall("suspend_login",{email:e.email,fullEmail:e.email},{success:t.translatable("You suspended logins for “[_1]”."),error:t.translatable("We can’t suspend logins for “[_1]”:“[_2]”")})):i.push(this._createAPICall("unsuspend_login",{email:e.email,fullEmail:e.email},{success:t.translatable("You unsuspended logins for “[_1]”."),error:t.translatable("We can’t unsuspend logins for “[_1]”:“[_2]”")}))),s.outgoing!==a.outgoing&&("hold"===s.outgoing?i.push(this._createAPICall("hold_outgoing",{email:e.email,fullEmail:e.email},{success:t.translatable("We’re holding outgoing mail for “[_1]”."),error:t.translatable("We can’t hold mail for “[_1]”:“[_2]”")})):"suspend"===s.outgoing&&i.push(this._createAPICall("suspend_outgoing",{email:e.email,fullEmail:e.email},{success:t.translatable("You suspended outgoing mail for “[_1]”."),error:t.translatable("We can’t suspend outgoing mail for “[_1]”:“[_2]”")})),"suspend"===a.outgoing&&i.push(this._createAPICall("unsuspend_outgoing",{email:e.email,fullEmail:e.email},{success:t.translatable("You unsuspended outgoing mail for “[_1]”."),error:t.translatable("We can’t unsuspend outgoing mail for “[_1]”:“[_2]”")})),"hold"===a.outgoing&&i.push(this._createAPICall("release_outgoing",{email:e.email,fullEmail:e.email},{success:t.translatable("You unsuspended outgoing mail for “[_1]”."),error:t.translatable("We can’t unsuspend outgoing mail for “[_1]”:“[_2]”")}))),i},updateEmail:function(e,a,s,i){var r=[];if(e&&a){if(e.autoCreateSubaddressFolders!==a.autoCreateSubaddressFolders&&(a.autoCreateSubaddressFolders?r.push(this.enablePlusAddressFolderCreation(a.email)):r.push(this.disablePlusAddressFolderCreation(a.email))),void 0!==a.password&&a.password&&r.push(this._createAPICall("passwd_pop",{email:a.email,password:a.password,domain:a.domain,fullEmail:a.email},{success:t.translatable("You updated the password for “[_1]”."),error:t.translatable("We can’t update the password for “[_1]”:“[_2]”")})),Number(e.diskquota).toFixed(2)!==a.quota.toFixed(2)&&r.push(this._createAPICall("edit_pop_quota",{email:a.user,domain:a.domain,quota:a.quota,fullEmail:a.email},{success:t.translatable("You updated the storage space for “[_1]”."),error:t.translatable("We can’t update the storage space for “[_1]”:“[_2]”")})),i&&s){if(i.deleteHeldMessages){var n="hold"===s.outgoing&&"allow"===i.outgoing,o=this;return this.deleteHeldMessages(a.email,n).then((function(e){n&&(i.outgoing="hold");var u=o._handleSuspensions(a,s,i),m=r.concat(u);return m.length>0?l.all(m):d((function(){return l.resolve([{type:"success",method:"delete_held_messages",message:t.maketext("[quant,_1,message has,messages have] been queued for deletion from the outgoing mail queue.",e)}])}),0)}),(function(e){return d((function(){return l.resolve([{type:"danger",message:e}])}),0)}))}var u=this._handleSuspensions(a,s,i);r=r.concat(u)}return r.length>0?l.all(r):d((function(){return l.resolve([{type:"success",message:t.maketext("Email account “[_1]” is up to date.",a.email),autoClose:1e4}])}),0)}},getEmailAccounts:function(e){this.currentGetRequest&&this.currentGetRequest.jqXHR&&this.currentGetRequest.jqXHR.abort();var a=new r.Class;e||(e={}),e.no_human_readable_keys=1,e.get_restrictions=1,e.include_main=1,a.initialize("Email","list_pops_with_disk",e);var t=l.defer(),s=this;return this.currentGetRequest=new o.AngularAPICall(a,{done:function(e){if(s.currentGetRequest=void 0,e.parsedResponse.error)t.reject(e.parsedResponse.error);else{for(var a=e.parsedResponse,i=a.data,r=i.length,n=0;n<r;n++)f(i[n]);t.resolve(a)}},fail:function(){s.currentGetRequest=void 0}}),t.promise}}),new g}])}));