package model

import (
	"database/sql"
	"encoding/json"
	"time"

	"cloud.google.com/go/bigquery"
	"gorm.io/gorm"
)

// RevenueOrderData represents the revrec_order_test table structure
type RevenueOrderData struct {
	TenantID                      bigquery.NullString  `bigquery:"tenant_id" json:"tenant_id"`
	BillMonth                     bigquery.NullString  `bigquery:"bill_month" json:"bill_month"`
	IsNewOrder                    bigquery.NullBool    `bigquery:"is_new_order" json:"is_new_order"`
	AccountID                     bigquery.NullString  `bigquery:"account_id" json:"account_id"`
	AccountName                   bigquery.NullString  `bigquery:"account_name" json:"account_name"`
	AccountSurrogateKey           bigquery.NullString  `bigquery:"account_surrogate_key" json:"account_surrogate_key"`
	AccountRegion                 bigquery.NullString  `bigquery:"account_region" json:"account_region"`
	PaymentType                   bigquery.NullString  `bigquery:"payment_type" json:"payment_type"`
	IsNewSalesforceOrder          bigquery.NullBool    `bigquery:"is_new_salesforce_order" json:"is_new_salesforce_order"`
	StripeTaxRate                 bigquery.NullString  `bigquery:"stripe_tax_rate" json:"stripe_tax_rate"`
	CollectionsFrom               bigquery.NullString  `bigquery:"collections_from" json:"collections_from"`
	OrderNumber                   bigquery.NullString  `bigquery:"order_number" json:"order_number"`
	OrderStartDate                bigquery.NullDate    `bigquery:"order_start_date" json:"order_start_date"`
	OrderEndDate                  bigquery.NullDate    `bigquery:"order_end_date" json:"order_end_date"`
	OrderBillingStartDate         bigquery.NullDate    `bigquery:"order_billing_start_date" json:"order_billing_start_date"`
	OrderBillingEndDate           bigquery.NullDate    `bigquery:"order_billing_end_date" json:"order_billing_end_date"`
	EndDate                       bigquery.NullDate    `bigquery:"end_date" json:"end_date"`
	ActualRevenueRecognitionDate  bigquery.NullString  `bigquery:"actual_revenue_recognition_date" json:"actual_revenue_recognition_date"`
	OrderDeferredRevenueUSD       bigquery.NullFloat64 `bigquery:"order_deferred_revenue_usd" json:"order_deferred_revenue_usd"`
	OrderTerminationDate          bigquery.NullString  `bigquery:"order_termination_date" json:"order_termination_date"`
	OrderTotalFeesUSD             bigquery.NullFloat64 `bigquery:"order_total_fees_usd" json:"order_total_fees_usd"`
	OrderAccumulatedRevenueBefore bigquery.NullFloat64 `bigquery:"order_accumulated_revenue_before_adjust" json:"order_accumulated_revenue_before_adjust"`
	OrderAccumulatedCreditAmount  bigquery.NullFloat64 `bigquery:"order_accumulated_credit_amount" json:"order_accumulated_credit_amount"`
	RevenueAmount                 bigquery.NullFloat64 `bigquery:"revenue_amount" json:"revenue_amount"`
	CreditAmount                  bigquery.NullFloat64 `bigquery:"credit_amount" json:"credit_amount"`
	DedicatedRevenueAmount        bigquery.NullFloat64 `bigquery:"dedicated_revenue_amount" json:"dedicated_revenue_amount"`
	ServerlessRevenueAmount       bigquery.NullFloat64 `bigquery:"serverless_revenue_amount" json:"serverless_revenue_amount"`
	SupportRevenueAmount          bigquery.NullFloat64 `bigquery:"support_revenue_amount" json:"support_revenue_amount"`
	EssentialRevenueAmount        bigquery.NullFloat64 `bigquery:"essential_revenue_amount" json:"essential_revenue_amount"`
	StarterRevenueAmount          bigquery.NullFloat64 `bigquery:"starter_revenue_amount" json:"starter_revenue_amount"`
	PremiumRevenueAmount          bigquery.NullFloat64 `bigquery:"premium_revenue_amount" json:"premium_revenue_amount"`
	LakeRevenueAmount             bigquery.NullFloat64 `bigquery:"lake_revenue_amount" json:"lake_revenue_amount"`
	ByocRevenueAmount             bigquery.NullFloat64 `bigquery:"byoc_revenue_amount" json:"byoc_revenue_amount"`
	AdjustedRevenueAmount         bigquery.NullFloat64 `bigquery:"adjusted_revenue_amount" json:"adjusted_revenue_amount"`
	AdjustedServerlessAmount      bigquery.NullFloat64 `bigquery:"adjusted_serverless_amount" json:"adjusted_serverless_amount"`
	AdjustedDedicatedAmount       bigquery.NullFloat64 `bigquery:"adjusted_dedicated_amount" json:"adjusted_dedicated_amount"`
	AdjustedSupportAmount         bigquery.NullFloat64 `bigquery:"adjusted_support_amount" json:"adjusted_support_amount"`
	AdjustedEssentialAmount       bigquery.NullFloat64 `bigquery:"adjusted_essential_amount" json:"adjusted_essential_amount"`
	AdjustedStarterAmount         bigquery.NullFloat64 `bigquery:"adjusted_starter_amount" json:"adjusted_starter_amount"`
	AdjustedShortfallAmount       bigquery.NullFloat64 `bigquery:"adjusted_shortfall_amount" json:"adjusted_shortfall_amount"`
	AdjustedPremiumAmount         bigquery.NullFloat64 `bigquery:"adjusted_premium_amount" json:"adjusted_premium_amount"`
	AdjustedLakeAmount            bigquery.NullFloat64 `bigquery:"adjusted_lake_amount" json:"adjusted_lake_amount"`
	AdjustedByocAmount            bigquery.NullFloat64 `bigquery:"adjusted_byoc_amount" json:"adjusted_byoc_amount"`
}

