define(["angular","lodash","cjt/util/locale","cjt/services/APICatcher","cjt/io/batch-request","cjt/io/uapi-request","cjt/io/uapi"],(function(e,t,i,a,s,n){"use strict";var r=e.module("App"),o=new Date;return r.factory("DomainsService",["APICatcher","AUTOSSL_CAN_WILDCARD",function(a,r){var l,d,c,u,_,m=null,f=null,p=null,x=null,w=null,v={},S={unsecured:0,"self-signed":0,dv:1,autossl:1,ov:2,ev:3},k={"self-signed":i.maketext("Self-signed"),unsecured:i.maketext("Unsecured"),dv:i.maketext("Domain Validated"),ov:i.maketext("Organization Validated"),ev:i.maketext("Extended Validation"),autossl:i.maketext("[asis,AutoSSL] Domain Validated")};function h(e){e.is_self_signed=1===parseInt(e.is_self_signed,10),e.is_autossl="1"===e.is_autossl.toString(),e.validation_type=e.is_self_signed?"self-signed":e.validation_type,e.validation_type="dv"===e.validation_type&&e.is_autossl?"autossl":e.validation_type,e.type_name=g(e),e.view_crt_url="",e.view_crt_url+="../../ssl/install.html",e.id&&(e.view_crt_url+="?id="+encodeURIComponent(e.id)),e.will_autossl=function(e){if(!r&&-1!==e.domains.join().indexOf("*"))return!1;if(b()){if(e.is_autossl)return!0;if(S[e.validation_type]<S.dv)return!0;if(E())return!0}return!1}(e),e.expiration_date=new Date(1e3*e.not_after),e.is_expired=e.expiration_date<o;var t=(e.expiration_date-o)/1e3/60/60/24;return e.expiring_soon=t<30&&t>0,e}function y(e){return k[e]?k[e]:i.maketext("Unknown Certificate Type")}function g(e){return e?y(e.validation_type,e.is_autossl):""}function b(){return null!==m?m:(m="1"===PAGE.autossl_enabled.toString()&&""!==PAGE.autossl_provider,b())}function A(){return"1"===PAGE.ddnsEnabled.toString()&&""!==PAGE.ddnsEnabled}function E(){return null!==f?f:(f="1"===PAGE.autossl_override_enabled.toString(),E())}function L(e){return P()[e.virtual_host]}function D(e){var t="",a=L(e);return a?(t=e.certificate_covers_domain?a.is_expired?i.maketext("Expired on [datetime,_1].",a.not_after):i.maketext("Expires on [datetime,_1].",a.not_after):i.maketext("The installed certificate does not cover this domain."),e.certificate_will_autossl&&e.excluded_from_autossl?e.is_www?t+=" "+i.maketext("The certificate will renew via [asis,AutoSSL] when the parent domain “[_1]” renews, but this domain will be excluded.",e.www_parent):t+=" "+i.maketext("The certificate will renew via [asis,AutoSSL], but this domain will be excluded."):e.certificate_will_autossl?e.is_www?t+=" "+i.maketext("The certificate will renew via [asis,AutoSSL] when the parent domain “[_1]” renews.",e.www_parent):t+=" "+i.maketext("The certificate will renew via [asis,AutoSSL]."):!r&&e.is_wildcard?t+=" "+i.maketext("This server cannot provision [asis,AutoSSL] certificates that secure wildcard domains."):a.is_autossl||E()||(t+=" "+i.maketext("The certificate will not renew via [asis,AutoSSL] because it was not issued via [asis,AutoSSL]."))):(t=i.maketext("No certificate available."),b()&&(e.is_wildcard&&!r?t+=" "+i.maketext("The configured [asis,AutoSSL] provider does not support explicit wildcard domains.")+" "+i.maketext("You must purchase a certificate to secure this domain."):e.excluded_from_autossl?t+=" "+i.maketext("[asis,AutoSSL] will attempt to secure this website, but the domain will be excluded."):e.is_www?t+=" "+i.maketext("[asis,AutoSSL] will attempt to secure the domain when the parent domain “[_1]” renews.",e.www_parent):t+=" "+i.maketext("[asis,AutoSSL] will attempt to secure the domain the next time it runs."))),t}function C(e){var t=e?e.validation_type:"unsecured",i=S[t]||0;if(v[i])return v[i];var a=T();return v[i]=a.filter((function(e){return S[e]>i})),C(e)}function O(){return c||(u={},c=[],PAGE.installed_hosts.forEach((function(e){e.certificate=h(e.certificate),c.push(e),u[e.servername]=e.certificate})),O())}function P(){return u||(O(),P())}function T(){if(w)return w;w=[];var t={},i=G();return e.forEach(i,(function(e){t[e.x_validation_type]=1})),e.forEach(t,(function(e,t){w.push(t)})),T()}function G(){return p||(p=[],PAGE.products&&e.forEach(PAGE.products,(function(e){var t;(t=e).id=t.product_id,t.provider=t.provider_name,t.provider_display_name=t.provider_display_name||t.provider,t.price=Number(t.x_price_per_domain),t.wildcard_price=Number(t.x_price_per_wildcard_domain),t.wildcard_parent_domain_included=t.x_wildcard_parent_domain_free&&"1"===t.x_wildcard_parent_domain_free.toString(),t.icon_mime_type=t.icon_mime_type?t.icon_mime_type:"image/png",t.is_wildcard=!isNaN(t.wildcard_price),t.x_certificate_term=t.x_certificate_term||[1,"year"],t.x_certificate_term_key=t.x_certificate_term.join("_"),t.validity_period=t.x_certificate_term,p.push(t)})),G())}function N(){return d||(d={},e.forEach(PAGE.domain_types,(function(t,i){"main_domain"===i&&(t=[t]),e.forEach(t,(function(e){d[e]=i}))})),N())}function U(e){var t=N(),a=e.replace(/^www./gi,"");return t[a]?t[a]:i.maketext("Unknown")}function V(t){var a={domain:t.domain,vhost_name:t.vhost_name,virtual_host:t.vhost_name,isDDNS:!!t.isDDNS,certificate_type:"unsecured",certificate_type_name:i.maketext("Unsecured"),certificateStatusMessage:"",certificate_is_self_signed:!1,certificate_is_autossl:!1,certificate_will_autossl:!1,certificate_status:"unsecured",can_autossl_include:!1,can_autossl_exclude:!1,validation_rank:0,excluded_from_autossl:!1,domain_autossl_status:"included",expiring_soon:!1,is_autosubdomain:!1,is_expired:!1,is_proxy:!1,is_www:!1,showCertActions:!0,type:U(t.domain)};a.isDDNS&&(a.showCertActions=!1,a.type="ddns_domain"),j()[a.domain]&&(a.excluded_from_autossl=!0,a.domain_autossl_status="excluded");var s=L(a);return a.is_wildcard=0===t.domain.indexOf("*."),a.is_proxy="1"===t.is_proxy.toString(),a.is_www=a.domain.match(/^www\./),a.is_mail=a.domain.match(/^mail\./),a.www_parent=a.domain.replace(/^www\./,""),a.is_www||a.is_mail?a.type="www_mail_domains":a.is_proxy&&(a.type="proxy_sub_domains"),s?(a.certificate=s,a.certificate_type=s.validation_type,a.certificate_is_autossl=s.is_autossl,a.certificate_will_autossl=s.will_autossl,a.certificate_type_name=y(a.certificate_type,s.is_autossl),a.certificate_is_self_signed=s.is_self_signed,a.expiring_soon=s.expiring_soon,a.is_expired=s.is_expired,a.view_crt_url=s.view_crt_url,a.validation_rank=S[s.validation_type],a.certificate_covers_domain=0,e.forEach(s.domains,(function(e){a.domain===e&&(a.certificate_covers_domain=1),a.domain.replace(/^[^.]+\./,"*.")===e&&(a.certificate_covers_domain=1)})),a.certificate_covers_domain||(a.certificate_type="unsecured",a.certificate_type_name=y(a.certificate_type,s.is_autossl)),a.is_active=!a.is_expired&&!a.expiring_soon):a.certificate_will_autossl=b()&&!a.is_wildcard,a.can_autossl_exclude=b()&&a.certificate_will_autossl&&!a.is_wildcard,a.is_autosubdomain=/^www./.test(t.domain),a.is_active?a.certificate_status="active":a.is_expired?(a.certificate_status="expired",a.certificate_type="unsecured",a.certificate_type_name=y(a.certificate_type,s.is_autossl)):a.expiring_soon&&(a.certificate_status="expiring_soon"),a.available_upgrades=C(s),a.certificateStatusMessage=D(a),a.upgrade_btn_label=function(e){var t="",a=C();return!e||e.is_self_signed?t=i.maketext("Purchase Certificate"):e.will_autossl&&a.length?t=i.maketext("Upgrade Certificate"):e.is_expired||e.expiring_soon?t=i.maketext("Renew Certificate"):a.length&&(t=i.maketext("Upgrade Certificate")),t}(s),a.view_certificate_title=i.maketext("View certificate for the website “[_1]”.",a.virtual_host,a.domain),a.exclude_autossl_btn_title=i.maketext("Exclude “[_1]” from [asis,AutoSSL].",a.domain),a.include_autossl_btn_title=i.maketext("Include “[_1]” during [asis,AutoSSL].",a.domain),a}function j(){return x||(x={},e.forEach(PAGE.autossl_excluded_domains,(function(e){this[e.excluded_domain]=e.excluded_domain}),x),j())}return{get_domains:function t(){if(l)return l;var i={};return l=[],PAGE.domains.forEach((function(e){var t=V(e);i[t.domain]=t})),e.forEach(i,(function(e){l.push(e)})),t()},get_products:G,get_upgrade_btn_title:function(e,t){var a=T(),s="";return!t||t.is_self_signed?s=i.maketext("Purchase certificate for “[_1]”.",e):t.will_autossl&&a.length?s=i.maketext("Upgrade certificate for “[_1]”.",e):t.is_expired||t.expiring_soon?s=i.maketext("Renew certificate for “[_1]”.",e):a.length&&(s=i.maketext("Upgrade certificate for “[_1]”.",e)),s},autossl_include_domains:function(e){var t=(new n.Class).initialize("SSL","remove_autossl_excluded_domains",{domains:e.join(",")});return a.promise(t)},autossl_exclude_domains:function(e){var t=(new n.Class).initialize("SSL","add_autossl_excluded_domains",{domains:e.join(",")});return a.promise(t)},get_ssl_domains:P,get_installed_hosts:O,get_domain_search_options:function e(){return _||(_={domainType:{label:i.maketext("Domain Types:"),item_key:"type",options:[{value:"main_domain",label:i.maketext("Main"),description:i.maketext("Only list Main domains.")},{value:"sub_domains",label:i.maketext("Subdomain"),description:i.maketext("Only list Subdomains.")},{value:"addon_domains",label:i.maketext("Addon Domains"),description:i.maketext("Only list Addon domains.")},{value:"parked_domains",label:i.maketext("Parked Domains"),description:i.maketext("Only list Parked domains.")},{value:"www_mail_domains",label:i.maketext("[asis,www] and [asis,mail] Domains"),description:i.maketext("Only list [asis,www] and [asis,mail] domains.")},{value:"proxy_sub_domains",label:i.maketext("Service Subdomains"),description:i.maketext("Only list Service Subdomains.")}]},sslType:{label:i.maketext("[asis,SSL] Types:"),item_key:"certificate_type",options:[{value:"unsecured",label:i.maketext("Unsecured"),description:i.maketext("Only list unsecured domains.")},{value:"self-signed",label:i.maketext("Self-signed"),description:i.maketext("Only list self-signed domains.")},{value:"autossl",label:i.maketext("[asis,AutoSSL DV] Certificate"),description:i.maketext("Only list domains with [asis,AutoSSL DV] Certificates.")},{value:"dv",label:i.maketext("DV Certificate"),description:i.maketext("Only list domains with [asis,DV] Certificates.")},{value:"ov",label:i.maketext("OV Certificate"),description:i.maketext("Only list domains with [asis,OV] Certificates.")},{value:"ev",label:i.maketext("EV Certificate"),description:i.maketext("Only list domains with [asis,EV] Certificates.")}]},sslStatus:{label:i.maketext("[asis,SSL] Statuses:"),item_key:"certificate_status",options:[{value:"active",label:i.maketext("Active"),description:i.maketext("Only list the domains with active certificates.")},{value:"expired",label:i.maketext("Expired"),description:i.maketext("Only list domains whose certificate is expiring soon.")},{value:"expiring_soon",label:i.maketext("Expiring Soon"),description:i.maketext("Only list domains whose certificate is expiring soon.")},{value:"unsecured",label:i.maketext("Unsecured"),description:i.maketext("Only list unsecured domains.")},{value:"has_autossl_problem",label:i.maketext("Has [asis,AutoSSL] Problems"),description:i.maketext("Only list the domains with [asis,AutoSSL] problems.")}]}},A()&&_.domainType.options.push({value:"ddns_domain",label:i.maketext("[asis,DDNS] Domains"),description:i.maketext("Only list Dynamic [asis,DNS] ([asis,DDNS]) Domains.")}),b()&&(_.autoSSLStatus={label:i.maketext("[asis,AutoSSL] Statuses:"),item_key:"domain_autossl_status",options:[{value:"included",label:i.maketext("Included"),description:i.maketext("Only list domains that are not explicitly excluded during [asis,AutoSSL].")},{value:"excluded",label:i.maketext("Excluded"),description:i.maketext("Only list domains that will be explicitly excluded from [asis,AutoSSL].")}]}),e())},is_autossl_enabled:b,make_ssl_type_name:g,get_validation_type_name:y,get_validation_ranks:function(){return S},get_certificate_status:D,getAutoSSLStatuses:function(){if(!b())return!1;var e=(new n.Class).initialize("SSL","get_autossl_problems");PAGE.hasWebServerRole||e.addFilter("domain","matches","^(?!www\\.)");var t=[e],r=[],o=PAGE.ddns_domains.map((function(e){return r.push(e.domain),(new n.Class).initialize("SSL","fetch_best_for_domain",{domain:e.domain})}));PAGE.ddns_domains=[],t=t.concat(o);var d=new s.Class(t);return a.promise(d).then((function(e){var t={},a=e.data[0].data,s=e.data.slice(1);return a.forEach((function(e){var a=e.domain;t[a]={domain:a,status:i.maketext("An error occurred during the last [asis,AutoSSL] run for this domain."),runTime:new Date(e.time),error:e.problem}})),s.forEach((function(e,t){var i={domain:r[t],vhost_name:"_ddns_"+r[t],is_proxy:"0",isDDNS:!0};if(e.data.crt){var a=CPANEL.ssl.parseCertificateText(e.data.crt),s=h({is_self_signed:a.isSelfSigned?"1":"0",is_autossl:"1",domains:a.domains,validation_type:"autossl",id:null,not_after:a.notAfter.getTime()/1e3});u[i.vhost_name]=s}i=V(i),l.push(i)})),Object.keys(t).map((function(e){return t[e]}))}))},startUserAutoSSL:function(){var e=new n.Class;return e.initialize("SSL","start_autossl_check"),a.promise(e)},isAutoSSLCheckInProgress:function(){if(!b())return!1;var e=new n.Class;return e.initialize("SSL","is_autossl_check_in_progress"),a.promise(e).then((function(e){return"1"===e.data.toString()}))},areMarketProductsAvailable:function(){return PAGE.has_tls_wizard_feature&&G().length||!1},isDDNSEnabled:t.memoize(A)}}])}));