package main

import (
	"fmt"
	"html/template"
	"net"
	"net/http"
	"strings"
)

var tpl = template.Must(template.ParseFiles("biba.html"))

type IPv4 struct {
	IpAddress  string
	NetMask    string
	DefGateway string
	MainDNS    string
	AltDNS     string
}

func main() {

	mux := http.NewServeMux()
	mux.HandleFunc("/info", info)
	mux.HandleFunc("/error", err)
	mux.HandleFunc("/", indexHandler)
	http.ListenAndServe(":8080", mux)

}
func err(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Давай назад!")
}
func info(w http.ResponseWriter, r *http.Request) {
	IP_Address := r.FormValue("IP_Address")
	NET_Mask := r.FormValue("NET_Mask")
	Def_gateway := r.FormValue("Def_gateway")
	Main_DNS := r.FormValue("Main_DNS")
	Alt_DNS := r.FormValue("Alt_DNS")
	if IP_Address == "" || NET_Mask == "" {

		http.Redirect(w, r, "/error", http.StatusSeeOther)

	}
	if !valid(IP_Address) || !valid(NET_Mask) || !valid(Def_gateway) || !valid(Main_DNS) || !valid(Alt_DNS) {
		http.Redirect(w, r, "/error", http.StatusSeeOther)
	}

	if !validMask(NET_Mask) {
		http.Redirect(w, r, "/error", http.StatusSeeOther)
	}

	info := IPv4{IpAddress: IP_Address, NetMask: NET_Mask, DefGateway: Def_gateway, MainDNS: Main_DNS, AltDNS: Alt_DNS}

	fmt.Fprintf(w, info.GetAllInfo())

}

func (ip IPv4) GetAllInfo() string {

	return fmt.Sprintf("IP Address: %s \nNet Mask: %s \nDefault Gateway: %s \nDNS-Server: %s \nAlternative DNS-Server: %s", ip.IpAddress, ip.NetMask, ip.DefGateway, ip.MainDNS, ip.AltDNS)

}

func indexHandler(w http.ResponseWriter, r *http.Request) {

	tpl.Execute(w, nil)
}

func valid(ip string) bool {

	Ipv4Addr := net.ParseIP(ip)
	if Ipv4Addr == nil {
		return false
	}
	return true

}

func validMask(mask string) bool {
	count := 0
	s := strings.Split(mask, ".")
	fmt.Println("mask: ", s)
	for i := 0; i < len(s)-1; i++ {
		if s[i] == "255" {
			count++
		}

	}

	if count == 3 && (s[len(s)-1] == "0" || s[len(s)-1] == "128" || s[len(s)-1] == "192" || s[len(s)-1] == "224" || s[len(s)-1] == "240" || s[len(s)-1] == "248" || s[len(s)-1] == "254" || s[len(s)-1] == "255") {
		return true
	}
	return false

}
