package backend

import (
	"context"
	"kpt-pasture/config"
	"kpt-pasture/service/asynqsvc"
	"kpt-pasture/service/wechat"
	"kpt-pasture/store/kptstore"

	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
	"gitee.com/xuyiping_admin/pkg/di"
	"go.uber.org/dig"
)

var Module = di.Options(di.Provide(NewStore))

type Hub struct {
	dig.In
	OpsService KptService
}

type StoreEntry struct {
	dig.In

	Cfg         *config.AppConfig
	DB          *kptstore.DB
	HttpClient  *wechat.ClientService
	AsynqClient asynqsvc.Client
}

func NewStore(store StoreEntry) KptService {
	return &store
}

func NewStoreEntry(cfg *config.AppConfig, Db *kptstore.DB) *StoreEntry {
	return &StoreEntry{
		Cfg:        cfg,
		DB:         Db,
		HttpClient: nil,
	}
}

//go:generate mockgen -destination mock/kptservice.go -package kptservicemock kpt-pasture/module/backend KptService
type KptService interface {
	SystemService        // 系统相关操作
	PastureManageService // 牧场管理相关
	ConfigDataService    // 配置数据相关
	EventService         // 事件相关
	CowService           // 牛只相关
	GoodsService         // 牧场物品相关
	AnalyseService       // 分析相关
	DashboardService     // 牧场统计相关
	WorkService          // 日常工作相关
}

//go:generate mockgen -destination mock/SystemService.go -package kptservicemock kpt-pasture/module/backend SystemService
type SystemService interface {
	// Login 系统用户相关
	Login(ctx context.Context, req *pasturePb.SearchUserRequest) (*pasturePb.SystemUserResponse, error)
	SearchSystemUserList(ctx context.Context, req *pasturePb.SearchUserRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchUserResponse, error)
	IsShowSystemUser(ctx context.Context, userId int64) error
	DeleteSystemUser(ctx context.Context, userId int64) error
	SystemUserCreateOrUpdate(ctx context.Context, req *pasturePb.SearchUserRequest) error
	ResetPasswordSystemUser(ctx context.Context, req *pasturePb.ResetUserPasswordRequest) error
	SystemUserRole(ctx context.Context, userId int64) (*pasturePb.SystemUserRoleResponse, error)
	SystemUserRoleSave(ctx context.Context, req *pasturePb.SystemUserRoleRequest) error

	// GetSystemUserMenu 当前登录用户菜单权限
	GetSystemUserMenu(ctx context.Context) (*pasturePb.SystemUserMenuTreeResponse, error)

	GetCurrentUserName(ctx context.Context) (string, error)

	// SearchSystemRoleList 系统角色相关
	SearchSystemRoleList(ctx context.Context, req *pasturePb.SearchRoleRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchRoleResponse, error)
	DeleteSystemRole(ctx context.Context, roleId int64) error
	IsShowSystemRole(ctx context.Context, roleId int64) error
	SystemRoleCreateOrUpdate(ctx context.Context, req *pasturePb.SearchRoleRequest) error
	GetRoleMenuList(ctx context.Context, roleId int64) (*pasturePb.SystemRoleMenuResponse, error)
	RoleMenuSave(ctx context.Context, res *pasturePb.SystemRoleMenuRequest) error
	SystemRoleList(ctx context.Context) (*pasturePb.GetRoleListResponse, error)

	// SearchSystemMenuList 系统菜单权限
	SearchSystemMenuList(ctx context.Context, req *pasturePb.SearchMenuRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchMenuResponse, error)
	DeleteSystemMenu(ctx context.Context, menuId int64) error
	CreateOrUpdateSystemMenu(ctx context.Context, req *pasturePb.SearchMenuRequest) error
	SystemMenuTree(ctx context.Context) (*pasturePb.SystemMenuTreeResponse, error)

	// SearchSystemDeptList 部门列表
	SearchSystemDeptList(ctx context.Context, req *pasturePb.SearchDeptRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchDeptResponse, error)
	SystemDepDelete(ctx context.Context, id int64) error
	SystemDeptCreateOrUpdate(ctx context.Context, req *pasturePb.SearchDeptRequest) error
}