// OrgCollectionData represents the revrec_org_test table structure
type OrgCollectionData struct {
	BillMonth                  bigquery.NullString  `bigquery:"bill_month" json:"bill_month"`
	AdjustTenantID             bigquery.NullString  `bigquery:"adjust_tenant_id" json:"adjust_tenant_id"`
	StartDate                  bigquery.NullDate    `bigquery:"start_date" json:"start_date"`
	EndDate                    bigquery.NullDate    `bigquery:"end_date" json:"end_date"`
	AccountID                  bigquery.NullString  `bigquery:"account_id" json:"account_id"`
	AccountName                bigquery.NullString  `bigquery:"account_name" json:"account_name"`
	AccountRegion              bigquery.NullString  `bigquery:"account_region" json:"account_region"`
	AccountSurrogateKey        bigquery.NullString  `bigquery:"account_surrogate_key" json:"account_surrogate_key"`
	IsCreateInvoice            bigquery.NullBool    `bigquery:"is_create_invoice" json:"is_create_invoice"`
	MarketplaceAmount          bigquery.NullFloat64 `bigquery:"marketplace_amount" json:"marketplace_amount"`
	StripeAmount               bigquery.NullString  `bigquery:"stripe_amount" json:"stripe_amount"`
	WireTransferAmount         bigquery.NullFloat64 `bigquery:"wire_transfer_amount" json:"wire_transfer_amount"`
	TotalAmount                bigquery.NullFloat64 `bigquery:"total_amount" json:"total_amount"`
	StripeTaxRate              bigquery.NullString  `bigquery:"stripe_tax_rate" json:"stripe_tax_rate"`
	StripeAmountIncludingTax   bigquery.NullString  `bigquery:"stripe_amount_including_tax" json:"stripe_amount_including_tax"`
	StripeInvoiceNumber        bigquery.NullString  `bigquery:"stripe_invoice_number" json:"stripe_invoice_number"`
	StripeInvoice              bigquery.NullString  `bigquery:"stripe_invoice" json:"stripe_invoice"`
	StripeInvoicePaid          bigquery.NullString  `bigquery:"stripe_invoice_paid" json:"stripe_invoice_paid"`
	StripeInvoiceFinalizedDate bigquery.NullString  `bigquery:"stripe_invoice_finalized_date" json:"stripe_invoice_finalized_date"`
	StripeInvoicePaidDate      bigquery.NullString  `bigquery:"stripe_invoice_paid_date" json:"stripe_invoice_paid_date"`
	InvoiceAmount              bigquery.NullFloat64 `bigquery:"invoice_amount" json:"invoice_amount"`
}

