import { IsString, IsOptional, IsArray, IsBoolean, ValidateNested } from 'class-validator';
import { Type } from 'class-transformer';

export class SavingRowDto {
  @IsOptional() @IsString() id?: string;
  @IsOptional() @IsString() savingRef?: string;
  @IsOptional() @IsString() accountNumber?: string;
  @IsOptional() @IsString() savingTitle?: string;
  @IsOptional() @IsString() amount?: string;
  @IsOptional() @IsBoolean() isDefault?: boolean;
  @IsOptional() @IsString() remarks?: string;
}

export class IncomeRowDto {
  @IsOptional() @IsString() id?: string;
  @IsOptional() @IsString() incomeHead?: string;
  @IsOptional() @IsString() incomeType?: string;
  @IsOptional() @IsString() daily?: string;
  @IsOptional() @IsString() monthly?: string;
  @IsOptional() @IsString() yearly?: string;
  @IsOptional() @IsString() amount?: string;
  @IsOptional() @IsString() amountType?: string;
  @IsOptional() @IsString() description?: string;
}

export class BusinessIncomeRowDto {
  @IsOptional() @IsString() id?: string;
  @IsOptional() @IsString() businessIncomeHead?: string;
  @IsOptional() @IsString() amount?: string;
  @IsOptional() @IsString() amountType?: string;
  @IsOptional() @IsString() daily?: string;
  @IsOptional() @IsString() monthly?: string;
  @IsOptional() @IsString() yearly?: string;
}

export class PayableInstitutionRowDto {
  @IsOptional() @IsString() id?: string;
  @IsOptional() @IsString() officeName?: string;
  @IsOptional() @IsString() daily?: string;
  @IsOptional() @IsString() monthly?: string;
  @IsOptional() @IsString() yearly?: string;
  @IsOptional() @IsString() amountOwed?: string;
  @IsOptional() @IsBoolean() exceeded?: boolean;
  @IsOptional() @IsString() amount?: string;
  @IsOptional() @IsString() amountType?: string;
  @IsOptional() @IsString() remarks?: string;
  @IsOptional() @IsString() loanPurpose?: string;
  @IsOptional() @IsString() loanAmount?: string;
  @IsOptional() @IsString() loanApprovedDate?: string;
  @IsOptional() @IsString() loanApprovedDateBs?: string;
}

export class FinancialTransactionRowDto {
  @IsOptional() @IsString() id?: string;
  @IsOptional() @IsString() financialHead?: string;
  @IsOptional() @IsString() title?: string;
  @IsOptional() @IsString() amount?: string;
}

export class ChargeRowDto {
  @IsOptional() @IsString() id?: string;
  @IsOptional() @IsString() chargeType?: string;
  @IsOptional() @IsString() chargeDeductedType?: string;
  @IsOptional() @IsString() chargeDeductedTypeAmount?: string;
  @IsOptional() @IsString() amount?: string;
  @IsOptional() @IsString() remarks?: string;
}

export class RelationRowDto {
  @IsOptional() @IsString() id?: string;
  @IsOptional() @IsString() subscriptionId?: string;
  @IsOptional() @IsString() relation?: string;
  @IsOptional() @IsString() name?: string;
  @IsOptional() @IsString() gender?: string;
  @IsOptional() @IsString() maritalStatus?: string;
  @IsOptional() @IsString() citizenshipNumber?: string;
  @IsOptional() @IsString() citizenshipIssueDistrict?: string;
  @IsOptional() @IsString() citizenshipIssueDateBs?: string;
  @IsOptional() @IsString() citizenshipIssueDate?: string;
  @IsOptional() @IsString() contactNumber?: string;
  @IsOptional() @IsString() age?: string;
  @IsOptional() @IsString() occupation?: string;
  @IsOptional() @IsString() secondGeneration?: string;
  @IsOptional() @IsString() secondGenerationName?: string;
  @IsOptional() @IsString() thirdGeneration?: string;
  @IsOptional() @IsString() thirdGenerationName?: string;
}

