package mysql

import (
	"context"

	"gorm.io/gorm"

	"github.com/pingcap-inc/data-ingestion-tools/model"
)

type createdOrder struct {
	db *gorm.DB
}

func newCreatedOrder(ds *datastore) *createdOrder {
	return &createdOrder{db: ds.db}
}

func (c *createdOrder) List(_ context.Context) (records []model.CreatedOrder, err error) {
	err = c.db.Find(&records).Error
	return
}

func (c *createdOrder) ListCurrentMonth(_ context.Context, billMonth string) (records []*model.CreatedOrder, err error) {
	err = c.db.Where("bill_month = ?", billMonth).Find(&records).Error
	return
}

func (c *createdOrder) GetByFakeNumber(_ context.Context, fakeNumber string) (record model.CreatedOrder, err error) {
	err = c.db.Where("fake_number = ?", fakeNumber).First(&record).Error
	return
}

func (c *createdOrder) Update(_ context.Context, record *model.CreatedOrder) error {
	return c.db.Save(record).Error
}

func (c *createdOrder) DeleteAndSave(_ context.Context, records []model.CreatedOrder) ([]model.CreatedOrder, error) {
	if len(records) == 0 {
		return nil, nil
	}
	// clear the records of the current month
	c.db.Where("bill_month = ? and sync = ?", records[0].BillMonth, 0).Unscoped().Delete(&model.CreatedOrder{})

	dRecords := make([]model.CreatedOrder, 0)
	for _, record := range records {
		var tmpOrder model.CreatedOrder
		err := c.db.Where("bill_month = ? and original_tenant_id = ?", record.BillMonth, record.OriginalTenantID).First(&tmpOrder).Error
		if err == gorm.ErrRecordNotFound {
			err = c.db.Create(&record).Error
			if err != nil {
				return nil, err
			}

			dRecords = append(dRecords, record)
		}
	}

	return dRecords, nil
}
