package model

import (
	"fmt"
	"github.com/vx3r/wg-gen-web/util"
	"time"
)

// Client structure
type Client struct {
	Id                        string    `json:"id"`
	Name                      string    `json:"name"`
	Email                     string    `json:"email"`
	Enable                    bool      `json:"enable"`
	IgnorePersistentKeepalive bool      `json:"ignorePersistentKeepalive"`
	PresharedKey              string    `json:"presharedKey"`
	AllowedIPs                []string  `json:"allowedIPs"`
	Address                   []string  `json:"address"`
	Tags                      []string  `json:"tags"`
	PrivateKey                string    `json:"privateKey"`
	PublicKey                 string    `json:"publicKey"`
	CreatedBy                 string    `json:"createdBy"`
	UpdatedBy                 string    `json:"updatedBy"`
	Created                   time.Time `json:"created"`
	Updated                   time.Time `json:"updated"`
}

// IsValid check if model is valid
func (a Client) IsValid() []error {
	errs := make([]error, 0)

	// check if the name empty
	if a.Name == "" {
		errs = append(errs, fmt.Errorf("name is required"))
	}
	// check the name field is between 3 to 40 chars
	if len(a.Name) < 2 || len(a.Name) > 40 {
		errs = append(errs, fmt.Errorf("name field must be between 2-40 chars"))
	}
	// email is not required, but if provided must match regex
	if a.Email != "" {
		if !util.RegexpEmail.MatchString(a.Email) {
			errs = append(errs, fmt.Errorf("email %s is invalid", a.Email))
		}
	}
	// check if the allowedIPs empty
	if len(a.AllowedIPs) == 0 {
		errs = append(errs, fmt.Errorf("allowedIPs field is required"))
	}
	// check if the allowedIPs are valid
	for _, allowedIP := range a.AllowedIPs {
		if !util.IsValidCidr(allowedIP) {
			errs = append(errs, fmt.Errorf("allowedIP %s is invalid", allowedIP))
		}
	}
	// check if the address empty
	if len(a.Address) == 0 {
		errs = append(errs, fmt.Errorf("address field is required"))
	}
	// check if the address are valid
	for _, address := range a.Address {
		if !util.IsValidCidr(address) {
			errs = append(errs, fmt.Errorf("address %s is invalid", address))
		}
	}

	return errs
}