export class GuarantorRowDto {
  @IsOptional() @IsString() id?: string;
  @IsOptional() @IsString() memberId?: string;
  @IsOptional() @IsString() name?: string;
  @IsOptional() @IsString() nameEn?: string;
  @IsOptional() @IsString() relation?: string;
  @IsOptional() @IsString() gender?: string;
  @IsOptional() @IsString() dob?: string;
  @IsOptional() @IsString() dobBs?: string;
  @IsOptional() @IsString() age?: string;
  @IsOptional() @IsString() maritalStatus?: string;
  @IsOptional() @IsString() contactNumber?: string;
  @IsOptional() @IsString() formerAddress?: string;
  @IsOptional() @IsString() pProvince?: string;
  @IsOptional() @IsString() pDistrict?: string;
  @IsOptional() @IsString() pLocalgovt?: string;
  @IsOptional() @IsString() pWard?: string;
  @IsOptional() @IsString() pTole?: string;
  @IsOptional() @IsString() tProvince?: string;
  @IsOptional() @IsString() tDistrict?: string;
  @IsOptional() @IsString() tLocalgovt?: string;
  @IsOptional() @IsString() tWard?: string;
  @IsOptional() @IsString() tTole?: string;
  @IsOptional() @IsString() citizenshipNo?: string;
  @IsOptional() @IsString() citizenshipIssueDate?: string;
  @IsOptional() @IsString() citizenshipIssueDateBs?: string;
  @IsOptional() @IsString() citizenshipIssueDistrict?: string;
  @IsOptional() @IsString() secondGeneration?: string;
  @IsOptional() @IsString() secondGenerationName?: string;
  @IsOptional() @IsString() thirdGeneration?: string;
  @IsOptional() @IsString() thirdGenerationName?: string;
  @IsOptional() @IsString() subscriptionId?: string;
  @IsOptional() @IsString() subscriptionNumber?: string;
  @IsOptional() @IsString() savingTitle?: string;
  @IsOptional() @IsString() savingAmount?: string;
  @IsOptional() @IsString() shareAmount?: string;
  @IsOptional() @IsString() agreedAmount?: string;
  @IsOptional() @IsString() monthlyIncome?: string;
  @IsOptional() @IsString() totalAssets?: string;
  @IsOptional() @IsBoolean() familyApproval?: boolean;
  @IsOptional() @IsBoolean() savingApproval?: boolean;
  @IsOptional() @IsString() address?: string;
  @IsOptional() @IsString() photoUrl?: string;
  @IsOptional() @IsString() citizenshipFront?: string;
  @IsOptional() @IsString() citizenshipBack?: string;
}

export class CreateApplicationDto {
  @IsOptional() @IsString() memberId?: string;
  @IsOptional() @IsString() officeId?: string;
  @IsOptional() @IsString() headOffice?: string;
  @IsOptional() @IsString() headOfficeCode?: string;
  @IsOptional() @IsString() officeCode?: string;
  @IsOptional() @IsString() profileIdApplication?: string;

  // Loan
  @IsOptional() @IsString() loanPurpose?: string;
  @IsOptional() @IsString() loanTitle?: string;
  @IsOptional() @IsString() loanType?: string;
  @IsOptional() @IsString() requestedAmount?: string;
  @IsOptional() @IsString() loanPeriodMonths?: string;
  @IsOptional() @IsString() interestRate?: string;
  @IsOptional() @IsString() repaymentType?: string;

  // Dates
  @IsOptional() @IsString() applicationDate?: string;
  @IsOptional() @IsString() applicationDateBs?: string;
  @IsOptional() @IsString() loanApplyDate?: string;
  @IsOptional() @IsString() loanApplyDateBs?: string;
  @IsOptional() @IsString() fiscalYear?: string;
  @IsOptional() @IsString() meetingDate?: string;
  @IsOptional() @IsString() meetingDateBs?: string;
  @IsOptional() @IsString() meetingNumber?: string;
  @IsOptional() @IsString() recommendationMeetingDate?: string;
  @IsOptional() @IsString() recommendationMeetingDateBs?: string;
  @IsOptional() @IsString() recommendationMeetingNumber?: string;

  // Collateral
  @IsOptional() @IsString() collateralType?: string;
  @IsOptional() @IsString() collateralDescription?: string;
  @IsOptional() @IsString() collateralEstimatedValue?: string;

  // Income summary
  @IsOptional() @IsString() totalMonthlyIncome?: string;
  @IsOptional() @IsString() totalMonthlyExpense?: string;
  @IsOptional() @IsString() netMonthlyIncome?: string;
  @IsOptional() @IsString() monthlySaving?: string;
  @IsOptional() @IsString() totalSavings?: string;
  @IsOptional() @IsString() totalExistingCharges?: string;

  @IsOptional() @IsString() approvalTeam?: string;
  @IsOptional() @IsString() loanAccountNumber?: string;
  @IsOptional() @IsString() remarks?: string;
  @IsOptional() @IsString() status?: string;

  @IsOptional() @IsArray() @ValidateNested({ each: true }) @Type(() => SavingRowDto)
  savings?: SavingRowDto[];

  @IsOptional() @IsArray() @ValidateNested({ each: true }) @Type(() => IncomeRowDto)
  incomes?: IncomeRowDto[];

  @IsOptional() @IsArray() @ValidateNested({ each: true }) @Type(() => BusinessIncomeRowDto)
  businessIncomes?: BusinessIncomeRowDto[];

  @IsOptional() @IsArray() @ValidateNested({ each: true }) @Type(() => PayableInstitutionRowDto)
  payableInstitutions?: PayableInstitutionRowDto[];

  @IsOptional() @IsArray() @ValidateNested({ each: true }) @Type(() => FinancialTransactionRowDto)
  financialTransactions?: FinancialTransactionRowDto[];

  @IsOptional() @IsArray() @ValidateNested({ each: true }) @Type(() => ChargeRowDto)
  charges?: ChargeRowDto[];

  @IsOptional() @IsArray() @ValidateNested({ each: true }) @Type(() => RelationRowDto)
  relations?: RelationRowDto[];

  @IsOptional() @IsArray() @ValidateNested({ each: true }) @Type(() => GuarantorRowDto)
  guarantors?: GuarantorRowDto[];
}

export class UpdateApplicationDto extends CreateApplicationDto {}
