// 模块模型操作接口-公司
// 秒寻科技
// zt 2024-02-01

package companylogic

import (
	"errors"
	"ipsomc/core/company/companyapi"
	"ipsomc/core/company/companymodel"
	"ipsomc/core/dao/mysql/mysqlapi"
	"ipsomc/core/user/userapi"
	"ipsomc/core/user/usermodel"
	"ipsomc/util"
	"strconv"
)

type CompanyLgc struct {
	companyApi companyapi.CompanyApi
	userApi    userapi.UserApi
	mySqlApi   mysqlapi.MySqlApi
}

// 公司注册，包括注册系统管理员
func (obj *CompanyLgc) CompanyRegister(dataModel *companymodel.Company) error {
	roleModel := new(usermodel.Role)

	//公司查重
	if err := obj.companyApi.CheckCompany(dataModel); err != nil {
		return err
	}

	//系统操作员查重
	if err := obj.userApi.CheckOperatorName(dataModel.UserName); err != nil {
		return err
	}

	//开启一个事务
	db := obj.mySqlApi.GetDb()
	tx := db.Begin()

	//新增公司资料
	if err := tx.Create(dataModel).Error; err != nil {
		tx.Rollback()
		return err
	}

	//查询系统管理员的角色ID
	if err := db.Model(roleModel).Where("type_id=?", 2).First(roleModel).Error; err != nil {
		tx.Rollback()
		return err
	}
	if roleModel.ID <= 0 { //角色不存在
		tx.Rollback()
		return errors.New("系统错误，请联系平台管理员")
	}

	//注册系统管理员
	var operatorModel usermodel.Operator
	operatorModel.Name = dataModel.ContactPerson
	operatorModel.Telephone = dataModel.ContactTel
	operatorModel.UserName = dataModel.UserName
	ciphertext, err := util.EncryptAes([]byte(dataModel.Password))
	if err != nil {
		tx.Rollback()
		return err
	}
	operatorModel.Password = ciphertext
	operatorModel.UserTypeID = 2 //系统管理员
	operatorModel.CompanyID = dataModel.ID
	operatorModel.Role = strconv.Itoa(int(roleModel.ID)) //为系统管理员分配角色
	if err := tx.Create(&operatorModel).Error; err != nil {
		tx.Rollback()
		return err
	}

	//修改系统管理员的OwnerID
	if err := tx.Model(operatorModel).Update("owner_id", operatorModel.ID).Error; err != nil {
		tx.Rollback()
		return err
	}

	//提交事务
	if err := tx.Commit().Error; err != nil {
		tx.Rollback()
		return errors.New("数据库操作失败")
	}

	return nil
}
