/*

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/

package watcher

import (
	"log"

	"ingress-ats/endpoint"
	"ingress-ats/util"

	v1beta1 "k8s.io/api/extensions/v1beta1"
)

// IgHandler implements EventHandler
type IgHandler struct {
	ResourceName string
	Ep           *endpoint.Endpoint
}

func (g *IgHandler) Add(obj interface{}) {
	log.Printf("\n\nIn INGRESS_HANDLER ADD %#v \n\n", obj)
	g.add(obj)
	g.Ep.RedisClient.PrintAllKeys()
}

func (g *IgHandler) add(obj interface{}) {
	ingressObj, ok := obj.(*v1beta1.Ingress)
	if !ok {
		log.Println("In HandlerIngress Add; cannot cast to *v1beta1.Ingress")
		return
	}

	namespace := ingressObj.GetNamespace()
	ingressClass, _ := util.ExtractIngressClass(ingressObj.GetAnnotations())
	if !g.Ep.NsManager.IncludeNamespace(namespace) || !g.Ep.ATSManager.IncludeIngressClass(ingressClass) {
		log.Println("Namespace not included or Ingress Class not matched")
		return
	}

	// add the script before adding route
	snippet, snippetErr := util.ExtractServerSnippet(ingressObj.GetAnnotations())
	if snippetErr == nil {
		name := ingressObj.GetName()
		version := ingressObj.GetResourceVersion()
		nameversion := util.ConstructNameVersionString(namespace, name, version)
		g.Ep.RedisClient.DBOneSAdd(nameversion, snippet)
	}

	tlsHosts := make(map[string]string)

	for _, ingressTLS := range ingressObj.Spec.TLS {
		for _, tlsHost := range ingressTLS.Hosts {
			tlsHosts[tlsHost] = "1"
		}
	}

	for _, ingressRule := range ingressObj.Spec.Rules {
		host := ingressRule.Host
		scheme := "http"
		if _, ok := tlsHosts[host]; ok {
			scheme = "https"
		}

		for _, httpPath := range ingressRule.HTTP.Paths {

			path := httpPath.Path
			hostPath := util.ConstructHostPathString(scheme, host, path)
			service := httpPath.Backend.ServiceName
			port := httpPath.Backend.ServicePort.String()
			svcport := util.ConstructSvcPortString(namespace, service, port)

			g.Ep.RedisClient.DBOneSAdd(hostPath, svcport)

			if snippetErr == nil {
				name := ingressObj.GetName()
				version := ingressObj.GetResourceVersion()
				nameversion := util.ConstructNameVersionString(namespace, name, version)
				g.Ep.RedisClient.DBOneSAdd(hostPath, nameversion)
			}
		}

	}
}

// Update for EventHandler
func (g *IgHandler) Update(obj, newObj interface{}) {
	log.Printf("\n\nIn INGRESS_HANDLER UPDATE %#v \n\n", newObj)
	g.update(obj, newObj)
	g.Ep.RedisClient.PrintAllKeys()
}

func (g *IgHandler) update(obj, newObj interface{}) {
	ingressObj, ok := obj.(*v1beta1.Ingress)
	if !ok {
		log.Println("In HandlerIngress Update; cannot cast to *v1beta1.Ingress")
		return
	}

	newIngressObj, ok := newObj.(*v1beta1.Ingress)
	if !ok {
		log.Println("In HandlerIngress Update; cannot cast to *v1beta1.Ingress")
		return
	}

	m := make(map[string]string)

	namespace := ingressObj.GetNamespace()
	ingressClass, _ := util.ExtractIngressClass(ingressObj.GetAnnotations())
	if g.Ep.NsManager.IncludeNamespace(namespace) && g.Ep.ATSManager.IncludeIngressClass(ingressClass) {
		log.Println("Old Namespace included")

		_, snippetErr := util.ExtractServerSnippet(ingressObj.GetAnnotations())

		tlsHosts := make(map[string]string)

		for _, ingressTLS := range ingressObj.Spec.TLS {
			for _, tlsHost := range ingressTLS.Hosts {
				tlsHosts[tlsHost] = "1"
			}
		}

		for _, ingressRule := range ingressObj.Spec.Rules {
			host := ingressRule.Host
			scheme := "http"
			if _, ok := tlsHosts[host]; ok {
				scheme = "https"
			}

			for _, httpPath := range ingressRule.HTTP.Paths {

				path := httpPath.Path
				hostPath := util.ConstructHostPathString(scheme, host, path)

				g.Ep.RedisClient.DBOneSUnionStore("temp_"+hostPath, hostPath)
				m["temp_"+hostPath] = hostPath

				service := httpPath.Backend.ServiceName
				port := httpPath.Backend.ServicePort.String()
				svcport := util.ConstructSvcPortString(namespace, service, port)

				g.Ep.RedisClient.DBOneSRem("temp_"+hostPath, svcport)

				if snippetErr == nil {
					name := ingressObj.GetName()
					version := ingressObj.GetResourceVersion()
					nameversion := util.ConstructNameVersionString(namespace, name, version)
					g.Ep.RedisClient.DBOneSRem("temp_"+hostPath, nameversion)
				}
			}

		}
	}

	newNamespace := ingressObj.GetNamespace()
	newIngressClass, _ := util.ExtractIngressClass(ingressObj.GetAnnotations())
	if g.Ep.NsManager.IncludeNamespace(newNamespace) && g.Ep.ATSManager.IncludeIngressClass(newIngressClass) {
		log.Println("New Namespace included")

		newSnippet, newSnippetErr := util.ExtractServerSnippet(newIngressObj.GetAnnotations())
		if newSnippetErr == nil {
			newName := newIngressObj.GetName()
			newVersion := newIngressObj.GetResourceVersion()
			newNameversion := util.ConstructNameVersionString(newNamespace, newName, newVersion)
			g.Ep.RedisClient.DBOneSAdd(newNameversion, newSnippet)
		}

		newTlsHosts := make(map[string]string)

		for _, newIngressTLS := range newIngressObj.Spec.TLS {
			for _, newTlsHost := range newIngressTLS.Hosts {
				newTlsHosts[newTlsHost] = "1"
			}
		}

		for _, ingressRule := range newIngressObj.Spec.Rules {
			host := ingressRule.Host
			scheme := "http"
			if _, ok := newTlsHosts[host]; ok {
				scheme = "https"
			}

			for _, httpPath := range ingressRule.HTTP.Paths {

				path := httpPath.Path
				hostPath := util.ConstructHostPathString(scheme, host, path)

				service := httpPath.Backend.ServiceName
				port := httpPath.Backend.ServicePort.String()
				svcport := util.ConstructSvcPortString(namespace, service, port)

				g.Ep.RedisClient.DBOneSAdd("temp_"+hostPath, svcport)
				m["temp_"+hostPath] = hostPath

				if newSnippetErr == nil {
					newName := newIngressObj.GetName()
					newVersion := newIngressObj.GetResourceVersion()
					newNameversion := util.ConstructNameVersionString(newNamespace, newName, newVersion)
					g.Ep.RedisClient.DBOneSAdd("temp_"+hostPath, newNameversion)
				}
			}

		}
	}

	for key, value := range m {
		g.Ep.RedisClient.DBOneSUnionStore(value, key)
		g.Ep.RedisClient.DBOneDel(key)
	}
}

// Delete for EventHandler
func (g *IgHandler) Delete(obj interface{}) {
	log.Printf("\n\nIn INGRESS_HANDLER DELETE %#v \n\n", obj)
	g.delete(obj)
	g.Ep.RedisClient.PrintAllKeys()
}

// Helper for Deletes
func (g *IgHandler) delete(obj interface{}) {
	ingressObj, ok := obj.(*v1beta1.Ingress)
	if !ok {
		log.Println("In HandlerIngress Delete; cannot cast to *v1beta1.Ingress")
		return
	}

	namespace := ingressObj.GetNamespace()
	ingressClass, _ := util.ExtractIngressClass(ingressObj.GetAnnotations())
	if !g.Ep.NsManager.IncludeNamespace(namespace) || !g.Ep.ATSManager.IncludeIngressClass(ingressClass) {
		log.Println("Namespace not included or Ingress Class not matched")
		return
	}

	_, snippetErr := util.ExtractServerSnippet(ingressObj.GetAnnotations())

	tlsHosts := make(map[string]string)

	for _, ingressTLS := range ingressObj.Spec.TLS {
		for _, tlsHost := range ingressTLS.Hosts {
			tlsHosts[tlsHost] = "1"
		}
	}

	for _, ingressRule := range ingressObj.Spec.Rules {
		host := ingressRule.Host
		scheme := "http"
		if _, ok := tlsHosts[host]; ok {
			scheme = "https"
		}

		for _, httpPath := range ingressRule.HTTP.Paths {

			path := httpPath.Path
			hostPath := util.ConstructHostPathString(scheme, host, path)
			service := httpPath.Backend.ServiceName
			port := httpPath.Backend.ServicePort.String()
			svcport := util.ConstructSvcPortString(namespace, service, port)

			g.Ep.RedisClient.DBOneSRem(hostPath, svcport)

			if snippetErr == nil {
				name := ingressObj.GetName()
				version := ingressObj.GetResourceVersion()
				nameversion := util.ConstructNameVersionString(namespace, name, version)
				g.Ep.RedisClient.DBOneSRem(hostPath, nameversion)
			}
		}

	}
}

// GetResourceName returns the resource name
func (g *IgHandler) GetResourceName() string {
	return g.ResourceName
}
