package models

import "fmt"

type Application struct {
	Id          int    `json:"id"`
	Name        string `json:"name"`
	NameCn      string `json:"name_cn"`
	Category    string `json:"category"`
	RepoName    string `json:"repo_name"`
	RepoUrl     string `json:"repo_url"`
	Status      string `json:"status"`
	Owner       string `json:"owner"`
	Description string `json:"description"`
}

type AppResource struct {
	ResourceName string `json:"resource_name"`
	ResourceType string `json:"resource_type"`
	ResourceId   string `json:"resource_id"`
	PublicIp     string `json:"public_ip"`
	PrivateIp    string `json:"private_ip"`
	VendorId     int    `json:"vendor_id"`
	Owner        string `json:"owner"`
}

func GetAppName() (app []Application) {
	db.Raw(`SELECT * FROM application`).Scan(&app)
	return
}

func GetApp(category string, key string, page int, pageSize int) (app []Application) {
	var tmpApp []Application

	selectSql := fmt.Sprintf(`SELECT * FROM application WHERE id > 0 `)
	if category != "" {
		selectSql += fmt.Sprintf(` AND category = '%s'`, category)
	}
	if key != "" {
		selectSql += fmt.Sprintf(` AND (name LIKE '%%%s%%' OR repo_url LIKE '%%%s%%')`, key, key)
	}

	db.Raw(selectSql).Offset(page).Limit(pageSize).Scan(&tmpApp)

	return tmpApp
}

func GetAppTotal(category string, key string) (count int) {
	selectSql := fmt.Sprintf(`SELECT COUNT(*) FROM application WHERE id > 0 `)
	if category != "" {
		selectSql += fmt.Sprintf(` AND category = '%s'`, category)
	}
	if key != "" {
		selectSql += fmt.Sprintf(` AND name LIKE '%%%s%%'`, key)
	}
	db.Raw(selectSql).Count(&count)
	return
}

func CreateApp(record interface{}) (err error) {
	err = db.Create(record).Error
	return
}

func UpdateApp(app Application) (err error) {
	err = db.Model(&app).Updates(app).Error
	return
}

func DeleteApp(id int) (err error) {
	err = db.Delete(Application{}, "id = ?", id).Error
	return
}

func GetAppResource(appName string, page int, pageSize int) (appResource []AppResource) {
	// 1. 查询 server 表
	selectSql := fmt.Sprintf(
		`SELECT name as resource_name, instance_type as resource_type, instance_id as resource_id, 
       public_ip, private_ip, vendor_id, owner FROM server WHERE app = '%s'`, appName)

	// 2. 查询 lb 表
	selectSql += fmt.Sprintf(
		` UNION SELECT lb_name as resource_name, 'lb' as resource_type, lb_id as resource_id,
		   (SELECT IF (network_type = 'public', ip_address, '-' )) as public_ip, 
			(SELECT IF (network_type = 'internal', ip_address, '-')) as private_ip, 
			vendor_id, owner FROM load_balancer WHERE app = '%s' `, appName)

	db.Raw(selectSql).Offset(page).Limit(pageSize).Scan(&appResource)

	return
}

func GetAppResourceTotal(appName string) (count int) {
	selectSql := fmt.Sprintf(
		`SELECT SUM(
    (SELECT COUNT(*) FROM server WHERE app = '%s') + 
    (SELECT COUNT(*) FROM load_balancer WHERE app = '%s')
    ) AS count;`, appName, appName)

	db.Raw(selectSql).Count(&count)
	return
}