// OrgBq represents the legacy structure from the old single table
type OrgBq struct {
	BillMonth                  bigquery.NullString  `bigquery:"bill_month" json:"bill_month"`
	StartDate                  bigquery.NullDate    `bigquery:"start_date" json:"start_date"`
	EndDate                    bigquery.NullDate    `bigquery:"end_date" json:"end_date"`
	AdjustTenantID             bigquery.NullString  `bigquery:"adjust_tenant_id" json:"adjust_tenant_id"`
	OriginalTenantID           bigquery.NullString  `bigquery:"original_tenant_id" json:"original_tenant_id"`
	AccountID                  bigquery.NullString  `bigquery:"account_id" json:"account_id"`
	AccountName                bigquery.NullString  `bigquery:"account_name" json:"account_name"`
	StripeTaxRate              bigquery.NullString  `bigquery:"stripe_tax_rate" json:"stripe_tax_rate"`
	StripeAmountIncludingTax   bigquery.NullString  `bigquery:"stripe_amount_including_tax" json:"stripe_amount_including_tax"`
	StripeInvoiceNumber        bigquery.NullString  `bigquery:"stripe_invoice_number" json:"stripe_invoice_number"`
	StripeInvoice              bigquery.NullString  `bigquery:"stripe_invoice" json:"stripe_invoice"`
	StripeInvoicePaid          bigquery.NullString  `bigquery:"stripe_invoice_paid" json:"stripe_invoice_paid"`
	StripeInvoiceFinalizedDate bigquery.NullString  `bigquery:"stripe_invoice_finalized_date" json:"stripe_invoice_finalized_date"`
	StripeInvoicePaidDate      bigquery.NullString  `bigquery:"stripe_invoice_paid_date" json:"stripe_invoice_paid_date"`
	NeedNewOrder               bigquery.NullString  `bigquery:"need_new_order" json:"need_new_order"`
	NewOrderStartDate          bigquery.NullDate    `bigquery:"new_order_start_date" json:"new_order_start_date"`
	NewOrderEndDate            bigquery.NullDate    `bigquery:"new_order_end_date" json:"new_order_end_date"`
	NewOrderAmount             bigquery.NullFloat64 `bigquery:"new_order_amount" json:"new_order_amount"`
	NewOrderDedicatedAmount    bigquery.NullFloat64 `bigquery:"new_order_dedicated_amount" json:"new_order_dedicated_amount"`
	NewOrderStarterAmount      bigquery.NullFloat64 `bigquery:"new_order_starter_amount" json:"new_order_starter_amount"`
	NewOrderSupportAmount      bigquery.NullFloat64 `bigquery:"new_order_support_amount" json:"new_order_support_amount"`
	OrderNumber                bigquery.NullString  `bigquery:"order_number" json:"order_number"`
	RevenueAmount              bigquery.NullFloat64 `bigquery:"revenue_amount" json:"revenue_amount"`
	DedicatedRevenueAmount     bigquery.NullFloat64 `bigquery:"dedicated_revenue_amount" json:"dedicated_revenue_amount"`
	StarterRevenueAmount       bigquery.NullFloat64 `bigquery:"starter_revenue_amount" json:"starter_revenue_amount"`
	SupportRevenueAmount       bigquery.NullFloat64 `bigquery:"support_revenue_amount" json:"support_revenue_amount"`
	OrderNumber2               bigquery.NullString  `bigquery:"order_number2" json:"order_number2"`
	RevenueAmount2             bigquery.NullFloat64 `bigquery:"revenue_amount2" json:"revenue_amount2"`
	DedicatedRevenueAmount2    bigquery.NullFloat64 `bigquery:"dedicated_revenue_amount2" json:"dedicated_revenue_amount2"`
	StarterRevenueAmount2      bigquery.NullFloat64 `bigquery:"starter_revenue_amount2" json:"starter_revenue_amount2"`
	SupportRevenueAmount2      bigquery.NullFloat64 `bigquery:"support_revenue_amount2" json:"support_revenue_amount2"`
	CollectionsFrom            bigquery.NullString  `bigquery:"collections_from" json:"collections_from"`
	AdjustedDedicatedAmount    bigquery.NullFloat64 `bigquery:"adjusted_dedicated_amount" json:"adjusted_dedicated_amount"`
	AdjustedDedicatedAmount2   bigquery.NullFloat64 `bigquery:"adjusted_dedicated_amount2" json:"adjusted_dedicated_amount2"`
	AdjustedStarterAmount      bigquery.NullFloat64 `bigquery:"adjusted_starter_amount" json:"adjusted_starter_amount"`
	AdjustedStarterAmount2     bigquery.NullFloat64 `bigquery:"adjusted_starter_amount2" json:"adjusted_starter_amount2"`
	AdjustedSupportAmount      bigquery.NullFloat64 `bigquery:"adjusted_support_amount" json:"adjusted_support_amount"`
	AdjustedSupportAmount2     bigquery.NullFloat64 `bigquery:"adjusted_support_amount2" json:"adjusted_support_amount2"`
	AdjustedShortfallAmount    bigquery.NullFloat64 `bigquery:"adjusted_shortfall_amount" json:"adjusted_shortfall_amount"`
	AdjustedShortfallAmount2   bigquery.NullFloat64 `bigquery:"adjusted_shortfall_amount2" json:"adjusted_shortfall_amount2"`
	CreditAmount               bigquery.NullFloat64 `bigquery:"credit_amount" json:"credit_amount"`
	CreditAmount2              bigquery.NullFloat64 `bigquery:"credit_amount2" json:"credit_amount2"`
	AdjustedRevenueAmount      bigquery.NullFloat64 `bigquery:"adjusted_revenue_amount" json:"adjusted_revenue_amount"`
	AdjustedRevenueAmount2     bigquery.NullFloat64 `bigquery:"adjusted_revenue_amount2" json:"adjusted_revenue_amount2"`
	// Added support for essentials revenue amount
	EssentialRevenueAmount   bigquery.NullFloat64 `bigquery:"essential_revenue_amount" json:"essential_revenue_amount"`
	EssentialRevenueAmount2  bigquery.NullFloat64 `bigquery:"essential_revenue_amount2" json:"essential_revenue_amount2"`
	NewOrderEssentialAmount  bigquery.NullFloat64 `bigquery:"new_order_essential_amount" json:"new_order_essential_amount"`
	AdjustedEssentialAmount  bigquery.NullFloat64 `bigquery:"adjusted_essential_amount" json:"adjusted_essential_amount"`
	AdjustedEssentialAmount2 bigquery.NullFloat64 `bigquery:"adjusted_essential_amount2" json:"adjusted_essential_amount2"`
	NewOrderPremiumAmount    bigquery.NullFloat64 `bigquery:"new_order_premium_amount" json:"new_order_premium_amount"`
	AdjustedPremiumAmount    bigquery.NullFloat64 `bigquery:"adjusted_premium_amount" json:"adjusted_premium_amount"`
	AdjustedPremiumAmount2   bigquery.NullFloat64 `bigquery:"adjusted_premium_amount2" json:"adjusted_premium_amount2"`
}

