local kube = import "../../../kube/kube.libsonnet";

{
    AppServiceIrc(name):: {
        local bridge = self,
        local cfg = bridge.cfg,
        cfg:: {
            metadata: {},
            // Whether the bootstrap job should be created/updated. Kubernetes
            // doesn't like changing the configuration of jobs, so once this
            // appservice has been set up, this flag should be flipped to
            // false.
            bootstrapJob: true,
            config: std.native("parseYaml")(importstr "appservice/appservice-irc.yaml")[0] {
                local appservicecfg = self,
                ircService+: {
                    [if cfg.passwordEncryptionKeySecret != null then "passwordEncryptionKeyPath"]: "/key/key.pem",
                    debugApi+: {
                        # Unfortunately, we have to enable the debugApi if any
                        # configured server wants to use
                        # ignoreIdleUsersOnStartup. This is seemingly an
                        # appservice-irc bug:
                        # https://github.com/matrix-org/matrix-appservice-irc/issues/1240
                        enabled: std.length(std.filter(
                            function (k) (
                                local v = appservicecfg.ircService.servers[k];
                                v.membershipLists.ignoreIdleUsersOnStartup.enabled == true
                            ),
                            std.objectFields(appservicecfg.ircService.servers)
                        )) > 0,
                    },
                },
            },
            image: error "image must be set",
            storageClassName: error "storageClassName must be set",

            # RSA encryption private key secret name containing "key.pem" key
            # Create using:
            #   kubectl -n matrix create secret generic appservice-irc-password-encryption-key --from-file=key.pem=<(openssl genpkey -out - -outform PEM -algorithm RSA -pkeyopt rsa_keygen_bits:2048)
            passwordEncryptionKeySecret: null,
        },

        config: kube.Secret("appservice-irc-%s" % [name]) {
            metadata+: cfg.metadata,
            data_: {
                "config.yaml": std.manifestJsonEx(cfg.config, ""),
            },
        },

        dataVolume: kube.PersistentVolumeClaim("appservice-irc-%s" % [name]) {
            metadata+: cfg.metadata,
            storage: "10Gi",
            storageClass: cfg.storageClassName,
        },

        bootstrapJob: if cfg.bootstrapJob then (kube.Job("appservice-irc-%s-bootstrap" % [name]) {
            metadata+: cfg.metadata {
                labels: {
                    "job-name": "appservice-irc-%s-bootstrap" % [name],
                },
            },
            spec+: {
                template+: {
                    spec+: {
                        volumes_: {
                            config: kube.SecretVolume(bridge.config),
                        },
                        containers_: {
                            bootstrap: kube.Container("appservice-irc-%s-bootstrap" % [name]) {
                                image: cfg.image,
                                command: ["sh", "-c", "node app.js -r -u http://appservice-irc-%s:9999 -c /config/config.yaml -f /tmp/registration.yaml && cat /tmp/registration.yaml" % [name]],
                                volumeMounts_: {
                                    config: { mountPath: "/config" },
                                },
                            },
                        },
                    },
                },
            },
        }) else {},

        deployment: kube.Deployment("appservice-irc-%s" % [name]) {
            metadata+: cfg.metadata,
            spec+: {
                replicas: 1,
                template+: {
                    spec+: {
                        volumes_: {
                            config: kube.SecretVolume(bridge.config),
                            data: kube.PersistentVolumeClaimVolume(bridge.dataVolume),
                            registration: { secret: { secretName: "appservice-irc-%s-registration" % [name] } },
                        } + (if cfg.passwordEncryptionKeySecret != null then {
                            key: { secret: { secretName: cfg.passwordEncryptionKeySecret } },
                        } else {}),
                        nodeSelector: cfg.nodeSelector,
                        containers_: {
                            appserviceIrc: kube.Container("appservice-irc-%s" % [name]) {
                                image: cfg.image,
                                command: ["node", "app.js", "-c", "/config/config.yaml", "-f", "/registration/registration.yaml", "-p", "9999"],
                                ports_: {
                                    http: { containerPort: 9999 },
                                },
                                volumeMounts_: {
                                    registration: { mountPath: "/registration", },
                                    config: { mountPath: "/config", },
                                    data: { mountPath: "/data" },
                                } + (if cfg.passwordEncryptionKeySecret != null then {
                                    key: { mountPath: "/key" },
                                } else {}),
                            },
                        },
                    },
                },
            },
        },

        svc: kube.Service("appservice-irc-%s" % [name]) {
            metadata+: cfg.metadata,
            target_pod:: bridge.deployment.spec.template,
        },
    },
}
