package models

import (
	"fmt"
	"time"
)

type Domain struct {
	Id          int       `json:"id"`
	Name        string    `json:"name"`
	Grade       string    `json:"grade"`
	VendorId    int       `json:"vendor_id"`
	Status      string    `json:"status"` /*enable,disable*/
	Possessor   string    `json:"possessor"`
	DnsNums     int       `json:"dns_nums"`
	IsIcp       int       `json:"is_icp"`
	IcpCode     string    `json:"icp_code"`
	Owner       string    `json:"owner"`
	Remark      string    `json:"remark"`
	CreateTime  time.Time `json:"create_time"`
	ExpiredTime time.Time `json:"expired_time"`
}

func GetDomain(key string, vendorId int, pageNum int, pageSize int) (domain []Domain) {
	var tmpDomain []Domain

	selectSql := fmt.Sprintf(`SELECT a.*, b.dns_nums FROM domain AS a 
    LEFT JOIN 
    ((SELECT zone_name, COUNT(*) AS dns_nums FROM dns_record GROUP BY zone_name )AS b) 
    ON a.name = b.zone_name 
    WHERE a.id > 0 `)

	if key != "" {
		selectSql += fmt.Sprintf(` AND name LIKE '%%%s%%'`, key)
	}
	if vendorId != 0 {
		selectSql += fmt.Sprintf(` AND vendor_id = %d`, vendorId)
	}

	db.Raw(selectSql).Order("b.dns_nums DESC").Offset(pageNum).Limit(pageSize).Scan(&tmpDomain)

	return tmpDomain
}

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

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

func UpdateDomainRecord(domain Domain) (err error) {
	err = db.Model(&domain).Update(domain).Error
	return
}

func DeleteDomainRecord(domainName string) (err error) {
	err = db.Where("name = ?", domainName).Delete(Domain{}).Error
	return
}