type OrderBq struct {
	ID        bigquery.NullString `bigquery:"id" json:"id"`
	Name      bigquery.NullString `bigquery:"name" json:"name"`
	IsDeleted bigquery.NullBool   `bigquery:"is_deleted" json:"is_deleted"`
}

type AccountBq struct {
	ID          bigquery.NullString `bigquery:"id" json:"id"`
	AccountName bigquery.NullString `bigquery:"account_id_c" json:"account_id_c"`
}

type CloudOrder struct {
	ID                   uint64         `gorm:"primaryKey;autoIncrement:true" json:"id" csv:"id"`
	CreatedAt            time.Time      `gorm:"not null;default:CURRENT_TIMESTAMP" json:"created_at" csv:"created_at"`
	UpdatedAt            sql.NullTime   `gorm:"default:null" json:"updated_at,omitempty" csv:"updated_at"`
	DeletedAt            gorm.DeletedAt `gorm:"default:null" json:"deleted_at,omitempty" csv:"deleted_at"`
	OrderStartDate       string         `gorm:"type:varchar(64);not null" json:"order_start_date" csv:"order_start_date"`
	OrderEndDate         string         `gorm:"type:varchar(64);not null" json:"order_end_date" csv:"order_end_date"`
	Status               string         `gorm:"type:varchar(20)" json:"status" csv:"status"`
	AccountID            string         `gorm:"type:varchar(255)" json:"account_id" csv:"account_id"`
	Tax                  string         `gorm:"type:varchar(20)" json:"tax" csv:"tax"`
	NetFee               string         `gorm:"type:varchar(64)" json:"net_fee" csv:"net_fee"`
	BillMonth            string         `gorm:"type:varchar(20)" json:"bill_month" csv:"bill_month"`
	OriginalTenantID     string         `gorm:"type:varchar(128)" json:"original_tenant_id" csv:"original_tenant_id"`
	AdjustTenantID       string         `gorm:"type:varchar(128)" json:"adjust_tenant_id" csv:"adjust_tenant_id"`
	AccountNumber        string         `gorm:"type:varchar(128)" json:"account_number" csv:"account_number"`
	AccountName          string         `gorm:"type:varchar(64)" json:"account_name" csv:"account_name"`
	AccountSurrogateKey  string         `gorm:"type:varchar(128)" json:"account_surrogate_key" csv:"account_surrogate_key"`
	AccountRegion        string         `gorm:"type:varchar(64)" json:"account_region" csv:"account_region"`
	IsNewSalesforceOrder bool           `gorm:"type:tinyint" json:"is_new_salesforce_order" csv:"is_new_salesforce_order"`
	NewOrderID           string         `gorm:"type:varchar(128)" json:"new_order_id" csv:"new_order_id"`
	NewOrderNumber       string         `gorm:"type:varchar(128)" json:"new_order_number" csv:"new_order_number"`
	Sync                 int            `gorm:"type:tinyint" json:"sync" csv:"sync"`
	SyncTime             time.Time      `gorm:"default:null" json:"sync_time,omitempty" csv:"sync_time"`
	FakeNumber           string         `gorm:"type:varchar(128)" json:"fake_number" csv:"fake_number"`

	RowLock      bool   `json:"row_lock" csv:"row_lock"`
	RevrecEntity string `json:"revrec_entity" csv:"revrec_entity"`
}

func (CloudOrder) TableName() string {
	return "monthly_cloud_order"
}

type BiOrder struct {
	OrderStartDate   string ` json:"OrderStartDate"`
	OrderEndDate     string ` json:"OrderEndDate"`
	ServiceStartDate string ` json:"ServiceStartDate"`
	ServiceEndDate   string ` json:"ServiceEndDate"`
	Tax              string ` json:"Tax"`
	Status           string ` json:"Status"`
	NetFees          string ` json:"NetFees"`
	BillMonth        string ` json:"BillMonth"`
	OriginalTenantID string ` json:"OriginalTenantID"`
	AdjustTenantID   string ` json:"AdjustTenantID"`
	AccountNumber    string ` json:"AccountNumber"`
	AccountName      string ` json:"AccountName"`
	OrderNumber      string ` json:"OrderNumber"`
	CreatedAt        string ` json:"CreatedAt"`
}

