package mysql

import (
	"context"

	"finance-portal/model"
	"gorm.io/gorm"
)

type invoiceRewrite struct {
	db *gorm.DB
}

func newInvoiceRewrite(ds *datastore) *invoiceRewrite {
	return &invoiceRewrite{db: ds.db}
}

func (mc *invoiceRewrite) Save(_ context.Context, invoice *model.InvoiceRewrite) (err error) {
	if err = mc.db.Save(invoice).Error; err != nil {
		return
	}
	return
}

func (mc *invoiceRewrite) UpdateContentByID(_ context.Context, id int, content string) (err error) {
	if err = mc.db.Model(&model.InvoiceRewrite{}).Where("id = ?", id).Updates(map[string]interface{}{
		"pdf_content_byte": content,
	}).Error; err != nil {
		return
	}
	return
}

func (mc *invoiceRewrite) GetByID(_ context.Context, id int) (record model.InvoiceRewrite, err error) {
	if err = mc.db.Where("id = ?", id).First(&record).Error; err != nil {
		return
	}
	return
}

func (mc *invoiceRewrite) ListByCloudCondition(_ context.Context, startDate string) ([]*model.InvoiceRewrite, error) {
	var records []*model.InvoiceRewrite
	tx := mc.db.Table("invoice_rewrite").
		Select("id,ns_order_number,ns_collection_number,salesforce_order_number,pdf_name,pdf_content,sync,created_at,sync_time,updated_time,invoice_number_to_use").
		Where("invoice_rewrite.deleted_at is null")
	if startDate != "" {
		tx = tx.Where("invoice_rewrite.created_at >= ?", startDate)
	}
	err := tx.Find(&records).Error
	return records, err
}

func (mc *invoiceRewrite) SaveInvoiceContentBytes(_ context.Context, invoice model.InvoiceRewriteContentByte) (err error) {
	err = mc.db.Model(&model.InvoiceRewriteContentByte{}).Save(&invoice).Error

	return
}

func (mc *invoiceRewrite) GetInvoiceContentBytesByInvoiceID(_ context.Context, invoiceID int) (record model.InvoiceRewriteContentByte, err error) {
	err = mc.db.Where("invoice_id = ?", invoiceID).First(&record).Error
	return
}

func (mc *invoiceRewrite) UpdateInvoiceContentBytes(_ context.Context, invoice model.InvoiceRewriteContentByte) (err error) {
	err = mc.db.Model(&model.InvoiceRewriteContentByte{}).Where("invoice_id = ?", invoice.InvoiceID).Updates(&invoice).Error
	return
}