//go:generate mockgen -destination mock/PastureManageService.go -package kptservicemock kpt-pasture/module/backend PastureManageService
type PastureManageService interface {
	SearchBarnList(ctx context.Context, req *pasturePb.SearchNameRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchBarnResponse, error)
	CreateOrUpdateBarn(ctx context.Context, req *pasturePb.SearchBarnList) error
	SearchBarnTypeList(ctx context.Context, req *pasturePb.SearchNameRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchBaseConfigResponse, error)
	CreateOrUpdateBarnType(ctx context.Context, req *pasturePb.SearchBaseConfigList) error
	SearchBreedStatusList(ctx context.Context, req *pasturePb.SearchNameRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchBaseConfigResponse, error)
	CreateOrUpdateBreedStatus(ctx context.Context, req *pasturePb.SearchBaseConfigList) error
	SearchCowKindList(ctx context.Context, req *pasturePb.SearchNameRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchBaseConfigResponse, error)
	CreateOrUpdateCowKind(ctx context.Context, req *pasturePb.SearchBaseConfigList) error
	SearchCowStatusList(ctx context.Context, req *pasturePb.SearchNameRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchBaseConfigResponse, error)
	CreateOrUpdateCowStatus(ctx context.Context, req *pasturePb.SearchBaseConfigList) error
	SearchCowTypeList(ctx context.Context, req *pasturePb.SearchNameRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchBaseConfigResponse, error)
	CreateOrUpdateCowType(ctx context.Context, req *pasturePb.SearchBaseConfigList) error

	SearchTransferPenReasonList(ctx context.Context, req *pasturePb.SearchNameRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchBaseConfigResponse, error)
	CreateOrUpdateTransferPenReason(ctx context.Context, req *pasturePb.SearchBaseConfigList) error
	SearchCowSourceList(ctx context.Context, req *pasturePb.SearchNameRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchBaseConfigResponse, error)
	CreateOrUpdateCowSource(ctx context.Context, req *pasturePb.SearchBaseConfigList) error

	CreateOrUpdateSameTime(ctx context.Context, req *pasturePb.SearchSameTimeList) error
	SearchSameTimeList(ctx context.Context, req *pasturePb.SearchNameRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SameTimeResponse, error)
	SameTimeIsShow(ctx context.Context, id int64) error

	SearchDiseaseTypeList(ctx context.Context, req *pasturePb.SearchNameRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchBaseConfigResponse, error)
	CreateOrUpdateDiseaseType(ctx context.Context, req *pasturePb.SearchBaseConfigList) error
	SearchDiseaseList(ctx context.Context, req *pasturePb.SearchDiseaseRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchDiseaseResponse, error)
	CreateOrUpdateDisease(ctx context.Context, req *pasturePb.SearchDiseaseList) error

	SearchPrescriptionList(ctx context.Context, req *pasturePb.SearchPrescriptionRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchPrescriptionResponse, error)
	CreateOrUpdatePrescription(ctx context.Context, req *pasturePb.PrescriptionRequest) error

	ImmunizationList(ctx context.Context, req *pasturePb.ImmunizationRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchImmunizationResponse, error)
	CreatedOrUpdateImmunization(ctx context.Context, req *pasturePb.ImmunizationRequest) error
	ImmunizationIsShow(ctx context.Context, id int64) error
}

//go:generate mockgen -destination mock/ConfigDataService.go -package kptservicemock kpt-pasture/module/backend ConfigDataService
type ConfigDataService interface {
	BarnTypeOptions(ctx context.Context) (*pasturePb.ConfigOptionsListResponse, error)
	BarnListOptions(ctx context.Context, penType int) (*pasturePb.ConfigOptionsListResponse, error)
	BreedStatusOptions(ctx context.Context) (*pasturePb.ConfigOptionsListResponse, error)
	CowKindOptions(ctx context.Context) (*pasturePb.ConfigOptionsListResponse, error)
	CowSourceOptions(ctx context.Context) (*pasturePb.ConfigOptionsListResponse, error)
	CowTypeOptions(ctx context.Context) (*pasturePb.ConfigOptionsListResponse, error)
	CowTransferPenReasonOptions(ctx context.Context) (*pasturePb.ConfigOptionsListResponse, error)
	SystemUserOptions(ctx context.Context, depId int) (*pasturePb.ConfigOptionsListResponse, error)
	BullOptions(ctx context.Context) (*pasturePb.BullOptionsListResponse, error)
	SystemBaseConfigOptions(ctx context.Context, optionName string) (*pasturePb.ConfigOptionsListResponse, error)
	DiseaseTypeOptions(ctx context.Context) (*pasturePb.ConfigOptionsListResponse, error)
	DiseaseOptions(ctx context.Context) (*pasturePb.ConfigOptionsListResponse, error)
}

