package models

import (
	"fmt"
	"time"
)

type LoadBalancer struct {
	ID            int       `json:"id"`
	VendorId      int       `json:"vendor_id"`
	LbName        string    `json:"lb_name"`
	LbId          string    `json:"lb_id"`
	NetworkType   string    `json:"network_type"`
	IpAddress     string    `json:"ip_address"`
	App           string    `json:"app"`
	Owner         string    `json:"owner"`
	Remark        string    `json:"remark"`
	Tag           string    `json:"tag"`
	VpcId         string    `json:"vpc_id"`
	SubnetId      string    `json:"subnet_id"`
	RegionId      string    `json:"region_id"`
	ProjectId     string    `json:"project_id"`
	ListenerCount int       `json:"listener_count"`
	CreateTime    time.Time `json:"create_time"`
}

type LoadBalancerListener struct {
}

func CreateLoadBalancer(lb interface{}, lbId string) (err error) {
	if db.Where("lb_id = ?", lbId).First(&LoadBalancer{}).RecordNotFound() {
		err = db.Create(lb).Error
		return err
	}
	err = db.Model(&LoadBalancer{}).Where("lb_id = ?", lbId).Updates(lb).Error
	return
}

func GetLoadBalancer(key string, vendorId int, pageNum int, pageSize int) (lb []LoadBalancer) {
	selectSql := fmt.Sprintf("SELECT * FROM load_balancer WHERE Id > 0 ")
	if vendorId != 0 {
		selectSql += fmt.Sprintf("AND vendor_id = %d ", vendorId)
	}

	if key != "" {
		selectSql += fmt.Sprintf(` AND (lb_name LIKE '%%%s%%' OR ip_address LIKE '%%%s%%')`, key, key)
	}
	db.Raw(selectSql).Offset(pageNum).Limit(pageSize).Scan(&lb)
	return
}

func GetLoadBalancerTotal(key string, vendorId int) (count int) {
	selectSql := fmt.Sprintf("SELECT COUNT(*) FROM load_balancer WHERE Id > 0 ")
	if vendorId != 0 {
		selectSql += fmt.Sprintf("AND vendor_id = %d ", vendorId)
	}
	if key != "" {
		selectSql += fmt.Sprintf(` AND (lb_name LIKE '%%%s%%' OR ip_address LIKE '%%%s%%')`, key, key)
	}
	db.Raw(selectSql).Count(&count)
	return
}

func UpdateLoadBalancer(id int, app string, owner string, remark string) (err error) {
	err = db.Model(&LoadBalancer{}).Where("id = ?", id).Updates(
		LoadBalancer{
			App:    app,
			Owner:  owner,
			Remark: remark,
		}).Error
	return
}
