package mysql

import (
	"context"

	"gorm.io/gorm"

	v1 "github.com/pingcap-inc/pchub/model/v1"
)

type userDepartment struct {
	db *gorm.DB
}

func newUserDepartment(ds *datastore) *userDepartment {
	return &userDepartment{db: ds.db}
}

func (u *userDepartment) BatchInit(ctx context.Context, uds []*v1.UserDepartment) error {
	tx := u.db.Begin()

	udIDs := make([]string, 0, len(uds))
	for _, ud := range uds {
		udIDs = append(udIDs, ud.UserLarkID+","+ud.DepartmentLarkID)
	}

	// delete all user departments
	err := tx.Unscoped().Where("CONCAT(userLarkID, ',', departmentLarkID) IN (?)", udIDs).Delete(&v1.UserDepartment{}).Error
	if err != nil {
		tx.Rollback()

		return err
	}

	// insert all user departments
	if len(uds) > 0 {
		err := tx.Create(&uds).Error
		if err != nil {
			tx.Rollback()

			return err
		}
	}

	tx.Commit()

	return nil
}

func (u *userDepartment) BatchSave(_ context.Context, news []*v1.UserDepartment) error {
	tx := u.db.Begin()

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

			return err
		}
	}
	tx.Commit()

	return nil
}

func (u *userDepartment) MGetByLarkIDs(_ context.Context, larkIDs []string) ([]*v1.UserDepartment, error) {
	var res []*v1.UserDepartment
	d := u.db.
		Where("CONCAT(userLarkID, ',', departmentLarkID) IN (?)", larkIDs).
		Order("id asc").
		Find(&res)

	return res, dbNotFoundErrorWrap(d.Error)
}

func (u *userDepartment) MDelByLarkIDsIfNotIn(_ context.Context, larkIDs []string) error {
	return u.db.Where("CONCAT(userLarkID, ',', departmentLarkID) NOT IN (?)", larkIDs).Delete(&v1.UserDepartment{}).Error
}
