package model

import (
	"net/http"
	"time"

	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
	operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
)

type SystemUser struct {
	Id        int64                  `json:"id"`
	Name      string                 `json:"name"`
	NickName  string                 `json:"nick_name"`
	Mobile    string                 `json:"mobile"`
	Password  string                 `json:"password"`
	Avatar    string                 `json:"avatar"`
	RoleId    int64                  `json:"role_id"`
	DeptId    int64                  `json:"dept_id"`
	Remarks   string                 `json:"remarks"`
	Gender    pasturePb.Genders_Kind `json:"gender"`
	IsShow    pasturePb.IsShow_Kind  `json:"is_show"`
	IsDelete  pasturePb.IsShow_Kind  `json:"is_delete"`
	CreatedAt int64                  `json:"created_at"`
	UpdatedAt int64                  `json:"updated_at"`
}

func (s *SystemUser) TableName() string {
	return "system_user"
}

func (s *SystemUser) SystemUserFormat(userRoles []*SystemRole, pastures []*operationPb.UserPasture) *operationPb.UserAuth {
	roles := make([]*operationPb.UserRole, len(userRoles))
	for k, v := range userRoles {
		roles[k] = &operationPb.UserRole{
			Id:   int32(v.Id),
			Name: v.Name,
		}
	}

	return &operationPb.UserAuth{
		Code: http.StatusOK,
		Msg:  "ok",
		Data: &operationPb.UserAuthData{
			UserName: s.Name,
			Roles:    roles,
			Pastures: pastures,
		},
	}
}

type SystemUserSlice []*SystemUser

func (s SystemUserSlice) ToPB(deptList []*SystemDept, roleList []*SystemRole) []*pasturePb.SearchUserRequest {
	res := make([]*pasturePb.SearchUserRequest, len(s))
	for i, v := range s {
		deptName := ""
		for _, d := range deptList {
			if v.DeptId == d.Id {
				deptName = d.Name
				break
			}
		}
		roleName := ""
		for _, r := range roleList {
			if v.RoleId == r.Id {
				roleName += r.Name
				break
			}
		}

		res[i] = &pasturePb.SearchUserRequest{
			Id:              int32(v.Id),
			Name:            v.Name,
			Mobile:          v.Mobile,
			NickName:        v.NickName,
			Avatar:          v.Avatar,
			Gender:          v.Gender,
			IsShow:          v.IsShow,
			IsDelete:        v.IsDelete,
			Remarks:         v.Remarks,
			DeptId:          int32(v.DeptId),
			DeptName:        deptName,
			RoleId:          int32(v.RoleId),
			RoleName:        roleName,
			CreatedAtFormat: time.Unix(v.CreatedAt, 0).Format(LayoutTime),
			UpdatedAtFormat: time.Unix(v.UpdatedAt, 0).Format(LayoutTime),
		}
	}
	return res
}

func (s *SystemUser) ToPb() *operationPb.AddSystemUser {
	return &operationPb.AddSystemUser{
		Id:              int32(s.Id),
		Name:            s.Name,
		CreatedAt:       int32(s.CreatedAt),
		CreatedAtFormat: time.Unix(s.CreatedAt, 0).Format(LayoutTime),
		RoleIds:         []int32{},
	}
}

func (c SystemUserSlice) ToPB2() []*pasturePb.ConfigOptionsList {
	res := make([]*pasturePb.ConfigOptionsList, len(c))
	for i, d := range c {
		res[i] = &pasturePb.ConfigOptionsList{
			Value:    int32(d.Id),
			Label:    d.Name,
			Disabled: true,
		}
	}
	return res
}