type CloudRevrec struct {
	ID                      uint64         `gorm:"primaryKey;autoIncrement:true" json:"id" csv:"id"`
	CreatedAt               time.Time      `gorm:"not null;default:CURRENT_TIMESTAMP" json:"created_at" csv:"created_at"`
	UpdatedAt               sql.NullTime   `gorm:"default:null" json:"updated_at,omitempty" csv:"updated_at"`
	DeletedAt               gorm.DeletedAt `gorm:"default:null" json:"deleted_at,omitempty" csv:"deleted_at"`
	Date                    string         `gorm:"type:varchar(64);not null;default:0" json:"date" csv:"date"`
	BillingEndDate          string         `gorm:"type:varchar(64);not null" json:"billing_end_date" csv:"billing_end_date"`
	Status                  string         `gorm:"type:varchar(64);not null" json:"status" csv:"status"`
	Order                   string         `gorm:"type:varchar(128)" json:"order" csv:"order"`
	OrderNumber             string         `gorm:"type:varchar(128)" json:"order_number" csv:"order_number"`
	Type                    int            `gorm:"type:tinyint" json:"type" csv:"type"`
	BillMonth               string         `gorm:"type:varchar(20)" json:"bill_month" csv:"bill_month"`
	OriginalTenantID        string         `gorm:"type:varchar(128)" json:"original_tenant_id" csv:"original_tenant_id"`
	AdjustTenantID          string         `gorm:"type:varchar(128)" json:"adjust_tenant_id" csv:"adjust_tenant_id"`
	AccountNumber           string         `gorm:"type:varchar(128)" json:"account_number" csv:"account_number"`
	AccountName             string         `gorm:"type:varchar(64)" json:"account_name" csv:"account_name"`
	AccountSurrogateKey     string         `gorm:"type:varchar(128)" json:"account_surrogate_key" csv:"account_surrogate_key"`
	AccountRegion           string         `gorm:"type:varchar(64)" json:"account_region" csv:"account_region"`
	AdjustedStarterAmount   string         `json:"adjusted_starter_amount" csv:"adjusted_starter_amount"`
	AdjustedDedicatedAmount string         `json:"adjusted_dedicated_amount" csv:"adjusted_dedicated_amount"`
	AdjustedSupportAmount   string         `json:"adjusted_support_amount" csv:"adjusted_support_amount"`
	CurrencyIsoCode         string         `json:"currency_iso_code" csv:"currency_iso_code"`
	ShortfallAmount         string         `json:"shortfall_amount" csv:"shortfall_amount"`
	RevenueAmount           string         `json:"revenue_amount" csv:"revenue_amount"`
	CreditAmount            string         `json:"credit_amount" csv:"credit_amount"`
	AdjustedRevenueAmount   string         `json:"adjusted_revenue_amount" csv:"adjusted_revenue_amount"`
	AdjustedShortfallAmount string         `json:"adjusted_shortfall_amount" csv:"adjusted_shortfall_amount"`
	AdjustedEssentialAmount string         `json:"adjusted_essential_amount" csv:"adjusted_essential_amount"`
	AdjustedPremiumAmount   string         `json:"adjusted_premium_amount" csv:"adjusted_premium_amount"`
	AdjustedLakeAmount      string         `json:"adjusted_lake_amount" csv:"adjusted_lake_amount"`
	AdjustedByocAmount      string         `json:"adjusted_byoc_amount" csv:"adjusted_byoc_amount"`

	PaymentType  string    `gorm:"type:varchar(64)" json:"payment_type" csv:"payment_type"`
	RevrecID     string    `gorm:"type:varchar(128)" json:"revrec_id" csv:"revrec_id"`
	RevrecNumber string    `gorm:"type:varchar(128)" json:"revrec_number" csv:"revrec_number"`
	Sync         int       `gorm:"type:tinyint" json:"sync" csv:"sync"`
	SyncTime     time.Time `gorm:"default:null" json:"sync_time,omitempty" csv:"sync_time"`

	ExchangeRateToUse string `json:"exchange_rate_to_use" csv:"exchange_rate_to_use"`
	RowLock           bool   `json:"row_lock" csv:"row_lock"`
	Estimate          bool   `gorm:"column:estimate;type:tinyint" json:"estimate" csv:"estimate"`

	EstimatedRevenueAmount       string `gorm:"type:varchar(64)" json:"estimated_revenue_amount" csv:"estimated_revenue_amount"`
	ActualRevenueAmount          string `gorm:"type:varchar(64)" json:"actual_revenue_amount" csv:"actual_revenue_amount"`
	ActualRevenueRecognitionDate string `gorm:"type:varchar(64)" json:"actual_revenue_recognition_date" csv:"actual_revenue_recognition_date"`
	RevenueRecognitionType       string `gorm:"type:varchar(20)" json:"revenue_recognition_type" csv:"revenue_recognition_type"`
}

