using AutoMapper;
using AutoMapper.EquivalencyExpression;
using IRaCIS.Application.Contracts;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Domain.Models;

namespace IRaCIS.Core.Application.Service
{
    public class ManagementConfig : Profile
    {
        public ManagementConfig()
        {
            
             CreateMap<UserTypeMenu, MenuTreeNode>().IncludeMembers(t => t.Menu);




            CreateMap<RoleCommand, Role>();

            CreateMap<UserCommand, User>().ForMember(d => d.UserCode, x => x.Ignore());
            CreateMap<UserType, UserTypeMenuAddOrEdit>().ReverseMap()
                .ForMember(t => t.UserTypeMenuList, u => u.MapFrom(c => c.MenuIds))
                .ForMember(t => t.UserTypeGroupList, u => u.MapFrom(c => c.UserTypeGroupIdList));

            CreateMap<Guid, UserTypeGroup>().ForMember(t => t.DictionaryId, u => u.MapFrom(c => c))
               .EqualityComparison((odto, o) => odto == o.DictionaryId);

            CreateMap<Guid, UserTypeMenu>().ForMember(t=>t.MenuId,u=>u.MapFrom(c=>c))
                .EqualityComparison((odto, o) => odto == o.MenuId);

            CreateMap<UserTypeGroup, UserTypeGroupInfo>()
                .ForMember(t => t.GroupName, u => u.MapFrom(c => c.Group.Value))
                .ForMember(t => t.GroupNameCN, u => u.MapFrom(c => c.Group.ValueCN));
            

            CreateMap<MenuCommand, Menu>().ForMember(d => d.Id, u => u.MapFrom(t => t.MenuId)).ReverseMap();

            CreateMap<Menu, MenuTreeNode>()
                .ForMember(d => d.MenuId, u => u.MapFrom(t => t.Id));

            CreateMap<Menu, MenuDTO>().ForMember(d => d.MenuId, u => u.MapFrom(t => t.Id));


            CreateMap<UserType, UserTypeRoleView>()
                .ForMember(t => t.MenuIds, u => u.MapFrom(c => c.UserTypeMenuList.Select(t=>t.MenuId)));

            CreateMap<Role, RoleDTO>();
            CreateMap<Menu, MenuFunctionDTO>();


            CreateMap<UserType, UserTypeViewModel>();


            //用户类型菜单勾选
            var userTypeId = Guid.Empty;
            CreateMap<Menu, MenuTreeNodeSelect>()
                  .ForMember(d => d.IsSelect, u => u.MapFrom(s => s.UserTypeMenuList.Any(t => t.UserTypeId == userTypeId)));

            //菜单树
            CreateMap<Menu, MenuFuncTreeNodeView>()
                /*.ForMember(d => d.meta, u => u.MapFrom(s => new Meta() { MetaTitle = s.MetaTitle, MetaBreadcrumb = s.MetaBreadcrumb, MetaIcon = s.MetaIcon, MetaActiveMenu = s.MetaActiveMenu }))*/;

            //功能树
            CreateMap<Menu, FunctionTreeNodeDTO>();

            //普通用户菜单树
            CreateMap<UserTypeMenu, MenuFuncTreeNodeView>().IncludeMembers(t => t.Menu)
                .ForMember(d => d.Id, u => u.MapFrom(t => t.Menu.Id));
            //.ForMember(d => d.meta, u => u.MapFrom(s => new Meta() { MetaTitle = s.MenuFunction.MetaTitle, MetaBreadcrumb = s.MenuFunction.MetaBreadcrumb, MetaIcon = s.MenuFunction.MetaIcon, MetaActiveMenu = s.MenuFunction.MetaActiveMenu })); 


            CreateMap<UserTypeMenu, FunctionTreeNodeDTO>().IncludeMembers(t => t.Menu)
                 .ForMember(d => d.Id, u => u.MapFrom(t => t.Menu.Id));

            CreateMap<UserType, TrialUserType>()
                 .ForMember(d => d.UserType, u => u.MapFrom(t => t.UserTypeName));

            CreateMap<User, UserDetailDTO>()
           .ForMember(d => d.RealName, u => u.MapFrom(s => s.LastName + " / " + s.FirstName))
           .ForMember(d => d.UserTypeId, u => u.MapFrom(s => s.UserTypeRole.Id))
           .ForMember(d => d.UserType, u => u.MapFrom(s => s.UserTypeRole.UserTypeName))
           .ForMember(d => d.UserTypeShortName, u => u.MapFrom(s => s.UserTypeRole.UserTypeShortName))
           .ForMember(d => d.CanEditUserType, u => u.MapFrom(s => !s.UserTrials.Any()));

            CreateMap<User, UserListDTO>()
              .ForMember(d => d.RealName, u => u.MapFrom(s => s.LastName + " / " + s.FirstName))
              .ForMember(d => d.UserTypeId, u => u.MapFrom(s => s.UserTypeRole.Id))
              .ForMember(d => d.UserType, u => u.MapFrom(s => s.UserTypeRole.UserTypeShortName))
              .ForMember(d => d.CanEditUserType, u => u.MapFrom(s => !s.UserTrials.Any()));

        }
    }
   
}