// 模块模型操作接口-公司
// 秒寻科技
// 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/module/bparam/bparamapi"
	"ipsomc/module/bparam/bparammodel"
	"ipsomc/module/project/projectmodel"
	"ipsomc/util"
	"strconv"
)

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

// 公司注册，包括注册系统管理员
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
	}

	//修改公司记录归属owner_id，公司记录全部由平台管理员创建，所有公司记录的owner_id为平台管理员记录id(公司记录owner_id与记录id相同)
	if err := tx.Model(dataModel).Where("id=?", dataModel.ID).Update("owner_id", dataModel.OwnerID).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
	operatorModel.Nickname = dataModel.Nickname
	ciphertext, err := util.EncryptAes([]byte(dataModel.Password))
	if err != nil {
		tx.Rollback()
		return err
	}
	operatorModel.Password = ciphertext
	operatorModel.UserTypeID = 2 //1：平台管理员，2：系统管理员，3：项目管理员
	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).Where("id=?", operatorModel.ID).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
}

// 删除公司资料，包括删除公司系统管理员、项目资料和项目管理员
func (obj *CompanyLgc) DeleteCompanyLgc(dataModel *companymodel.Company) error {

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

	//删除公司的所有基站
	if err := tx.Delete(&bparammodel.BtsBaseParam{}, "company_id=?", dataModel.ID).Error; err != nil {
		tx.Rollback()
		return err
	}

	//删除该公司的所有项目
	if err := tx.Delete(&projectmodel.Project{}, "company_id=?", dataModel.ID).Error; err != nil {
		tx.Rollback()
		return err
	}

	//删除该公司的所有管理员
	if err := tx.Delete(&usermodel.Operator{}, "company_id=?", dataModel.ID).Error; err != nil {
		tx.Rollback()
		return err
	}

	//删除该公司资料
	if err := tx.Delete(&companymodel.Company{}, "id=?", dataModel.ID).Error; err != nil {
		tx.Rollback()
		return err
	}

	//提交事务
	if err := tx.Commit().Error; err != nil {
		tx.Rollback()
		return err
	}

	return nil
}