func (CloudRevrec) TableName() string {
	return "monthly_cloud_revrec"
}

type BiRevrec struct {
	BillMonth               string `json:"BillMonth"`
	OriginalTenantID        string `json:"OriginalTenantID"`
	AdjustTenantID          string ` json:"AdjustTenantID"`
	AccountNumber           string ` json:"AccountNumber"`
	AccountName             string ` json:"AccountName"`
	OrderNumber             string `json:"OrderNumber"`
	RevrecNumber            string `json:"RevrecNumber"`
	Date                    string `json:"Date"`
	TiDBCloudBillingEndDate string `json:"TiDBCloudBillingEndDate"`
	Status                  string `json:"Status"`
	AdjustedRevenueAmount   string `json:"AdjustedRevenueAmount"`
	CreatedAt               string ` json:"CreatedAt"`
	AdjustedSupportAmount   string `json:"AdjustedSupportAmount"`
	AdjustedStarterAmount   string `json:"AdjustedStarterAmount"`
	AdjustedDedicatedAmount string `json:"AdjustedDedicatedAmount"`
	AdjustedPremiumAmount   string `json:"AdjustedPremiumAmount"`
	RevenueAmount           string `json:"RevenueAmount"`
	CreditAmount            string `json:"CreditAmount"`
	AdjustedShortfallAmount string `json:"AdjustedShortfallAmount"`
}

type CloudCollection struct {
	ID                  uint64         `gorm:"primaryKey;autoIncrement:true" json:"id" csv:"id"`
	CreatedAt           time.Time      `gorm:"not null;default:CURRENT_TIMESTAMP" json:"created_at" csv:"created_at"`
	UpdatedAt           sql.NullTime   `gorm:"default:null" json:"updated_at,omitempty" csv:"updated_at"`
	DeletedAt           gorm.DeletedAt `gorm:"default:null" json:"deleted_at,omitempty" csv:"deleted_at"`
	PayableAmount       string         `gorm:"type:varchar(64);not null;default:'0'" json:"payable_amount" csv:"payable_amount"`
	InvoiceNumber       string         `gorm:"type:varchar(128);not null" json:"invoice_number" csv:"invoice_number"`
	PayableDate         string         `gorm:"type:varchar(64)" json:"payable_date" csv:"payable_date"`
	ActualBillingDate   string         `gorm:"type:varchar(64)" json:"actual_billing_date" csv:"actual_billing_date"`
	CollectionsDate     string         `gorm:"type:varchar(20)" json:"collections_date" csv:"collections_date"`
	CollectionStatus    string         `gorm:"type:varchar(20)" json:"collection_status" csv:"collection_status"`
	CollectionsAmount   string         `gorm:"type:varchar(20)" json:"collections_amount" csv:"collections_amount"`
	Files               string         `gorm:"type:varchar(255)" json:"files" csv:"files"`
	InvoiceStatus       string         `gorm:"type:varchar(20)" json:"invoice_status" csv:"invoice_status"`
	Order               string         `gorm:"type:varchar(128)" json:"order" csv:"order"`
	OrderNumber         string         `gorm:"type:varchar(128)" json:"order_number" csv:"order_number"`
	BillMonth           string         `gorm:"type:varchar(20)" json:"bill_month" csv:"bill_month"`
	OriginalTenantID    string         `gorm:"type:varchar(255)" json:"original_tenant_id" csv:"original_tenant_id"`
	AdjustTenantID      string         `gorm:"type:varchar(128)" json:"adjust_tenant_id" csv:"adjust_tenant_id"`
	AccountNumber       string         `gorm:"type:varchar(128)" json:"account_number" csv:"account_number"`
	AccountName         string         `gorm:"type:varchar(64)" json:"account_name" csv:"account_name"`
	AccountSurrogateKey string         `gorm:"type:varchar(128)" json:"account_surrogate_key" csv:"account_surrogate_key"`
	AccountRegion       string         `gorm:"type:varchar(64)" json:"account_region" csv:"account_region"`
	IsCreateInvoice     bool           `gorm:"type:tinyint" json:"is_create_invoice" csv:"is_create_invoice"`
	CollectionNumber    string         `gorm:"type:varchar(255)" json:"collection_number" csv:"collection_number"`
	CollectionID        string         `gorm:"type:varchar(255)" json:"collection_id" csv:"collection_id"`
	Sync                int            `gorm:"type:tinyint" json:"sync" csv:"sync"`
	SyncTime            time.Time      `gorm:"default:null" json:"sync_time,omitempty" csv:"sync_time"`
	StripePaid          string         `gorm:"type:varchar(20)" json:"stripe_paid" csv:"stripe_paid"`
	Type                int            `gorm:"type:tinyint" json:"type" csv:"type"`
	StripeTaxRate       string         `gorm:"type:varchar(64)" json:"stripe_tax_rate" csv:"stripe_tax_rate"`
	CollectedDate       string         `gorm:"type:varchar(64)" json:"collected_date" csv:"collected_date"`
	CollectionType      string         `json:"collection_type" csv:"collection_type"`
	FileContent         string         `json:"file_content" csv:"file_content"`

	RowLock bool `json:"row_lock" csv:"row_lock"`
}

