resource "local_file" "efs-pv" {
    content     = <<EOF
---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: efs-sc
provisioner: efs.csi.aws.com
reclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: wp-pv
spec:
  capacity:
    storage: 100Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: efs-sc
  csi:
    driver: efs.csi.aws.com
    volumeHandle: ${aws_efs_file_system.wordpress-efs.id}
EOF

    filename = "./artifacts/efs-pv.yaml"
}

resource "local_file" "db_config_map" {
    content     = <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: db-config-map
  namespace: ${var.namespace}
data:
  DB_HOST: "${module.db.db_instance_address}"
  DB_NAME: "${module.db.db_instance_name}"
  DB_USER: "${module.db.db_instance_username}"
  DB_PASSWORD: "${module.db.db_instance_password}"
  EOF

  filename = "./artifacts/db-config-map.yaml"
}

resource "local_file" "ingress" {
    content     = <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: wp-ingress
  namespace: ${var.namespace}
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/subnets: ${join(", ", module.app_vpc.public_subnets)}
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:${var.region}:${data.aws_caller_identity.current.account_id}:certificate/${var.cert_id}
    alb.ingress.kubernetes.io/ssl-redirect: '443'
    alb.ingress.kubernetes.io/ssl-policy: ELBSecurityPolicy-FS-1-2-2019-08
    # alb.ingress.kubernetes.io/target-group-attributes: stickiness.enabled=true, stickiness.lb_cookie.duration_seconds=3600
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/actions.redirect-to-uploads: >
      {"Type":"redirect","RedirectConfig":{"Host":"${var.hostname}","Port":"443","Protocol":"HTTPS","Path":"/wp-content/uploads/#{path}","StatusCode": "HTTP_301"}}
    alb.ingress.kubernetes.io/actions.redirect-to-pingcap-com: >
      {"Type":"redirect","RedirectConfig":{"Host":"${var.hostname}","Port":"443","Protocol":"HTTPS","Path":"/#{path}","StatusCode": "HTTP_301"}}
    alb.ingress.kubernetes.io/actions.redirect-to-pingcap-com-blog: >
      {"Type":"redirect","RedirectConfig":{"Host":"www.pingcap.com","Port":"443","Protocol":"HTTPS","Path":"/blog/#{path}","StatusCode": "HTTP_301"}}
    alb.ingress.kubernetes.io/conditions.wordpress-logged-in: >
      [{"field":"http-header","httpHeaderConfig":{"httpHeaderName":"cookie","values":["*wordpress_logged_in*"]}}]
    alb.ingress.kubernetes.io/actions.wordpress-logged-in: >
      {"type":"forward","forwardConfig":{"targetGroups":[{"serviceName":"wordpress-svc-admin","servicePort":"80"}]}}
spec:
  rules:
    - host: ${var.hostname}
      http:
        paths:
          - backend:
              service:
                name: hubspot-blog-image-redirect-nginx
                port:
                  number: 80
            path: /blog/*/media/*
            pathType: ImplementationSpecific
          - backend:
              service:
                name: blog-tag-url-rewrite-nginx
                port:
                  number: 80
            path: /blog/tag/*
            pathType: ImplementationSpecific
          - backend:
              service:
                name: www-website-protal
                port:
                  number: 80
            path: /htap-summit/auth/*
            pathType: ImplementationSpecific
          - backend:
              service:
                name: www-website-protal
                port:
                  number: 80
            path: /htap-summit/api/*
            pathType: ImplementationSpecific
          - backend:
              service:
                name: wordpress-svc-admin
                port:
                  number: 80
            path: /cms-dashboard
            pathType: Prefix
          - backend:
              service:
                name: wordpress-logged-in
                port:
                  name: use-annotation
            path: /
            pathType: Prefix
          - backend:
              service:
                name: wordpress-svc
                port:
                  number: 80
            path: /
            pathType: Prefix
    - host: uploads.pingcap.com
      http:
        paths:
          - backend:
              service:
                name: redirect-to-uploads
                port:
                  name: use-annotation
            path: /
            pathType: Prefix
    - host: en.pingcap.com
      http:
        paths:
          - backend:
              service:
                name: redirect-to-pingcap-com
                port:
                  name: use-annotation
            path: /
            pathType: Prefix
    - host: blog.pingcap.com
      http:
        paths:
          - backend:
              service:
                name: redirect-to-pingcap-com-blog
                port:
                  name: use-annotation
            path: /
            pathType: Prefix
    - host: pingcap.com
      http:
        paths:
          - backend:
              service:
                name: redirect-to-pingcap-com
                port:
                  name: use-annotation
            path: /
            pathType: Prefix
  EOF

  filename = "./artifacts/ingress.yaml"
}

resource "local_file" "wordpress" {
  content = <<EOF
apiVersion: v1
kind: Service
metadata:
  name: wordpress-svc
  namespace: ${var.namespace}
  labels:
    app: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend
  type: NodePort
---
apiVersion: v1
kind: Service
metadata:
  name: wordpress-svc-admin
  namespace: ${var.namespace}
  labels:
    app: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend
  type: NodePort
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pvc
  namespace: ${var.namespace} 
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: efs-sc
  resources:
    requests:
      storage: 100Gi
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: wordpress-deployment
  namespace: ${var.namespace}
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: Recreate
  replicas: ${length(module.app_vpc.private_subnets)}
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
      - image: wordpress:6.2-apache
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          valueFrom:
             configMapKeyRef:
               name: db-config-map
               key: DB_HOST
        - name: WORDPRESS_DB_NAME
          valueFrom:
             configMapKeyRef:
               name: db-config-map
               key: DB_NAME
        - name: WORDPRESS_DB_USER
          valueFrom:
             configMapKeyRef:
               name: db-config-map
               key: DB_USER
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
             configMapKeyRef:
               name: db-config-map
               key: DB_PASSWORD
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html/wp-content
        - mountPath: /usr/local/etc/php/conf.d/uploads.ini
          name: php-config
          subPath: uploads.ini
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pvc
      - configMap:
          defaultMode: 420
          name: wp-php-config
        name: php-config
EOF

  filename = "./artifacts/wordpress.yaml"
}

resource "local_file" "wp-php-config" {
  content = <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: wp-php-config
  namespace: ${var.namespace}
data:
  uploads.ini: |-
    file_uploads = On
    upload_max_filesize = 512M
    post_max_size = 512M
    memory_limit = 256M
    max_execution_time = 600
EOF
  filename = "./artifacts/wp-php-config.yaml"
}
