package service

import (
	"fmt"
	"strconv"

	"be.ems/src/framework/constants"
	"be.ems/src/framework/utils/file"
	"be.ems/src/modules/system/model"
	"be.ems/src/modules/system/repository"
)

// NewSysPost 实例化服务层
var NewSysPost = &SysPost{
	sysPostRepository:     repository.NewSysPost,
	sysUserPostRepository: repository.NewSysUserPost,
}

// SysPostService 岗位表 服务层处理
type SysPost struct {
	sysPostRepository     *repository.SysPost     // 岗位服务
	sysUserPostRepository *repository.SysUserPost // 用户与岗位关联服务
}

// FindByPage 分页查询列表数据
func (s SysPost) FindByPage(query map[string]string) ([]model.SysPost, int64) {
	return s.sysPostRepository.SelectByPage(query)
}

// Find 查询列表数据
func (s SysPost) Find(sysPost model.SysPost) []model.SysPost {
	return s.sysPostRepository.Select(sysPost)
}

// FindById 通过ID查询信息
func (s SysPost) FindById(postId int64) model.SysPost {
	if postId <= 0 {
		return model.SysPost{}
	}
	posts := s.sysPostRepository.SelectByIds([]int64{postId})
	if len(posts) > 0 {
		return posts[0]
	}
	return model.SysPost{}
}

// Insert 新增信息
func (s SysPost) Insert(sysPost model.SysPost) int64 {
	return s.sysPostRepository.Insert(sysPost)
}

// Update 修改信息
func (s SysPost) Update(sysPost model.SysPost) int64 {
	return s.sysPostRepository.Update(sysPost)
}

// DeleteByIds 批量删除信息
func (s SysPost) DeleteByIds(postIds []int64) (int64, error) {
	// 检查是否存在
	posts := s.sysPostRepository.SelectByIds(postIds)
	if len(posts) <= 0 {
		// return 0, fmt.Errorf("没有权限访问岗位数据！")
		return 0, fmt.Errorf("there is no accessible post data")
	}
	for _, post := range posts {
		if useCount := s.sysUserPostRepository.ExistUserByPostId(post.PostId); useCount > 0 {
			// return 0, fmt.Errorf("【%s】已分配给用户,不能删除", post.PostName)
			return 0, fmt.Errorf("[%s] has been assigned to a user and cannot be deleted", post.PostName)
		}
	}
	if len(posts) == len(postIds) {
		return s.sysPostRepository.DeleteByIds(postIds), nil
	}
	// return 0, fmt.Errorf("删除岗位信息失败！")
	return 0, fmt.Errorf("failed to delete post information")
}

// CheckUniqueByName 检查岗位名称是否唯一
func (s SysPost) CheckUniqueByName(postName string, postId int64) bool {
	uniqueId := s.sysPostRepository.CheckUnique(model.SysPost{
		PostName: postName,
	})
	if uniqueId == postId {
		return true
	}
	return uniqueId == 0
}

// CheckUniqueByCode 检查岗位编码是否唯一
func (s SysPost) CheckUniqueByCode(postCode string, postId int64) bool {
	uniqueId := s.sysPostRepository.CheckUnique(model.SysPost{
		PostCode: postCode,
	})
	if uniqueId == postId {
		return true
	}
	return uniqueId == 0
}

// FindByUserId 根据用户ID获取岗位选择框列表
func (s SysPost) FindByUserId(userId int64) []model.SysPost {
	return s.sysPostRepository.SelectByUserId(userId)
}

// ExportData 导出数据表格
func (s SysPost) ExportData(rows []model.SysPost, fileName string) (string, error) {
	// 第一行表头标题
	headerCells := map[string]string{
		"A1": "岗位编号",
		"B1": "岗位编码",
		"C1": "岗位名称",
		"D1": "岗位排序",
		"E1": "岗位状态",
	}
	// 从第二行开始的数据
	dataCells := make([]map[string]any, 0)
	for i, row := range rows {
		idx := strconv.Itoa(i + 2)
		statusValue := "停用"
		if row.StatusFlag == constants.STATUS_YES {
			statusValue = "正常"
		}
		dataCells = append(dataCells, map[string]any{
			"A" + idx: row.PostId,
			"B" + idx: row.PostCode,
			"C" + idx: row.PostName,
			"D" + idx: row.PostSort,
			"E" + idx: statusValue,
		})
	}

	// 导出数据表格
	return file.WriteSheet(headerCells, dataCells, fileName, "")
}