//go:generate mockgen -destination mock/EventService.go -package kptservicemock kpt-pasture/module/backend EventService
type EventService interface {
	EnterList(ctx context.Context, req *pasturePb.SearchEventRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchEnterEventResponse, error)
	CreateEnter(ctx context.Context, req *pasturePb.EventEnterData) error
	GroupTransferList(ctx context.Context, req *pasturePb.SearchEventRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchTransferGroupEventResponse, error)
	CreateGroupTransfer(ctx context.Context, req *pasturePb.TransferGroupEventRequest) error
	BodyScoreList(ctx context.Context, req *pasturePb.SearchEventRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchBodyScoreEventResponse, error)
	CreateBodyScore(ctx context.Context, req *pasturePb.BodyScoreEventRequest) error
	CalvingList(ctx context.Context, req *pasturePb.SearchEventRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchLavingEventResponse, error)
	CalvingCreate(ctx context.Context, req *pasturePb.EventCalving) error
	PregnantCheckList(ctx context.Context, req *pasturePb.SearchEventRequest, pagination *pasturePb.PaginationModel) (*pasturePb.PregnantCheckEventResponse, error)
	PregnantCheckCreate(ctx context.Context, req *pasturePb.EventPregnantCheck) error
	MatingList(ctx context.Context, req *pasturePb.SearchEventRequest, pagination *pasturePb.PaginationModel) (*pasturePb.MatingEventResponse, error)
	MatingCreate(ctx context.Context, req *pasturePb.EventMating) error
	EstrusList(ctx context.Context, req *pasturePb.SearchEventRequest, pagination *pasturePb.PaginationModel) (*pasturePb.EstrusEventResponse, error)
	EstrusCreate(ctx context.Context, req *pasturePb.EventEstrus) error
	FrozenSemenList(ctx context.Context, req *pasturePb.FrozenSemenRequest, pagination *pasturePb.PaginationModel) (*pasturePb.FrozenSemenResponse, error)
	FrozenSemenCreate(ctx context.Context, req *pasturePb.SearchFrozenSemenList) error
	WeightList(ctx context.Context, req *pasturePb.SearchEventRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchWeightEventResponse, error)
	WeightCreate(ctx context.Context, req *pasturePb.EventWeight) error

	SameTimeCreate(ctx context.Context, req *pasturePb.EventSameTime) error
}

//go:generate mockgen -destination mock/CowService.go -package kptservicemock kpt-pasture/module/backend CowService
type CowService interface {
	CowList(ctx context.Context, req *pasturePb.SearchEventRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchCowListResponse, error)
}

//go:generate mockgen -destination mock/GoodsService.go -package kptservicemock kpt-pasture/module/backend GoodsService
type GoodsService interface {
	DrugsList(ctx context.Context, req *pasturePb.SearchDrugsRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchDrugsResponse, error)
	DrugsCreateOrUpdate(ctx context.Context, req *pasturePb.SearchDrugsList) error
	MedicalEquipmentList(ctx context.Context, req *pasturePb.SearchMedicalEquipmentRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchMedicalEquipmentResponse, error)
	MedicalEquipmentCreateOrUpdate(ctx context.Context, req *pasturePb.SearchMedicalEquipmentList) error
}

//go:generate mockgen -destination mock/AnalyseService.go -package kptservicemock kpt-pasture/module/backend AnalyseService
type AnalyseService interface {
	GrowthCurve(ctx context.Context, req *pasturePb.SearchGrowthCurvesRequest) (*pasturePb.GrowthCurvesResponse, error)
}

//go:generate mockgen -destination mock/DashboardService.go -package kptservicemock kpt-pasture/module/backend DashboardService
type DashboardService interface {
	Bar(ctx context.Context) (*pasturePb.BarCowStructResponse, error)
}

//go:generate mockgen -destination mock/WorkService.go -package kptservicemock kpt-pasture/module/backend WorkService
type WorkService interface {
	OrderList(ctx context.Context, req *pasturePb.SearchWorkOrderRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchWorkOrderResponse, error)
	OrderCreateOrUpdate(ctx context.Context, req *pasturePb.WorkOrderList) error
	OrderIsShow(ctx context.Context, id int64) error
	UserWorkOrderList(ctx context.Context, workOrderStatus pasturePb.WorkOrderStatus_Kind, pagination *pasturePb.PaginationModel) (*pasturePb.UserWorkOrderResponse, error)
}