import {
    Column,
    CreateDateColumn,
    DeleteDateColumn,
    Entity,
    Index,
    ManyToOne,
    OneToMany,
    PrimaryGeneratedColumn,
    UpdateDateColumn,
  } from 'typeorm';
  import { Office } from './office.entity';
  import { MemberFamily } from './member-family.entity';

  @Entity({ name: 'members' })
  @Index('idx_members_status_type', ['status', 'memberType'])
  @Index('idx_members_office_status', ['officeId', 'status'])
  export class Member {
    @PrimaryGeneratedColumn('uuid')
    id!: string;

    // ── Coop-assigned identifiers ─────────────────────────────
    @Index()
    @Column({ type: 'varchar', name: 'office_id', nullable: true })
    officeId?: string;

    @ManyToOne(() => Office, { nullable: true, onDelete: 'SET NULL' })
    office?: Office;

    @Index()
    @Column({ type: 'varchar', name: 'member_id', length: 30, nullable: true })
    memberId?: string;

    @Column({ type: 'varchar', name: 'subscription_id', length: 100, nullable: true })
    subscriptionId?: string;

    @Column({ type: 'varchar', name: 'member_type', length: 50, nullable: true })
    memberType?: string;

    @Column({ type: 'varchar', name: 'subscription_date', length: 20, nullable: true })
    subscriptionDate?: string;

    @Column({ type: 'varchar', name: 'subscription_date_bs', length: 20, nullable: true })
    subscriptionDateBs?: string;

    // ── Name ─────────────────────────────────────────────────
    @Column({ type: 'varchar', name: 'name', length: 200, nullable: true })
    name?: string;           // Nepali (Devanagari)

    @Column({ type: 'varchar', name: 'name_en', length: 200, nullable: true })
    nameEn?: string;         // English

    // ── Basic demographics ────────────────────────────────────
    @Column({ type: 'varchar', length: 20, nullable: true })
    gender?: string;

    @Column({ type: 'varchar', name: 'dob', length: 20, nullable: true })
    dob?: string;            // AD date string

    @Column({ type: 'varchar', name: 'dob_bs', length: 20, nullable: true })
    dobBs?: string;          // BS date string

    @Column({ type: 'varchar', nullable: true })
    age?: string;

    @Column({ type: 'varchar', name: 'contact_number', nullable: true })
    contactNumber?: string;

    @Column({ type: 'varchar', nullable: true })
    email?: string;

    @Column({ type: 'varchar', name: 'edu_qualification', length: 30, nullable: true })
    eduQualification?: string;

    @Column({ type: 'varchar', name: 'caste_code', length: 30, nullable: true })
    casteCode?: string;

    @Column({ type: 'varchar', name: 'marital_status', length: 30, nullable: true })
    maritalStatus?: string;

    @Column({ type: 'varchar', nullable: true })
    occupation?: string;

    @Column({ type: 'varchar', name: 'occupation_location', nullable: true })
    occupationLocation?: string;

    @Column({ type: 'varchar', name: 'occupation_title', nullable: true })
    occupationTitle?: string;

    @Column({ type: 'varchar', nullable: true })
    nationality?: string;

    @Column({ type: 'varchar', nullable: true })
    religion?: string;

    // ── Permanent address (3-char codes) ─────────────────────
    @Column({ type: 'varchar', name: 'p_province', length: 5, nullable: true })
    pProvince?: string;

    @Column({ type: 'varchar', name: 'p_district', length: 5, nullable: true })
    pDistrict?: string;

    @Column({ type: 'varchar', name: 'p_localgovt', length: 5, nullable: true })
    pLocalgovt?: string;

    @Column({ type: 'varchar', name: 'p_ward', nullable: true })
    pWard?: string;

    @Column({ type: 'varchar', name: 'p_tole', nullable: true })
    pTole?: string;

    @Column({ type: 'varchar', name: 'p_house_no', nullable: true })
    pHouseNo?: string;

    // ── Temporary address (3-char codes) ─────────────────────
    @Column({ type: 'varchar', name: 't_province', length: 5, nullable: true })
    tProvince?: string;

    @Column({ type: 'varchar', name: 't_district', length: 5, nullable: true })
    tDistrict?: string;

    @Column({ type: 'varchar', name: 't_localgovt', length: 5, nullable: true })
    tLocalgovt?: string;

    @Column({ type: 'varchar', name: 't_ward', nullable: true })
    tWard?: string;

    @Column({ type: 'varchar', name: 't_tole', nullable: true })
    tTole?: string;

    @Column({ type: 'varchar', name: 't_house_no', nullable: true })
    tHouseNo?: string;

    // ── Citizenship ───────────────────────────────────────────
    @Column({ type: 'varchar', name: 'citizenship_number', nullable: true })
    citizenshipNumber?: string;

    @Column({ type: 'varchar', name: 'citizenship_issue_date', length: 20, nullable: true })
    citizenshipIssueDate?: string;

    @Column({ type: 'varchar', name: 'citizenship_issue_date_bs', length: 20, nullable: true })
    citizenshipIssueDateBs?: string;

    @Column({ type: 'varchar', name: 'citizenship_issue_district', length: 5, nullable: true })
    citizenshipIssueDistrict?: string;

    @Column({ type: 'varchar', name: 'citizenship_former_address', nullable: true })
    citizenshipFormerAddress?: string;

    // ── PAN ───────────────────────────────────────────────────
    @Column({ type: 'varchar', name: 'pan_no', nullable: true })
    panNo?: string;

    @Column({ type: 'varchar', name: 'pan_issue_place', length: 5, nullable: true })
    panIssuePlace?: string;

    @Column({ type: 'varchar', name: 'pan_issue_date', length: 20, nullable: true })
    panIssueDate?: string;

    @Column({ type: 'varchar', name: 'pan_issue_date_bs', length: 20, nullable: true })
    panIssueDateBs?: string;

    // ── National ID ───────────────────────────────────────────
    @Column({ type: 'varchar', name: 'national_id_no', nullable: true })
    nationalIdNo?: string;

    @Column({ type: 'varchar', name: 'national_id_issue_place', length: 5, nullable: true })
    nationalIdIssuePlace?: string;

    @Column({ type: 'varchar', name: 'national_id_issue_date', length: 20, nullable: true })
    nationalIdIssueDate?: string;

    @Column({ type: 'varchar', name: 'national_id_issue_date_bs', length: 20, nullable: true })
    nationalIdIssueDateBs?: string;

    // ── Voters ID ────────────────────────────────────────────
    @Column({ type: 'varchar', name: 'voters_id_card_no', nullable: true })
    votersIdCardNo?: string;

    @Column({ type: 'varchar', name: 'polling_station', nullable: true })
    pollingStation?: string;

    // ── Driving license ───────────────────────────────────────
    @Column({ type: 'varchar', name: 'driving_license_no', nullable: true })
    drivingLicenseNo?: string;

    @Column({ type: 'varchar', name: 'driving_license_issue_place', length: 5, nullable: true })
    drivingLicenseIssuePlace?: string;

    @Column({ type: 'varchar', name: 'driving_license_issue_date', length: 20, nullable: true })
    drivingLicenseIssueDate?: string;

    @Column({ type: 'varchar', name: 'driving_license_issue_date_bs', length: 20, nullable: true })
    drivingLicenseIssueDateBs?: string;

    // ── Passport ──────────────────────────────────────────────
    @Column({ type: 'varchar', name: 'passport_no', nullable: true })
    passportNo?: string;

    @Column({ type: 'varchar', name: 'passport_issue_place', nullable: true })
    passportIssuePlace?: string;

    @Column({ type: 'varchar', name: 'passport_issue_date', length: 20, nullable: true })
    passportIssueDate?: string;

    @Column({ type: 'varchar', name: 'passport_issue_date_bs', length: 20, nullable: true })
    passportIssueDateBs?: string;

    // ── Share & membership ────────────────────────────────────
    @Column({ type: 'varchar', name: 'share_amount', nullable: true })
    shareAmount?: string;

    @Column({ type: 'varchar', name: 'member_purpose', nullable: true })
    memberPurpose?: string;

    // ── Nearest person ────────────────────────────────────────
    @Column({ type: 'varchar', name: 'details_nearest_person_name', nullable: true })
    detailsNearestPersonName?: string;

    @Column({ type: 'varchar', name: 'details_nearest_person_relation', nullable: true })
    detailsNearestPersonRelation?: string;

    // ── AML / Risk ────────────────────────────────────────────
    @Column({ type: 'varchar', name: 'politically_exposed', nullable: true })
    politicallyExposed?: string;

    @Column({ type: 'varchar', name: 'any_crime_on_past', nullable: true })
    anyCrimeOnPast?: string;

    @Column({ type: 'varchar', name: 'risk_category', nullable: true })
    riskCategory?: string;

    // ── Business details ──────────────────────────────────────
    @Column({ type: 'varchar', name: 'business_vat_number', nullable: true })
    businessVatNumber?: string;

    @Column({ type: 'varchar', name: 'business_estimate_annual_income', nullable: true })
    businessEstimateAnnualIncome?: string;

    @Column({ type: 'varchar', name: 'business_register_office', nullable: true })
    businessRegisterOffice?: string;

    @Column({ type: 'varchar', name: 'business_register_number', nullable: true })
    businessRegisterNumber?: string;

    @Column({ type: 'varchar', name: 'business_pan_number', nullable: true })
    businessPanNumber?: string;

    @Column({ type: 'varchar', name: 'business_register_date_bs', length: 20, nullable: true })
    businessRegisterDateBs?: string;

    @Column({ type: 'varchar', name: 'business_registration_type', nullable: true })
    businessRegistrationType?: string;

    @Column({ type: 'varchar', name: 'business_nature', length: 30, nullable: true })
    businessNature?: string;

    // ── Financial estimates ───────────────────────────────────
    @Column({ type: 'varchar', name: 'estimated_holdings_amount', nullable: true })
    estimatedHoldingsAmount?: string;

    @Column({ type: 'varchar', name: 'estimated_annual_account_debit_credit', nullable: true })
    estimatedAnnualAccountDebitCredit?: string;

    @Column({ type: 'varchar', name: 'estimated_annual_turnover', nullable: true })
    estimatedAnnualTurnover?: string;

    @Column({ type: 'varchar', name: 'amount_to_be_deposited_annually', nullable: true })
    amountToBeDepositedAnnually?: string;

    @Column({ type: 'varchar', name: 'amount_of_debt_owed_institution', nullable: true })
    amountOfDebtOwedInstitution?: string;

    // ── Family names ──────────────────────────────────────────
    @Column({ type: 'varchar', name: 'grandfather_name', length: 200, nullable: true })
    grandfatherName?: string;

    @Column({ type: 'varchar', name: 'grandmother_name', length: 200, nullable: true })
    grandmotherName?: string;

    @Column({ type: 'varchar', name: 'father_name', length: 200, nullable: true })
    fatherName?: string;

    @Column({ type: 'varchar', name: 'mother_name', length: 200, nullable: true })
    motherName?: string;

    @Column({ type: 'varchar', name: 'spouse_name', length: 200, nullable: true })
    spouseName?: string;

    @Column({ type: 'varchar', name: 'father_in_law_name', length: 200, nullable: true })
    fatherInLawName?: string;

    @Column({ type: 'varchar', name: 'mother_in_law_name', length: 200, nullable: true })
    motherInLawName?: string;

    // ── Photo & signature ─────────────────────────────────────
    @Column({ type: 'varchar', name: 'photo_url', nullable: true })
    photoUrl?: string;

    @Column({ type: 'varchar', name: 'signature_url', nullable: true })
    signatureUrl?: string;

    // ── Document images (GCS object paths) ────────────────────
    @Column({ type: 'varchar', name: 'citizenship_front', nullable: true })
    citizenshipFront?: string;

    @Column({ type: 'varchar', name: 'citizenship_back', nullable: true })
    citizenshipBack?: string;

    @Column({ type: 'varchar', name: 'passport_image', nullable: true })
    passportImage?: string;

    @Column({ type: 'varchar', name: 'pan_card_photo', nullable: true })
    panCardPhoto?: string;

    @Column({ type: 'varchar', name: 'nid_card_photo', nullable: true })
    nidCardPhoto?: string;

    @Column({ type: 'varchar', name: 'voter_id_card', nullable: true })
    voterIdCard?: string;

    @Column({ type: 'varchar', name: 'marriage_registration_certificate', nullable: true })
    marriageRegistrationCertificate?: string;

    @Column({ type: 'varchar', name: 'basai_sarai_certificate', nullable: true })
    basaiSaraiCertificate?: string;

    @Column({ type: 'varchar', name: 'business_registration_certificate', nullable: true })
    businessRegistrationCertificate?: string;

    @Column({ type: 'varchar', name: 'landlord_proof', nullable: true })
    landlordProof?: string;

    @Column({ type: 'varchar', name: 'others_image', nullable: true })
    othersImage?: string;

    // ── Share certificate ─────────────────────────────────────
    @Column({ type: 'varchar', name: 'share_certificate_number', nullable: true })
    shareCertificateNumber?: string;

    // ── Business (extended) ───────────────────────────────────
    @Column({ type: 'varchar', name: 'business_estimated_cost', nullable: true })
    businessEstimatedCost?: string;

    @Column({ type: 'varchar', name: 'business_proprietor', nullable: true })
    businessProprietor?: string;

    @Column({ type: 'varchar', name: 'business_proprietor_relation', nullable: true })
    businessProprietorRelation?: string;

    // ── Landlord details ──────────────────────────────────────
    @Column({ type: 'varchar', name: 'landlords_name', length: 100, nullable: true })
    landlordsName?: string;

    @Column({ type: 'varchar', name: 'landlords_contact_no', nullable: true })
    landlordsContactNo?: string;

    // ── Local recommendations ─────────────────────────────────
    @Column({ type: 'varchar', name: 'local_recommendations', nullable: true })
    localRecommendations?: string;

    // ── Generation fields ─────────────────────────────────────
    @Column({ type: 'varchar', name: 'second_generation', length: 50, nullable: true })
    secondGeneration?: string;

    @Column({ type: 'varchar', name: 'second_generation_name', length: 200, nullable: true })
    secondGenerationName?: string;

    @Column({ type: 'varchar', name: 'third_generation', length: 50, nullable: true })
    thirdGeneration?: string;

    @Column({ type: 'varchar', name: 'third_generation_name', length: 200, nullable: true })
    thirdGenerationName?: string;

    // ── Member status & approval ──────────────────────────────
    @Column({ type: 'varchar', name: 'member_status', length: 30, nullable: true })
    memberStatus?: string;

    @Column({ type: 'varchar', name: 'member_relation_prakar', nullable: true })
    memberRelationPrakar?: string;

    @Column({ type: 'varchar', name: 'is_pre_member', nullable: true })
    isPreMember?: string;

    @Column({ type: 'varchar', name: 'board_meeting_date', length: 20, nullable: true })
    boardMeetingDate?: string;

    @Column({ type: 'varchar', name: 'board_meeting_date_bs', length: 20, nullable: true })
    boardMeetingDateBs?: string;

    @Column({ type: 'varchar', name: 'reviewed_by', nullable: true })
    reviewedBy?: string;

    @Column({ type: 'varchar', name: 'approved_by', nullable: true })
    approvedBy?: string;

    // ── Family members / nominees (relation) ──────────────────
    @OneToMany(() => MemberFamily, (f) => f.member, { cascade: true, eager: false })
    family?: MemberFamily[];

    // ── Status & audit ────────────────────────────────────────
    @Index()
    @Column({ default: true })
    status!: boolean;

    @Column({ type: 'varchar', name: 'source_from', length: 30, default: 'Akash Digital' })
    sourceFrom!: string;

    @Column({ type: 'varchar', name: 'created_by', nullable: true })
    createdBy?: string;

    @Column({ type: 'varchar', name: 'updated_by', nullable: true })
    updatedBy?: string;

    @CreateDateColumn()
    createdAt!: Date;

    @UpdateDateColumn()
    updatedAt!: Date;

    @DeleteDateColumn()
    deletedAt?: Date;
  }
  