package v1

import (
	"database/sql"
	"time"

	"gorm.io/plugin/soft_delete"
)

type CloudResource struct {
	ID           uint64        `json:"id" gorm:"primary_key;AUTO_INCREMENT;column:id"`
	CreatedAt    time.Time     `json:"createdAt" gorm:"column:createdAt"`
	UpdatedAt    sql.NullTime  `json:"updatedAt" gorm:"column:updatedAt"`
	DeletedAt    sql.NullTime  `json:"deletedAt" gorm:"column:deletedAt"`
	ManagementID string        `json:"managementID" gorm:"column:managementID"`
	ProviderID   uint64        `json:"providerID" gorm:"column:providerID"`
	Provider     CloudProvider `json:"provider" gorm:"foreignkey:ProviderID;references:ID"`
	CloudInsID   string        `json:"cloudInsID" gorm:"column:cloudInsID"`
	Name         string        `json:"name" gorm:"column:name"`
	OwnerLarkID  string        `json:"ownerLarkID" gorm:"column:ownerLarkID"`
	Owner        User          `json:"owner" gorm:"foreignkey:OwnerLarkID;references:LarkUserID"`
	Desc         string        `json:"desc" gorm:"column:desc"`
	DepartLarkID string        `json:"departLarkID" gorm:"column:departLarkID"`
	Department   Department    `json:"department" gorm:"foreignkey:DepartLarkID;references:LarkID"`
	// 0 for unknown, 1 for self-managed, 2 for it-managed
	ManagementType int `json:"managementType" gorm:"column:managementType"`
	// 0 for unknown, 1 for sso, 2 for iam
	AuthType  int                   `json:"authType" gorm:"column:authType"`
	ClassType string                `json:"classType" gorm:"column:classType"`
	IsDel     soft_delete.DeletedAt `json:"isDel" gorm:"column:isDel;softDelete:flag,DeletedAtField:DeletedAt"`
}

func (c *CloudResource) TableName() string {
	return "cloud_resource"
}

type GetCloudResourceDetailMemIt struct {
	ID     uint64          `json:"id"`
	Member User            `json:"member"`
	Role   CloudMemberRole `json:"role"`
}

type InvoiceWithDate struct {
	DateStr string  `json:"dateStr" gorm:"column:dateStr"`
	Cost    float64 `json:"cost" gorm:"column:cost"`
	Budget  float64 `json:"budget" gorm:"column:budget"`
}

type GetCloudResourceDetailData struct {
	Resource           *CloudResource                `json:"resource"`
	Departments        []Department                  `json:"departments"`
	Owner              User                          `json:"owner"`
	Members            []GetCloudResourceDetailMemIt `json:"members"`
	DailyCost          []DailyProductCost            `json:"dailyCost"`
	HistoricalInvoices []InvoiceWithDate             `json:"historicalInvoices"`
	BudgetPlanning     []CloudResourceBudget         `json:"budgetPlanning"`
	Alerts             []Alert                       `json:"alerts"`
	SecurityAdvisors   []TrustAdvisor                `json:"securityAdvisors"`
}

type Alert struct {
	ID           uint64           `json:"id"`
	Threshold    float64          `json:"threshold"`
	Type         int              `json:"type"`
	Receivers    []*AlertReceiver `json:"receivers"`
	ThresholdNum float64          `json:"thresholdNum"`
	Options      string           `json:"options"`
	StartDate    string           `json:"startDate"`
	EndDate      string           `json:"endDate"`
}

type AlertReceiver struct {
	Type   string `json:"type"`
	Name   string `json:"name"`
	Avatar string `json:"avatar"`
	LarkID string `json:"larkID"`
}

type UpdateCloudResourceBody struct {
	MID         string `json:"mid"`
	Description string `json:"description"`
}

type SearchCloudResourceData struct {
	Pagination *Pagination      `json:"pagination"`
	Items      []*CloudResource `json:"items"`
}

type TransferResourceBody struct {
	MID          string `json:"mid"`
	Description  string `json:"description"`
	DepartmentID string `json:"departmentID"`
	OwnerID      string `json:"ownerID"`
}