func (CloudCollection) TableName() string {
	return "monthly_cloud_collection"
}

type BiCollection struct {
	BillMonth         string `json:"BillMonth"`
	OriginalTenantID  string `json:"OriginalTenantID"`
	AdjustTenantID    string ` json:"AdjustTenantID"`
	AccountNumber     string ` json:"AccountNumber"`
	AccountName       string ` json:"AccountName"`
	OrderNumber       string `json:"OrderNumber"`
	CollectionNumber  string `json:"CollectionNumber"`
	InvoiceNumber     string `json:"InvoiceNumber"`
	PayableAmount     string `json:"PayableAmount"`
	PayableDate       string `json:"PayableDate"`
	ActualBillingDate string `json:"ActualBillingDate"`
	CollectionsDate   string `json:"CollectionDate"`
	CollectionStatus  string `json:"CollectionStatus"`
	CollectionsAmount string `json:"CollectionAmount"`
	Files             string `json:"Files"`
	InvoiceStatus     string `json:"InvoiceStatus"`
	StripePaid        string `json:"StripePaid"`
	CreatedAt         string ` json:"CreatedAt"`
}

type Approval struct {
	ID               uint64         `gorm:"primaryKey;autoIncrement:true" json:"id"`
	CreatedAt        time.Time      `gorm:"not null;default:CURRENT_TIMESTAMP" json:"created_at"`
	UpdatedAt        sql.NullTime   `gorm:"default:null" json:"updated_at,omitempty"`
	DeletedAt        gorm.DeletedAt `gorm:"default:null" json:"deleted_at,omitempty"`
	ApprovalInstance string         `gorm:"type:varchar(256);not null" json:"approval_instance"`
	Status           int            `gorm:"type:tinyint" json:"status"`
}

func (Approval) TableName() string {
	return "approval"
}

type BqOrder struct {
	ID        uint64         `gorm:"primaryKey;autoIncrement:true" json:"id"`
	CreatedAt time.Time      `gorm:"not null;default:CURRENT_TIMESTAMP" json:"created_at"`
	UpdatedAt sql.NullTime   `gorm:"default:null" json:"updated_at,omitempty"`
	DeletedAt gorm.DeletedAt `gorm:"default:null" json:"deleted_at,omitempty"`
	OrderID   string         `gorm:"type:varchar(255)" json:"order_id"`
	OrderName string         `gorm:"type:varchar(64)" json:"order_name"`
}

func (BqOrder) TableName() string {
	return "bq_order"
}

type BqAccount struct {
	ID          uint64         `gorm:"primaryKey;autoIncrement:true" json:"id"`
	CreatedAt   time.Time      `gorm:"not null;default:CURRENT_TIMESTAMP" json:"created_at"`
	UpdatedAt   sql.NullTime   `gorm:"default:null" json:"updated_at,omitempty"`
	DeletedAt   gorm.DeletedAt `gorm:"default:null" json:"deleted_at,omitempty"`
	AccountID   string         `gorm:"type:varchar(255)" json:"account_id"`
	AccountName string         `gorm:"type:varchar(64)" json:"account_name"`
}

func (BqAccount) TableName() string {
	return "bq_account"
}

type CreatedOrderItem struct {
	Attributes struct {
		Type string `json:"type"`
	} `json:"attributes"`
	PricebookEntryID string `json:"PricebookEntryId"`
	Quantity         string `json:"quantity"`
	UnitPrice        string `json:"UnitPrice"`
}

type Attributes struct {
	Type string `json:"type"`
	Url  string `json:"url"`
}
type CreatedOrderReq struct {
	OrderStartDate         string `json:"EffectiveDate,omitempty"`
	OrderEndDate           string `json:"Order_End_Date__c,omitempty"`
	TotalAmount            string `json:"TotalAmount,omitempty"`
	Status                 string `json:"Status,omitempty"`
	AccountID              string `json:"AccountId,omitempty"`
	Tax                    string `json:"Tax__c,omitempty"`
	PriceBook2ID           string `json:"Pricebook2Id,omitempty"`
	CurrencyIsoCode        string `json:"CurrencyIsoCode,omitempty"`
	ProductFamily          string `json:"Product_Family__c,omitempty"`
	AccumulateRevenueToOrg string `json:"Accumulate_revenue_to_Org__c,omitempty"`
	PingCAPRevRecEntity    string `json:"PingCAP_RevRec_Entity__c,omitempty"`
}

