package mysql

import (
	"context"

	"gorm.io/gorm"

	"github.com/pingcap-inc/it-automation/internal/sync-google-email/model"
)

type department struct {
	db *gorm.DB
}

func newDepartment(ds *datastore) *department {
	return &department{db: ds.db}
}

func (d *department) GetDepartmentByAnyId(s string) (*model.LarkDepartment, error) {
	var res model.LarkDepartment
	err := d.db.Where("authingId = ?", s).First(&res).Error
	return &res, dbNotFoundErrorWrap(err)
}

func (d *department) SaveDepartments(departments []*model.LarkDepartment) error {
	tx := d.db.Begin()
	for _, dpt := range departments {
		err := tx.Save(&dpt).Error
		if err != nil {
			tx.Rollback()

			return err
		}
	}
	tx.Commit()

	return nil
}

func (d *department) Create(_ context.Context, department *model.LarkDepartment) error {
	return d.db.Create(department).Error
}

func (d *department) ListAll(ctx context.Context) ([]model.LarkDepartment, error) {
	var res []model.LarkDepartment
	err := d.db.Find(&res).Error
	return res, err
}

func (d *department) DeleteById(_ context.Context, id uint64) error {
	return d.db.Where("id = ?", id).Delete(&model.LarkDepartment{}).Error
}

func (d *department) Sync(_ context.Context, dptCreate []model.LarkDepartment, dptUpdate []model.LarkDepartment, dptDelete []string) error {
	tx := d.db.Begin()

	if len(dptCreate) > 0 {
		err := tx.Create(&dptCreate).Error
		if err != nil {
			tx.Rollback()

			return err
		}
	}

	for _, dpt := range dptUpdate {
		err := tx.Save(&dpt).Error
		if err != nil {
			tx.Rollback()

			return err
		}
	}

	if len(dptDelete) > 0 {
		err := tx.Where("departmentId in (?)", dptDelete).Delete(&model.LarkDepartment{}).Error
		if err != nil {
			tx.Rollback()

			return err
		}
	}
	tx.Commit()

	return nil
}
