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-root: '{"Type":"redirect","RedirectConfig":{"Host":"pingcap.co.jp","Port":"443","Protocol":"HTTPS","StatusCode":"HTTP_301"}}'
spec:
  rules:
    - host: ${var.hostname}
      http:
        paths:
          - backend:
              service:
                name: wordpress-svc
                port:
                  number: 80
            path: /
            pathType: Prefix
    - host: www.${var.hostname}
      http:
        paths:
          - backend:
              service:
                name: redirect-to-root
                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: 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:5.8-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"
}