type CreatedOrders struct {
	Order []CreatedOrderReq `json:"order"`
}

type CreatedOrderResp struct {
	ID      string        `json:"id"`
	Success bool          `json:"success"`
	Errors  []interface{} `json:"errors"`
}

type CreatedOrderItemReq struct {
	OrderID          string      `json:"OrderId"`
	PricebookEntryID string      `json:"PricebookEntryId"`
	Quantity         json.Number `json:"Quantity"`
	UnitPrice        json.Number `json:"UnitPrice"`
	ServiceDate      string      `json:"ServiceDate"`
	EndDate          string      `json:"EndDate"`
	NetFee           json.Number `json:"Net_fees__c"`
	AccountID        string      `json:"Account__c"`
}

type CreatedRevrecReq struct {
	Order                   string `json:"Order__c,omitempty"`
	Date                    string `json:"Date__c,omitempty"`
	Status                  string `json:"Status__c,omitempty"`
	Amount                  string `json:"Amount__c,omitempty"`
	EstimatedRevenueAmount  string `json:"Estimated_Revenue_Amount__c,omitempty"`
	TiDBCloudBillingEndDate string `json:"Billing_End_Date__c,omitempty"`
	Product                 string `json:"Product__c,omitempty"`
	NewOrderStarterAmount   string `json:"TiDB_Cloud_Serverless_Amount_Raw__c,omitempty"`
	NewOrderDedicatedAmount string `json:"TiDB_Cloud_Dedicated_Amount_Raw__c,omitempty"`
	NewOrderSupportAmount   string `json:"TiDB_Cloud_Support_Amount__c,omitempty"`
	NewOrderEssentialAmount string `json:"TiDB_Cloud_Essential_Amount_Raw__c,omitempty"`
	NewOrderPremiumAmount   string `json:"TiDB_Cloud_Premium_Amount_Raw__c,omitempty"`
	NewOrderLakeAmount      string `json:"TiDB_Cloud_Lake_Amount_Raw__c,omitempty"`
	NewOrderByocAmount      string `json:"TiDB_Cloud_BYOC_Amount_Raw__c,omitempty"`
	CreditAmount            string `json:"Credit_Amount__c,omitempty"`
	AmountBeforeAdjustUse   string `json:"Amount_Before_Adjust_to_Use__c,omitempty"`
	CurrencyIsoCode         string `json:"CurrencyIsoCode,omitempty"`
	ExchangeRateToUse       string `json:"Exchange_Rate_to_Use__c,omitempty"`
}

type CreatedCollectionReq struct {
	Order             string `json:"Order__c,omitempty" bigquery:"Order"`
	PayableAmount     string `json:"Payable_Amount__c,omitempty" bigquery:"Payable_Amount"`
	InvoiceNumber     string `json:"Invoice_Number__c,omitempty" bigquery:"Invoice_Number"`
	PayableDate       string `json:"Payable_Date__c,omitempty" bigquery:"Payable_Date"`
	ActualBillingDate string `json:"Actual_Billing_Date__c,omitempty" bigquery:"Actual_Billing_Date"`
	CollectionsDate   string `json:"Collections_Date__c,omitempty" bigquery:"Collections_Date"`
	CollectionStatus  string `json:"CollectionsStatus__c,omitempty" bigquery:"CollectionsStatus__c"`
	CollectionsAmount string `json:"Collections_Amount__c,omitempty" bigquery:"Collections_Amount"`
	StripeInvoicePDF  string `json:"Stripe_Invoice_PDF__c,omitempty" bigquery:"Stripe_Invoice_PDF"`
	InvoiceStatus     string `json:"Invoice_Status__c,omitempty" bigquery:"Invoice_Status"`
	ExchangeRateUse   string `json:"Exchange_Rate_to_Use__c,omitempty" bigquery:"Exchange_Rate_to_Use"`
	CurrencyIsoCode   string `json:"CurrencyIsoCode,omitempty" bigquery:"CurrencyIsoCode"`
}

type CommonSalesResp struct {
	ID      string        `json:"id"`
	Success bool          `json:"success"`
	Errors  []interface{} `json:"errors"`
}

type CommonGetResp struct {
	Name string `json:"Name"`
}

type CommonQueryResp struct {
	TotalSize int  `json:"totalSize"`
	Done      bool `json:"done"`
	Records   []struct {
		attributes       Attributes
		ID               string `json:"Id"`
		Name             string `json:"Name"`
		LastModifiedDate string `json:"LastModifiedDate"`
	}
}

type RunStatus struct {
	RunStatus string `json:"RunStatus"`
	RunTime   string `json:"RunTime"`
	Message   string `json:"Message"`
}

// 定义复合键结构体
type CloudCollectionKey struct {
	BillMonth      string
	AdjustTenantID string
	InvoiceNumber  string
	Type           int
}

type DataPlatformLog struct {
	Level string `json:"level"`
	Msg   string `json:"msg"`
}
