using System;
using System.Linq.Expressions;
using DocuMed.Domain.Dtos.SmallDtos;
using DocuMed.Domain.Entities.City;
using DocuMed.Domain.Entities.Hospitals;
using DocuMed.Domain.Entities.Staffs;
using DocuMed.Domain.Entities.User;
using Mapster.Models;

namespace DocuMed.Domain.Mappers
{
    public static partial class StudentMapper
    {
        public static Student AdaptToStudent(this StudentSDto p1)
        {
            return p1 == null ? null : new Student()
            {
                StudentId = p1.StudentId,
                UniversityId = p1.UniversityId,
                University = new University()
                {
                    Name = p1.UniversityName,
                    Id = p1.UniversityId
                },
                SectionId = p1.SectionId,
                Section = new Section()
                {
                    Name = p1.SectionName,
                    Id = p1.SectionId
                },
                UserId = p1.UserId,
                User = new ApplicationUser() {Id = p1.UserId},
                Id = p1.Id
            };
        }
        public static Student AdaptTo(this StudentSDto p2, Student p3)
        {
            if (p2 == null)
            {
                return null;
            }
            Student result = p3 ?? new Student();
            
            result.StudentId = p2.StudentId;
            result.UniversityId = p2.UniversityId;
            result.University = funcMain1(new Never(), result.University, p2);
            result.SectionId = p2.SectionId;
            result.Section = funcMain2(new Never(), result.Section, p2);
            result.UserId = p2.UserId;
            result.User = funcMain3(new Never(), result.User, p2);
            result.Id = p2.Id;
            return result;
            
        }
        public static Expression<Func<StudentSDto, Student>> ProjectToStudent => p10 => new Student()
        {
            StudentId = p10.StudentId,
            UniversityId = p10.UniversityId,
            University = new University()
            {
                Name = p10.UniversityName,
                Id = p10.UniversityId
            },
            SectionId = p10.SectionId,
            Section = new Section()
            {
                Name = p10.SectionName,
                Id = p10.SectionId
            },
            UserId = p10.UserId,
            User = new ApplicationUser() {Id = p10.UserId},
            Id = p10.Id
        };
        public static StudentSDto AdaptToSDto(this Student p11)
        {
            return p11 == null ? null : new StudentSDto()
            {
                StudentId = p11.StudentId,
                UniversityId = p11.UniversityId,
                UniversityName = p11.University != null ? p11.University.Name : string.Empty,
                SectionId = p11.SectionId,
                SectionName = p11.Section != null ? p11.Section.Name : string.Empty,
                UserId = p11.UserId,
                PhoneNumber = p11.User != null ? p11.User.PhoneNumber : string.Empty,
                FirstName = p11.User != null ? p11.User.FirstName : string.Empty,
                LastName = p11.User != null ? p11.User.LastName : string.Empty,
                NationalId = p11.User != null ? p11.User.NationalId : string.Empty,
                Id = p11.Id
            };
        }
        public static StudentSDto AdaptTo(this Student p12, StudentSDto p13)
        {
            if (p12 == null)
            {
                return null;
            }
            StudentSDto result = p13 ?? new StudentSDto();
            
            result.StudentId = p12.StudentId;
            result.UniversityId = p12.UniversityId;
            result.UniversityName = p12.University != null ? p12.University.Name : string.Empty;
            result.SectionId = p12.SectionId;
            result.SectionName = p12.Section != null ? p12.Section.Name : string.Empty;
            result.UserId = p12.UserId;
            result.PhoneNumber = p12.User != null ? p12.User.PhoneNumber : string.Empty;
            result.FirstName = p12.User != null ? p12.User.FirstName : string.Empty;
            result.LastName = p12.User != null ? p12.User.LastName : string.Empty;
            result.NationalId = p12.User != null ? p12.User.NationalId : string.Empty;
            result.Id = p12.Id;
            return result;
            
        }
        public static Expression<Func<Student, StudentSDto>> ProjectToSDto => p14 => new StudentSDto()
        {
            StudentId = p14.StudentId,
            UniversityId = p14.UniversityId,
            UniversityName = p14.University != null ? p14.University.Name : string.Empty,
            SectionId = p14.SectionId,
            SectionName = p14.Section != null ? p14.Section.Name : string.Empty,
            UserId = p14.UserId,
            PhoneNumber = p14.User != null ? p14.User.PhoneNumber : string.Empty,
            FirstName = p14.User != null ? p14.User.FirstName : string.Empty,
            LastName = p14.User != null ? p14.User.LastName : string.Empty,
            NationalId = p14.User != null ? p14.User.NationalId : string.Empty,
            Id = p14.Id
        };
        
        private static University funcMain1(Never p4, University p5, StudentSDto p2)
        {
            University result = p5 ?? new University();
            
            result.Name = p2.UniversityName;
            result.Id = p2.UniversityId;
            return result;
            
        }
        
        private static Section funcMain2(Never p6, Section p7, StudentSDto p2)
        {
            Section result = p7 ?? new Section();
            
            result.Name = p2.SectionName;
            result.Id = p2.SectionId;
            return result;
            
        }
        
        private static ApplicationUser funcMain3(Never p8, ApplicationUser p9, StudentSDto p2)
        {
            ApplicationUser result = p9 ?? new ApplicationUser();
            
            result.Id = p2.UserId;
            return result;
            
        }
    }
}