using SolutionErp.Domain.Common;
using SolutionErp.Domain.Identity;

namespace SolutionErp.Domain.Hrm;

// Phase 10.1 G-H1 — Hồ sơ Nhân sự main entity (Mig 34).
// 1-1 với User qua UserId UNIQUE FK. AuditableEntity inherit cho soft delete.
//
// Port từ NamGroup CT_NHANSU (1675 NV) — Investigator field map đã verified với
// 10 NamGroup table. 5 satellite entity Phase 10.1 (defer 3 HĐLĐ Plan H2 sau):
//   EmployeeWorkHistory + EmployeeEducation + EmployeeFamilyRelation +
//   EmployeeSkill (polymorphic Kind) + EmployeeDocument.
//
// DiaChi dual-write 6 FK + freetext: spec gốc declare FK Province/District/Ward
// nhưng catalog chưa scaffold trong Mig 34 — DEFER FK constraint sang G-H2 khi
// thêm catalog Province/District/Ward. Plain nullable Guid? lưu giá trị tham
// chiếu tương lai + freetext snapshot song hành ngày đầu (lesson NamGroup drift).
//
// MaNhanVien format "NV/{YYYY}/{Seq:D4}" gen atomic SERIALIZABLE qua
// IEmployeeCodeGenerator (mirror IContractCodeGenerator pattern).
public class EmployeeProfile : AuditableEntity
{
    // ===== Identity link =====
    // 1-1 với User.Id (UNIQUE index). NV phải có user account login system.
    public Guid UserId { get; set; }

    // Mã nhân viên format "NV/2026/0001" — gen atomic per-year reset sequence.
    public string EmployeeCode { get; set; } = string.Empty;

    // ===== Trạng thái + phân loại =====
    public EmployeeStatus EmployeeStatus { get; set; } = EmployeeStatus.Active;
    public Gender? Gender { get; set; }
    public MaritalStatus? MaritalStatus { get; set; }
    public EmployeeType? EmployeeType { get; set; }

    // ===== Thông tin cá nhân cơ bản =====
    public DateOnly? DateOfBirth { get; set; }
    public string? BirthPlace { get; set; }            // Nơi sinh
    public string? Hometown { get; set; }              // Nguyên quán

    // ===== Liên hệ =====
    public string? Phone { get; set; }                 // SDT cá nhân (INDEX)
    public string? PersonalEmail { get; set; }         // Email cá nhân (khác email login)
    public string? InternalPhone { get; set; }         // SDT nội bộ

    // ===== Dân tộc + tôn giáo + quốc tịch =====
    public string? Ethnicity { get; set; }             // Dân tộc
    public string? Religion { get; set; }              // Tôn giáo
    public string Nationality { get; set; } = "Việt Nam";

    // ===== Giấy tờ tuỳ thân =====
    public string? IdCardNumber { get; set; }          // CCCD/CMND
    public DateOnly? IdCardIssueDate { get; set; }
    public string? IdCardIssuePlace { get; set; }

    public string? TaxCode { get; set; }               // MST cá nhân
    public string? SocialInsuranceNumber { get; set; } // Số sổ BHXH
    public string? PassportNumber { get; set; }

    // ===== Địa chỉ HKTT (Hộ khẩu thường trú) — dual-write FK + freetext =====
    // FK Province/District/Ward DEFER G-H2 khi catalog scaffold (plain Guid? ngày đầu).
    public string? PermanentAddressText { get; set; }  // Freetext snapshot full (vd "123 Nguyễn Văn A, P. Bến Nghé, Q.1, TP.HCM")
    public Guid? PermanentProvinceId { get; set; }     // FK→Provinces (defer)
    public Guid? PermanentDistrictId { get; set; }     // FK→Districts (defer)
    public Guid? PermanentWardId { get; set; }         // FK→Wards (defer)
    public string? StreetAddressPermanent { get; set; } // Số nhà + tên đường

    // ===== Địa chỉ Tạm trú — dual-write FK + freetext =====
    public string? TemporaryAddressText { get; set; }
    public Guid? TemporaryProvinceId { get; set; }
    public Guid? TemporaryDistrictId { get; set; }
    public Guid? TemporaryWardId { get; set; }
    public string? StreetAddressTemporary { get; set; }

    // ===== Tuyển dụng + nghỉ việc =====
    public DateOnly? HireDate { get; set; }            // Ngày vào làm
    public DateOnly? ResignDate { get; set; }          // Ngày nghỉ việc

    // ===== Liên hệ khẩn cấp (inline NOT satellite — chỉ 1 contact) =====
    public string? EmergencyContactName { get; set; }
    public string? EmergencyContactPhone { get; set; }
    public string? EmergencyContactAddress { get; set; }

    // ===== Trình độ + chức danh =====
    public string? Qualification { get; set; }         // Trình độ chuyên môn cao nhất (vd "Thạc sĩ XD")
    public string? AcademicTitle { get; set; }         // Học hàm/học vị (vd "PGS.TS.")

    // ===== Vị trí công tác =====
    public string? WorkLocation { get; set; }          // Nơi làm việc (công trường / VP)
    public string? TimekeepingCode { get; set; }       // Mã chấm công (sync máy chấm)

    // ===== Tài khoản ngân hàng =====
    public string? BankAccount { get; set; }
    public string? BankName { get; set; }
    public string? BankBranch { get; set; }

    // ===== Sức khoẻ =====
    public int? HeightCm { get; set; }
    public int? WeightKg { get; set; }
    public string? BloodType { get; set; }             // "A+", "O-", "AB" ...

    // ===== Lương =====
    // decimal NOT double (tránh floating point error tài chính).
    public decimal? BaseSalary { get; set; }           // Lương cơ bản
    public decimal? TotalSalary { get; set; }          // Tổng lương (bao gồm phụ cấp)

    // ===== Phép =====
    // decimal(5,2) — vd 12.5 ngày phép.
    public decimal? AnnualLeaveDays { get; set; }      // Phép năm
    public decimal? RemainingLeaveDays { get; set; }   // Phép còn lại
    public decimal? CompensatoryLeaveDays { get; set; } // Phép bù
    public decimal? SeniorityLeaveDays { get; set; }   // Phép thâm niên

    // ===== BHXH + BHYT =====
    public DateOnly? SocialInsuranceStartDate { get; set; } // Ngày bắt đầu đóng BHXH
    public string? MedicalRegistrationPlace { get; set; }   // Nơi đăng ký KCB ban đầu BHYT

    // ===== Đoàn thể =====
    public bool IsCommunistParty { get; set; }
    public DateOnly? CommunistPartyJoinDate { get; set; }
    public bool IsYouthUnion { get; set; }
    public DateOnly? YouthUnionJoinDate { get; set; }
    public bool IsTradeUnion { get; set; }
    public DateOnly? TradeUnionJoinDate { get; set; }

    // ===== Khác =====
    public string? PhotoUrl { get; set; }              // URL ảnh đại diện
    public string? Notes { get; set; }                 // Ghi chú free text

    // ===== Navigation =====
    public User? User { get; set; }
    public ICollection<EmployeeWorkHistory> WorkHistories { get; set; } = new List<EmployeeWorkHistory>();
    public ICollection<EmployeeEducation> Educations { get; set; } = new List<EmployeeEducation>();
    public ICollection<EmployeeFamilyRelation> FamilyRelations { get; set; } = new List<EmployeeFamilyRelation>();
    public ICollection<EmployeeSkill> Skills { get; set; } = new List<EmployeeSkill>();
    public ICollection<EmployeeDocument> Documents { get; set; } = new List<EmployeeDocument>();
}
