{"version":3,"file":"uc-ui.mjs","sources":["../../../src/lib/config/uc-ui-config.interface.ts","../../../src/lib/config/uc-ui-config.token.ts","../../../src/lib/config/provide-uc-ui.ts","../../../src/lib/config/index.ts","../../../src/lib/models/loan-summary.model.ts","../../../src/lib/models/api-response.model.ts","../../../src/lib/models/index.ts","../../../src/lib/mock-data/gst-mock-data.ts","../../../src/lib/mock-data/credit-bureau-mock-data.ts","../../../src/lib/services/loan-summary.service.ts","../../../src/lib/services/auth.service.ts","../../../src/lib/services/profiling.service.ts","../../../src/lib/services/workflow-orchestration.service.ts","../../../src/lib/services/index.ts","../../../src/lib/mock-data/balance-sheet-mock-data.ts","../../../src/lib/mock-data/index.ts","../../../src/lib/components/features/ai-summary-dialog/service-card/service-card.component.ts","../../../src/lib/components/features/ai-summary-dialog/service-card/service-card.component.html","../../../src/lib/components/shared/summary-loading/summary-loading.component.ts","../../../src/lib/components/sections/go-nogo-decision/go-nogo-decision.component.ts","../../../src/lib/components/sections/go-nogo-decision/go-nogo-decision.component.html","../../../src/lib/components/sections/borrower-info/borrower-info.component.ts","../../../src/lib/components/sections/borrower-info/borrower-info.component.html","../../../src/lib/components/sections/risk-rating/risk-rating.component.ts","../../../src/lib/components/sections/risk-rating/risk-rating.component.html","../../../src/lib/components/sections/director-info/director-info.component.ts","../../../src/lib/components/sections/director-info/director-info.component.html","../../../src/lib/components/sections/loan-facility/loan-facility.component.ts","../../../src/lib/components/sections/loan-facility/loan-facility.component.html","../../../src/lib/components/shared/charts/chart-format.util.ts","../../../src/lib/components/shared/charts/bar-chart/bar-chart.component.ts","../../../src/lib/components/sections/credit-bureau/credit-bureau.component.ts","../../../src/lib/components/sections/credit-bureau/credit-bureau.component.html","../../../src/lib/components/sections/credit-assessment/credit-assessment.component.ts","../../../src/lib/components/sections/credit-assessment/credit-assessment.component.html","../../../src/lib/components/shared/charts/line-chart/line-chart.component.ts","../../../src/lib/components/sections/gst-summary/gst-summary.component.ts","../../../src/lib/components/sections/gst-summary/gst-summary.component.html","../../../src/lib/components/shared/charts/pie-chart/pie-chart.component.ts","../../../src/lib/components/sections/balance-sheet/balance-sheet.component.ts","../../../src/lib/components/sections/balance-sheet/balance-sheet.component.html","../../../src/lib/components/sections/risk-assessment/risk-assessment.component.ts","../../../src/lib/components/sections/risk-assessment/risk-assessment.component.html","../../../src/lib/components/sections/ews-dashboard/ews-dashboard.component.ts","../../../src/lib/components/sections/ews-dashboard/ews-dashboard.component.html","../../../src/lib/components/sections/index.ts","../../../src/lib/components/shared/ai-settings-panel/ai-settings-panel.component.ts","../../../src/lib/components/shared/ai-settings-panel/ai-settings-panel.component.html","../../../src/lib/components/features/loan-summary/loan-summary.component.ts","../../../src/lib/components/features/loan-summary/loan-summary.component.html","../../../src/lib/components/shared/ai-settings-modal/ai-settings-modal.component.ts","../../../src/lib/components/shared/ai-settings-modal/ai-settings-modal.component.html","../../../src/lib/components/features/ai-summary-dialog/ai-summary-dialog.component.ts","../../../src/lib/components/features/ai-summary-dialog/ai-summary-dialog.component.html","../../../src/lib/components/shared/ai-summary-button/ai-summary-button.component.ts","../../../src/lib/components/shared/index.ts","../../../src/lib/components/features/login/login.component.ts","../../../src/lib/components/features/login/login.component.html","../../../src/lib/components/features/proposal-inbox/proposal-inbox.component.ts","../../../src/lib/components/features/proposal-inbox/proposal-inbox.component.html","../../../src/lib/components/features/index.ts","../../../src/public-api.ts","../../../src/uc-ui.ts"],"sourcesContent":["/**\r\n * UC-UI Library Configuration Interface\r\n * \r\n * Use this interface to configure the UC-UI library in your application.\r\n * Pass configuration to the `provideUcUi()` function in your app config.\r\n * \r\n * @example\r\n * ```typescript\r\n * // In app.config.ts\r\n * import { provideUcUi } from 'uc-ui';\r\n * \r\n * export const appConfig: ApplicationConfig = {\r\n *   providers: [\r\n *     provideUcUi({\r\n *       apiBaseUrl: 'https://api.example.com',\r\n *       endpoints: {\r\n *         aiInference: '/v1/generate-summary',\r\n *         multiModelInference: '/v1/generate-multiple-summary'\r\n *       }\r\n *     })\r\n *   ]\r\n * };\r\n * ```\r\n */\r\nexport interface UcUiConfig {\r\n  /**\r\n   * Base URL for all API endpoints.\r\n   * @example 'https://api.example.com' or '/api' for proxy\r\n   */\r\n  apiBaseUrl: string;\r\n\r\n  /**\r\n   * Custom endpoint paths (optional).\r\n   * If not provided, defaults will be used.\r\n   */\r\n  endpoints?: UcUiEndpoints;\r\n\r\n  /**\r\n   * Default AI model for inference (optional).\r\n   * @default 'gemma4:latest'\r\n   */\r\n  defaultModel?: string;\r\n\r\n  /**\r\n   * RAG (Retrieval-Augmented Generation) settings (optional).\r\n   */\r\n  ragSettings?: UcUiRagSettings;\r\n\r\n  /**\r\n   * Auth service configuration (optional).\r\n   */\r\n  auth?: UcUiAuthConfig;\r\n}\r\n\r\n/**\r\n * API endpoint configuration\r\n */\r\nexport interface UcUiEndpoints {\r\n  /**\r\n   * Single model AI inference endpoint\r\n   * @default '/v1/generate-summary'\r\n   */\r\n  aiInference?: string;\r\n\r\n  /**\r\n   * Multi-model AI inference endpoint\r\n   * @default '/v1/generate-multiple-summary'\r\n   */\r\n  multiModelInference?: string;\r\n\r\n  /**\r\n   * Profiling logs endpoint\r\n   * @default '/v1/profiling'\r\n   */\r\n  profiling?: string;\r\n\r\n  /**\r\n   * Package test (bureau data) endpoint\r\n   * @default '/v1/package-test'\r\n   */\r\n  packageTest?: string;\r\n}\r\n\r\n/**\r\n * RAG configuration settings\r\n */\r\nexport interface UcUiRagSettings {\r\n  /**\r\n   * Number of top results to retrieve\r\n   * @default 15\r\n   */\r\n  top_k?: number;\r\n\r\n  /**\r\n   * Chunk size for document splitting\r\n   * @default 1000\r\n   */\r\n  chunk_size?: number;\r\n\r\n  /**\r\n   * Overlap between chunks\r\n   * @default 150\r\n   */\r\n  chunk_overlap?: number;\r\n\r\n  /**\r\n   * Embedding model to use\r\n   * @default 'embeddinggemma:300m'\r\n   */\r\n  embedding_model?: string;\r\n\r\n  /**\r\n   * Search type for retrieval\r\n   * @default 'hybrid'\r\n   */\r\n  search_type?: 'similarity' | 'mmr' | 'hybrid';\r\n\r\n  /**\r\n   * Vector storage type\r\n   * @default 'pgvector'\r\n   */\r\n  storage_type?: 'pgvector' | 'inmemory';\r\n}\r\n\r\n/**\r\n * Authentication configuration\r\n */\r\nexport interface UcUiAuthConfig {\r\n  /**\r\n   * Auth API base URL (if different from main apiBaseUrl)\r\n   */\r\n  authApiUrl?: string;\r\n\r\n  /**\r\n   * Login endpoint path\r\n   * @default '/auth/login'\r\n   */\r\n  loginEndpoint?: string;\r\n}\r\n\r\n/**\r\n * Default configuration values\r\n */\r\nexport const UC_UI_DEFAULT_CONFIG: Partial<UcUiConfig> = {\r\n  defaultModel: 'gemma4:latest',\r\n  endpoints: {\r\n    aiInference: '/v1/generate-summary',\r\n    multiModelInference: '/v1/generate-multiple-summary',\r\n    profiling: '/v1/profiling',\r\n    packageTest: '/v1/package-test'\r\n  },\r\n  ragSettings: {\r\n    top_k: 15,\r\n    chunk_size: 1000,\r\n    chunk_overlap: 150,\r\n    embedding_model: 'embeddinggemma:300m',\r\n    search_type: 'hybrid',\r\n    storage_type: 'pgvector'\r\n  },\r\n  auth: {\r\n    loginEndpoint: '/auth/login'\r\n  }\r\n};\r\n","import { InjectionToken } from '@angular/core';\r\nimport { UcUiConfig } from './uc-ui-config.interface';\r\n\r\n/**\r\n * Injection token for UC-UI library configuration.\r\n * \r\n * Use `provideUcUi()` to provide this token in your application config\r\n * rather than providing it directly.\r\n * \r\n * @example\r\n * ```typescript\r\n * // Direct injection in a service\r\n * export class MyService {\r\n *   private config = inject(UC_UI_CONFIG);\r\n *   \r\n *   get apiUrl(): string {\r\n *     return this.config.apiBaseUrl;\r\n *   }\r\n * }\r\n * ```\r\n */\r\nexport const UC_UI_CONFIG = new InjectionToken<UcUiConfig>('UC_UI_CONFIG', {\r\n  providedIn: 'root',\r\n  factory: () => {\r\n    console.warn(\r\n      'UC-UI: No configuration provided. Using default configuration. ' +\r\n      'Please call provideUcUi() in your app config for production use.'\r\n    );\r\n    return {\r\n      apiBaseUrl: '/api',\r\n      endpoints: {\r\n        aiInference: '/v1/generate-summary',\r\n        multiModelInference: '/v1/generate-multiple-summary',\r\n        profiling: '/v1/profiling',\r\n        packageTest: '/v1/package-test'\r\n      },\r\n      defaultModel: 'gemma4:latest',\r\n      ragSettings: {\r\n        top_k: 15,\r\n        chunk_size: 1000,\r\n        chunk_overlap: 150,\r\n        embedding_model: 'embeddinggemma:300m',\r\n        search_type: 'hybrid',\r\n        storage_type: 'pgvector'\r\n      }\r\n    };\r\n  }\r\n});\r\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\r\nimport { UC_UI_CONFIG } from './uc-ui-config.token';\r\nimport { UcUiConfig, UC_UI_DEFAULT_CONFIG } from './uc-ui-config.interface';\r\n\r\n/**\r\n * Provides UC-UI library configuration for your Angular application.\r\n * \r\n * Call this function in your application's providers array to configure\r\n * the UC-UI library with your API endpoints and settings.\r\n * \r\n * @param config - The configuration object for UC-UI library\r\n * @returns EnvironmentProviders that can be used in app.config.ts\r\n * \r\n * @example\r\n * ```typescript\r\n * // In app.config.ts\r\n * import { ApplicationConfig } from '@angular/core';\r\n * import { provideUcUi } from 'uc-ui';\r\n * \r\n * export const appConfig: ApplicationConfig = {\r\n *   providers: [\r\n *     provideUcUi({\r\n *       apiBaseUrl: 'https://api.mycompany.com',\r\n *       endpoints: {\r\n *         aiInference: '/v1/generate-summary',\r\n *         multiModelInference: '/v1/generate-multiple-summary'\r\n *       },\r\n *       defaultModel: 'gemma4:latest',\r\n *       ragSettings: {\r\n *         top_k: 15,\r\n *         search_type: 'hybrid'\r\n *       }\r\n *     })\r\n *   ]\r\n * };\r\n * ```\r\n * \r\n * @example\r\n * ```typescript\r\n * // Minimal configuration\r\n * provideUcUi({\r\n *   apiBaseUrl: '/api'  // Uses proxy\r\n * })\r\n * ```\r\n */\r\nexport function provideUcUi(config: UcUiConfig): EnvironmentProviders {\r\n  // Merge with defaults\r\n  const mergedConfig: UcUiConfig = {\r\n    ...UC_UI_DEFAULT_CONFIG,\r\n    ...config,\r\n    endpoints: {\r\n      ...UC_UI_DEFAULT_CONFIG.endpoints,\r\n      ...config.endpoints\r\n    },\r\n    ragSettings: {\r\n      ...UC_UI_DEFAULT_CONFIG.ragSettings,\r\n      ...config.ragSettings\r\n    },\r\n    auth: {\r\n      ...UC_UI_DEFAULT_CONFIG.auth,\r\n      ...config.auth\r\n    }\r\n  };\r\n\r\n  return makeEnvironmentProviders([\r\n    {\r\n      provide: UC_UI_CONFIG,\r\n      useValue: mergedConfig\r\n    }\r\n  ]);\r\n}\r\n\r\n/**\r\n * Provides UC-UI library with default configuration.\r\n * Useful for quick setup or testing.\r\n * \r\n * @param apiBaseUrl - Base URL for API (default: '/api')\r\n * @returns EnvironmentProviders\r\n * \r\n * @example\r\n * ```typescript\r\n * provideUcUiWithDefaults('/api')\r\n * ```\r\n */\r\nexport function provideUcUiWithDefaults(apiBaseUrl: string = '/api'): EnvironmentProviders {\r\n  return provideUcUi({\r\n    apiBaseUrl,\r\n    ...UC_UI_DEFAULT_CONFIG\r\n  } as UcUiConfig);\r\n}\r\n","// Configuration exports\r\nexport * from './uc-ui-config.interface';\r\nexport * from './uc-ui-config.token';\r\nexport * from './provide-uc-ui';\r\n","/**\r\n * UC-UI Library - Loan Summary Data Models\r\n * \r\n * This file contains all interfaces and types related to loan summary data.\r\n * These models are used across all UC-UI components.\r\n */\r\n\r\n// ============================================================================\r\n// Borrower Information\r\n// ============================================================================\r\n\r\n/**\r\n * Borrower/Company information details\r\n */\r\nexport interface BorrowerInformation {\r\n  /** Company/Borrower name */\r\n  name: string;\r\n  /** Corporate Identification Number */\r\n  cin: string;\r\n  /** Date of Incorporation */\r\n  doi: string;\r\n  /** Director Identification Number */\r\n  din: string;\r\n  /** Registered address */\r\n  address: string;\r\n  /** PAN number */\r\n  pan: string;\r\n  /** GST number */\r\n  gst: string;\r\n}\r\n\r\n/**\r\n * Director information details\r\n */\r\nexport interface DirectorInformation {\r\n  /** Director name */\r\n  name: string;\r\n  /** Director Identification Number */\r\n  din: string;\r\n  /** PAN number */\r\n  pan: string;\r\n  /** PAN verification status */\r\n  panStatus: string;\r\n  /** Address */\r\n  address: string;\r\n  /** Phone number */\r\n  phoneNumber: string;\r\n  /** Email ID */\r\n  emailId: string;\r\n  /** Role in company */\r\n  role: string;\r\n  /** Years of experience */\r\n  experience: number;\r\n  /** Number of other directorships */\r\n  otherDirectorships: number;\r\n  /** Educational qualification */\r\n  qualification: string;\r\n  /** Shareholding percentage */\r\n  shareholding: number;\r\n  /** Date of appointment */\r\n  appointedDate: string;\r\n}\r\n\r\n// ============================================================================\r\n// Loan Facility\r\n// ============================================================================\r\n\r\n/**\r\n * Loan facility information\r\n */\r\nexport interface LoanFacilityInformation {\r\n  /** Type of facility */\r\n  facility: string;\r\n  /** Nature of limit */\r\n  natureOfLimit: string;\r\n  /** Amount requested */\r\n  amountRequested: number;\r\n  /** Tenure of loan */\r\n  tenure: string;\r\n}\r\n\r\n// ============================================================================\r\n// Credit Bureau\r\n// ============================================================================\r\n\r\n/**\r\n * Payment history breakdown\r\n */\r\nexport interface PaymentHistory {\r\n  /** Number of on-time payments */\r\n  onTimePayments: number;\r\n  /** Number of delayed payments */\r\n  delayedPayments: number;\r\n  /** Number of defaulted payments */\r\n  defaulted: number;\r\n}\r\n\r\n/**\r\n * Credit enquiries summary\r\n */\r\nexport interface CreditEnquiries {\r\n  /** Enquiries in last 30 days */\r\n  last30Days: number;\r\n  /** Enquiries in last 90 days */\r\n  last90Days: number;\r\n  /** Enquiries in last 6 months */\r\n  last6Months: number;\r\n}\r\n\r\n/**\r\n * Individual loan details\r\n */\r\nexport interface LoanDetail {\r\n  /** Lender name */\r\n  lender: string;\r\n  /** Type of loan */\r\n  loanType: string;\r\n  /** Sanctioned amount */\r\n  sanctioned: number;\r\n  /** Outstanding amount */\r\n  outstanding: number;\r\n  /** Days Past Due */\r\n  dpd: number;\r\n  /** Loan status */\r\n  status: 'Active' | 'Closed' | 'Delayed';\r\n}\r\n\r\n/**\r\n * Credit bureau details\r\n */\r\nexport interface CreditBureauDetails {\r\n  /** Credit score */\r\n  creditScore: number;\r\n  /** Score date */\r\n  scoreDate: string;\r\n  /** Days Past Due */\r\n  dpd: number;\r\n  /** SMA status */\r\n  sma: string;\r\n  /** NPA status */\r\n  npa: boolean;\r\n  /** Willful defaulter status */\r\n  willfulDefaulterStatus: boolean;\r\n  /** Suit filed status */\r\n  suitFiledStatus: boolean;\r\n  /** Recovery suit filed status */\r\n  recoverySuitFiledStatus: boolean;\r\n  /** Fraud reported status */\r\n  fraudReportedStatus: boolean;\r\n  /** Outstanding loan amount */\r\n  outstandingLoanAmount: number;\r\n  /** Total loan amount */\r\n  totalLoanAmount: number;\r\n  /** Total EMI amount */\r\n  totalEmiAmount: number;\r\n  /** Total overdue amount */\r\n  totalOverdueAmount: number;\r\n  /** Total number of loans */\r\n  totalNoOfLoans: number;\r\n  /** Total number of active loans */\r\n  totalNoOfActiveLoans: number;\r\n  /** Total number of closed loans */\r\n  totalNoOfClosedLoans: number;\r\n  /** Credit utilization percentage */\r\n  creditUtilization: number;\r\n  /** Payment history */\r\n  paymentHistory: PaymentHistory;\r\n  /** Credit enquiries */\r\n  creditEnquiries: CreditEnquiries;\r\n  /** Loan details */\r\n  loanDetails: LoanDetail[];\r\n}\r\n\r\n/**\r\n * Commercial credit assessment details\r\n */\r\nexport interface CommercialCreditAssessmentDetails {\r\n  /** Assessment score */\r\n  creditAssessmentScore: number;\r\n  /** Assessment grade */\r\n  creditAssessmentGrade: string;\r\n  /** Assessment remarks */\r\n  creditAssessmentRemarks: string;\r\n}\r\n\r\n/**\r\n * CRIF score details\r\n */\r\nexport interface CrifScoreDetails {\r\n  /** CRIF score */\r\n  crifScore: number;\r\n  /** CRIF grade */\r\n  crifGrade: string;\r\n  /** CRIF remarks */\r\n  crifRemarks: string;\r\n}\r\n\r\n/**\r\n * Combined credit summary\r\n */\r\nexport interface CreditSummary {\r\n  /** Credit bureau details */\r\n  creditBureauDetails: CreditBureauDetails;\r\n  /** Commercial credit assessment */\r\n  commercialCreditAssessmentDetails: CommercialCreditAssessmentDetails;\r\n  /** CRIF score details */\r\n  crifScoreDetails: CrifScoreDetails;\r\n}\r\n\r\n// ============================================================================\r\n// GST Summary\r\n// ============================================================================\r\n\r\n/**\r\n * GST monthly return data\r\n */\r\nexport interface GstMonthlyReturn {\r\n  /** Month */\r\n  month: string;\r\n  /** Total sales */\r\n  totalSales: number;\r\n  /** Total purchases */\r\n  totalPurchases: number;\r\n  /** Total tax paid */\r\n  totalTaxPaid: number;\r\n}\r\n\r\n/**\r\n * GST filing history entry\r\n */\r\nexport interface GstFilingHistory {\r\n  /** Filing period */\r\n  period: string;\r\n  /** Return type */\r\n  returnType: string;\r\n  /** Filed date */\r\n  filedDate: string;\r\n  /** Filing status */\r\n  status: 'Filed' | 'Pending' | 'Delayed';\r\n}\r\n\r\n/**\r\n * GST turnover trend data point\r\n */\r\nexport interface GstTurnoverTrend {\r\n  /** Month */\r\n  month: string;\r\n  /** Turnover amount */\r\n  turnover: number;\r\n}\r\n\r\n/**\r\n * GST summary details\r\n */\r\nexport interface GstSummary {\r\n  /** GST number */\r\n  gstNumber: string;\r\n  /** GST registration date */\r\n  gstRegistrationDate: string;\r\n  /** GST status */\r\n  gstStatus: 'Active' | 'Inactive';\r\n  /** Return filing status */\r\n  gstReturnFilingStatus: string;\r\n  /** Filing frequency */\r\n  gstReturnFilingFrequency: string;\r\n  /** Total sales */\r\n  totalSales: number;\r\n  /** Total purchases */\r\n  totalPurchases: number;\r\n  /** Total tax paid */\r\n  totalTaxPaid: number;\r\n  /** Total tax collected */\r\n  totalTaxCollected: number;\r\n  /** Year-over-year sales growth */\r\n  yoySalesGrowth: number;\r\n  /** Year-over-year purchase growth */\r\n  yoyPurchaseGrowth: number;\r\n  /** Month-over-month sales growth */\r\n  momSalesGrowth: number;\r\n  /** Month-over-month purchase growth */\r\n  momPurchaseGrowth: number;\r\n  /** Filing compliance percentage */\r\n  filingCompliance: number;\r\n  /** Average monthly turnover */\r\n  avgMonthlyTurnover: number;\r\n  /** Last filing date */\r\n  lastFilingDate: string;\r\n  /** Last filing status */\r\n  lastFilingStatus: 'On Time' | 'Delayed';\r\n  /** Turnover trend data */\r\n  turnoverTrend: GstTurnoverTrend[];\r\n  /** Monthly returns data */\r\n  monthlyReturns: GstMonthlyReturn[];\r\n  /** Filing history */\r\n  filingHistory: GstFilingHistory[];\r\n}\r\n\r\n// ============================================================================\r\n// Balance Sheet\r\n// ============================================================================\r\n\r\n/**\r\n * Balance sheet summary\r\n */\r\nexport interface BalanceSheetSummary {\r\n  /** Total assets */\r\n  totalAssets: number;\r\n  /** Total liabilities */\r\n  totalLiabilities: number;\r\n  /** Net worth */\r\n  netWorth: number;\r\n  /** Current ratio */\r\n  currentRatio: number;\r\n  /** Debt to equity ratio */\r\n  debtEquityRatio: number;\r\n  /** Total revenue */\r\n  totalRevenue: number;\r\n  /** Gross profit */\r\n  grossProfit: number;\r\n  /** Net profit */\r\n  netProfit: number;\r\n  /** Operating profit */\r\n  operatingProfit: number;\r\n  /** Working capital */\r\n  workingCapital: number;\r\n  /** Interest coverage ratio */\r\n  interestCoverageRatio: number;\r\n  /** Return on equity (%) */\r\n  returnOnEquity: number;\r\n  /** Return on assets (%) */\r\n  returnOnAssets: number;\r\n}\r\n\r\n// ============================================================================\r\n// Risk Assessment\r\n// ============================================================================\r\n\r\n/**\r\n * Generic risk details\r\n */\r\nexport interface RiskDetails {\r\n  /** Risk score */\r\n  riskScore: number;\r\n  /** Risk grade */\r\n  riskGrade: string;\r\n  /** Risk remarks */\r\n  riskRemarks: string;\r\n}\r\n\r\n/**\r\n * Risk factor for analysis\r\n */\r\nexport interface RiskFactor {\r\n  /** Factor name */\r\n  name: string;\r\n  /** Factor weight */\r\n  weight: number;\r\n  /** Factor score */\r\n  score: number;\r\n  /** Icon name */\r\n  icon: string;\r\n}\r\n\r\n/**\r\n * Financial metric\r\n */\r\nexport interface FinancialMetric {\r\n  /** Metric label */\r\n  label: string;\r\n  /** Metric value */\r\n  value: number;\r\n  /** Metric status */\r\n  status: 'Strong' | 'Good' | 'Adequate' | 'Weak';\r\n}\r\n\r\n/**\r\n * Risk rating analysis\r\n */\r\nexport interface RiskRatingAnalysis {\r\n  /** Overall risk level */\r\n  overallRisk: 'Low Risk' | 'Medium Risk' | 'High Risk';\r\n  /** Risk score */\r\n  riskScore: number;\r\n  /** Probability of Default */\r\n  pd: number;\r\n  /** Recommendation */\r\n  recommendation: string;\r\n  /** Risk factors */\r\n  riskFactors: RiskFactor[];\r\n  /** Financial metrics */\r\n  financialMetrics: FinancialMetric[];\r\n}\r\n\r\n/**\r\n * CRANK checker details\r\n */\r\nexport interface CrankCheckerDetails {\r\n  /** CRANK score */\r\n  crankScore: number;\r\n  /** CRANK grade */\r\n  crankGrade: string;\r\n  /** CRANK remarks */\r\n  crankRemarks: string;\r\n}\r\n\r\n/**\r\n * Risk assessment rating\r\n */\r\nexport interface RiskAssessmentRating {\r\n  /** ICRA risk assessment */\r\n  icraRiskAssessmentDetails: RiskDetails;\r\n  /** CRISIL score */\r\n  crisilScore: string;\r\n  /** Risk assessment details */\r\n  riskAssessmentDetails: RiskDetails;\r\n  /** CRANK checker details */\r\n  crankCheckerDetails: CrankCheckerDetails;\r\n}\r\n\r\n/**\r\n * Corpositary details\r\n */\r\nexport interface CorpositoryDetails {\r\n  /** Corpositary score */\r\n  corpositoryScore: number;\r\n  /** Corpositary grade */\r\n  corpositoryGrade: string;\r\n  /** Corpositary remarks */\r\n  corpositoryRemarks: string;\r\n}\r\n\r\n// ============================================================================\r\n// Early Warning System\r\n// ============================================================================\r\n\r\n/**\r\n * Early warning signals\r\n */\r\nexport interface EarlyWarningSignals {\r\n  /** EWS score */\r\n  ewsScore: number;\r\n  /** EWS grade */\r\n  ewsGrade: string;\r\n  /** EWS remarks */\r\n  ewsRemarks: string;\r\n}\r\n\r\n/**\r\n * EWS dashboard data\r\n */\r\nexport interface EwsDashboard {\r\n  /** Early warning signals */\r\n  earlyWarningSignals: EarlyWarningSignals;\r\n}\r\n\r\n// ============================================================================\r\n// Loan Summary\r\n// ============================================================================\r\n\r\n/**\r\n * Complete loan summary details\r\n */\r\nexport interface LoanSummaryDetails {\r\n  /** Borrower information */\r\n  borrowerInformation: BorrowerInformation;\r\n  /** Company director information */\r\n  companyDirectorInformation: DirectorInformation[];\r\n  /** Loan facility information */\r\n  loanFacilityInformation: LoanFacilityInformation[];\r\n  /** Credit summary */\r\n  creditSummary: CreditSummary;\r\n  /** GST summary */\r\n  gstSummary: GstSummary;\r\n  /** Balance sheet summary */\r\n  balanceSheetSummary: BalanceSheetSummary;\r\n  /** Risk assessment rating */\r\n  riskAssessmentRating: RiskAssessmentRating;\r\n  /** Corpositary details */\r\n  corpositoryDetails: CorpositoryDetails;\r\n  /** EWS dashboard */\r\n  ewsDashboard: EwsDashboard;\r\n  /** Risk rating analysis */\r\n  riskRatingAnalysis: RiskRatingAnalysis;\r\n}\r\n\r\n/**\r\n * Loan summary API response\r\n */\r\nexport interface LoanSummaryResponse {\r\n  /** Loan summary details */\r\n  loanSummaryDetails: LoanSummaryDetails;\r\n}\r\n\r\n// ============================================================================\r\n// Proposal\r\n// ============================================================================\r\n\r\n/**\r\n * Borrower information from proposal\r\n */\r\nexport interface ProposalBorrowerInfo {\r\n  /** Company name */\r\n  CompanyName: string;\r\n  /** Corporate Identification Number */\r\n  CIN: string;\r\n  /** Director Identification Number */\r\n  DIN: string;\r\n  /** Date of incorporation */\r\n  dateOfIncorporation: string;\r\n  /** PAN number */\r\n  Pan: string;\r\n  /** GST number */\r\n  Gst: string;\r\n  /** Address (optional) */\r\n  address?: string;\r\n}\r\n\r\n/**\r\n * Director information from proposal\r\n */\r\nexport interface ProposalDirectorInfo {\r\n  /** Director name */\r\n  directorName: string;\r\n  /** Director Identification Number */\r\n  DIN: string;\r\n  /** PAN number */\r\n  PAN: string;\r\n  /** Posting/Role */\r\n  posting: string;\r\n}\r\n\r\n/**\r\n * Facility information from proposal\r\n */\r\nexport interface ProposalFacilityInfo {\r\n  /** Facility name */\r\n  facilityName: string;\r\n  /** Nature of limit */\r\n  natureOfLimit: string;\r\n  /** Tenure */\r\n  tenure: string;\r\n  /** Amount requested */\r\n  amountRequested: string | number;\r\n}\r\n\r\n/**\r\n * Document attached to a proposal\r\n */\r\nexport interface ProposalDocument {\r\n  /** Document unique identifier */\r\n  documentId: string;\r\n  /** Document name (gst, cibil, fin) */\r\n  documentName: 'gst' | 'cibil' | 'fin' | string;\r\n  /** Document type (pdf, json, etc.) */\r\n  documentType: string;\r\n}\r\n\r\n/**\r\n * Loan proposal\r\n */\r\nexport interface Proposal {\r\n  /** Proposal number (unique identifier) */\r\n  proposalNo: string;\r\n  /** Borrower name */\r\n  borrowerName: string;\r\n  /** Loan type */\r\n  loanType: string;\r\n  /** Amount requested */\r\n  amountRequested: number;\r\n  /** Proposal status */\r\n  status: 'Pending' | 'Under Review' | 'Approved' | 'Rejected' | string;\r\n  /** Submission date */\r\n  submissionDate: string;\r\n  /** Assigned underwriter */\r\n  assignedTo?: string;\r\n  /** Documents attached to the proposal */\r\n  documents: ProposalDocument[];\r\n  /** Whether AI settings configuration is allowed */\r\n  isAiSettingsConfigurable?: boolean;\r\n  /** Borrower information */\r\n  borrowerInfo?: ProposalBorrowerInfo;\r\n  /** Director information array */\r\n  directorInfo?: ProposalDirectorInfo[];\r\n  /** Facility information array */\r\n  facilityInfo?: ProposalFacilityInfo[];\r\n}\r\n\r\n// ============================================================================\r\n// Summary Service\r\n// ============================================================================\r\n\r\n/**\r\n * Summary service configuration\r\n */\r\nexport interface SummaryService {\r\n  /** Service ID */\r\n  id: string;\r\n  /** Service name */\r\n  name: string;\r\n  /** Service description */\r\n  description: string;\r\n  /** Icon name */\r\n  icon: string;\r\n  /** Service category */\r\n  category: 'essential' | 'additional';\r\n  /** Whether service is selected */\r\n  selected: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Go/No-Go Decision\r\n// ============================================================================\r\n\r\n/**\r\n * Decision factor\r\n */\r\nexport interface DecisionFactor {\r\n  /** Factor name */\r\n  name: string;\r\n  /** Factor status */\r\n  status: 'pass' | 'fail' | 'warning';\r\n  /** Factor value */\r\n  value: string;\r\n  /** Factor weight */\r\n  weight: number;\r\n}\r\n\r\n/**\r\n * Go/No-Go decision\r\n */\r\nexport interface GoNoGoDecision {\r\n  /** Decision outcome */\r\n  decision: 'GO' | 'NO-GO' | 'REVIEW';\r\n  /** Decision score */\r\n  score: number;\r\n  /** Decision factors */\r\n  factors: DecisionFactor[];\r\n  /** Remarks */\r\n  remarks: string;\r\n}\r\n\r\n// ============================================================================\r\n// Bureau Data Extraction Models (Package Test)\r\n// ============================================================================\r\n\r\n/**\r\n * Bureau loan detail from package test\r\n */\r\nexport interface BureauLoanDetail {\r\n  lender: string | number;\r\n  loan_type: string | number;\r\n  sanctioned_amount: string | number;\r\n  outstanding_amount: string | number;\r\n  dpd: string | number;\r\n  status: string | number;\r\n}\r\n\r\n/**\r\n * Bureau data from package test API\r\n */\r\nexport interface BureauData {\r\n  cibil_score: string | number;\r\n  cibil_remarks: string | number;\r\n  total_accounts: string | number;\r\n  active_accounts: string | number;\r\n  credit_utilization: string | number;\r\n  ontime_payments: string | number;\r\n  delayed_payments: string | number;\r\n  defaulted_payments: string | number;\r\n  last_30_days_credit_enquiries: string | number;\r\n  last_90_days_credit_enquiries: string | number;\r\n  last_6_months_credit_enquiries: string | number;\r\n  loan_details: BureauLoanDetail[];\r\n}\r\n\r\n/**\r\n * Package test API response\r\n */\r\nexport interface PackageTestResponse {\r\n  status: string;\r\n  request_id: string;\r\n  bureau_data: BureauData;\r\n  processing_time_ms: number;\r\n  cached?: boolean;\r\n}\r\n","/**\r\n * UC-UI Library - API Response Models\r\n * \r\n * This file contains interfaces for API responses used by services.\r\n */\r\n\r\n// ============================================================================\r\n// AI Inference Responses\r\n// ============================================================================\r\n\r\n/**\r\n * Single model AI inference response\r\n */\r\nexport interface AIInferenceResponse {\r\n  /** Request ID */\r\n  request_id: string;\r\n  /** Model used */\r\n  model: string;\r\n  /** Generated response text */\r\n  response: string;\r\n  /** Inference time in milliseconds */\r\n  inference_time_ms: number;\r\n  /** Status */\r\n  status: string;\r\n}\r\n\r\n/**\r\n * Document analysis response\r\n */\r\nexport interface DocumentResponse {\r\n  /** Status */\r\n  status: string;\r\n  /** Response text */\r\n  response: string;\r\n  /** Processing time in milliseconds */\r\n  time_ms: number;\r\n  /** Number of chunks used */\r\n  chunks_used: number;\r\n  /** Error message if any */\r\n  error_message?: string;\r\n}\r\n\r\n// ============================================================================\r\n// Quick Summary Interfaces\r\n// ============================================================================\r\n\r\n/**\r\n * GST Quick Summary from backend API\r\n * Values can be string '-' when data is unavailable\r\n */\r\nexport interface GstQuickSummary {\r\n  /** GST registration number */\r\n  gst_number: string | number;\r\n  /** Registration date */\r\n  registration_date: string | number;\r\n  /** GST status (Active, Inactive, etc.) */\r\n  gst_status: string | number;\r\n  /** Filing compliance percentage */\r\n  filing_compliance: string | number;\r\n  /** Average monthly turnover */\r\n  avg_monthly_turnover: string | number;\r\n  /** Last filing date */\r\n  last_filing_date: string | number;\r\n  /** Last filing status */\r\n  last_filing_status: string | number;\r\n  /** Total sales amount */\r\n  total_sales: string | number;\r\n  /** Total purchases amount */\r\n  total_purchases: string | number;\r\n  /** Total tax paid */\r\n  total_tax_paid: string | number;\r\n  /** Total tax collected */\r\n  total_tax_collected: string | number;\r\n  /** Year-over-year sales growth */\r\n  yoy_sales_growth: string | number;\r\n  /** Year-over-year purchase growth */\r\n  yoy_purchase_growth: string | number;\r\n  /** Month-over-month sales growth */\r\n  mom_sales_growth: string | number;\r\n  /** Month-over-month purchase growth */\r\n  mom_purchase_growth: string | number;\r\n}\r\n\r\n/**\r\n * Bureau/CIBIL Quick Summary from backend API\r\n * Values can be string '-' when data is unavailable\r\n */\r\nexport interface BureauQuickSummary {\r\n  /** CIBIL credit score */\r\n  cibil_score: string | number;\r\n  /** CIBIL score remarks (good, average, poor, etc.) */\r\n  cibil_remarks: string | number;\r\n  /** Total number of accounts */\r\n  total_accounts: string | number;\r\n  /** Number of active accounts */\r\n  active_accounts: string | number;\r\n  /** Credit utilization percentage */\r\n  credit_utilization: string | number;\r\n  /** Number of on-time payments */\r\n  ontime_payments: string | number;\r\n  /** Number of delayed payments */\r\n  delayed_payments: string | number;\r\n  /** Number of defaulted payments */\r\n  defaulted_payments: string | number;\r\n  /** Credit enquiries in last 30 days */\r\n  last_30_days_credit_enquiries: string | number;\r\n  /** Credit enquiries in last 90 days */\r\n  last_90_days_credit_enquiries: string | number;\r\n  /** Credit enquiries in last 6 months */\r\n  last_6_months_credit_enquiries: string | number;\r\n  /** Loan details summary */\r\n  loan_details: string | number;\r\n}\r\n\r\n/**\r\n * Financial Statement Quick Summary from backend API\r\n * Values can be string '-' when data is unavailable\r\n */\r\nexport interface FinancialQuickSummary {\r\n  /** Total assets */\r\n  total_assets: string | number;\r\n  /** Total liabilities */\r\n  total_liabilities: string | number;\r\n  /** Net worth */\r\n  net_worth: string | number;\r\n  /** Current ratio */\r\n  current_ratio: string | number;\r\n  /** Debt to equity ratio */\r\n  debt_equity_ratio: string | number;\r\n  /** Total revenue */\r\n  total_revenue: string | number;\r\n  /** Net profit */\r\n  net_profit: string | number;\r\n  /** Gross profit */\r\n  gross_profit: string | number;\r\n  /** Operating profit */\r\n  operating_profit: string | number;\r\n  /** Cash flow from operations */\r\n  cash_flow_from_operations: string | number;\r\n  /** Working capital */\r\n  working_capital: string | number;\r\n  /** Interest coverage ratio */\r\n  interest_coverage_ratio: string | number;\r\n  /** Return on equity */\r\n  return_on_equity: string | number;\r\n  /** Return on assets */\r\n  return_on_assets: string | number;\r\n}\r\n\r\n/**\r\n * Combined Quick Summary object from backend\r\n */\r\nexport interface QuickSummary {\r\n  /** GST quick summary data */\r\n  gst?: GstQuickSummary;\r\n  /** Bureau/CIBIL quick summary data */\r\n  bureau?: BureauQuickSummary;\r\n  /** Financial statement quick summary data */\r\n  financial?: FinancialQuickSummary;\r\n}\r\n\r\n/**\r\n * Multi-model inference response\r\n */\r\nexport interface MultiModelInferenceResponse {\r\n  /** Request ID */\r\n  request_id: string;\r\n  /** Overall status */\r\n  status: string;\r\n  /** Individual responses by document type */\r\n  responses: {\r\n    /** GST document response */\r\n    gst?: DocumentResponse;\r\n    /** Bureau document response */\r\n    bureau?: DocumentResponse;\r\n    /** Financial document response */\r\n    financial?: DocumentResponse;\r\n    /** Go/No-Go response */\r\n    go_nogo?: DocumentResponse;\r\n  };\r\n  /** Quick summary data for overview cards */\r\n  quick_summary?: QuickSummary;\r\n  /** Total processing time in milliseconds */\r\n  total_time_ms: number;\r\n  /** List of errors */\r\n  errors: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Profiling Models\r\n// ============================================================================\r\n\r\n/**\r\n * Profiling list item\r\n */\r\nexport interface ProfilingListItem {\r\n  /** Profiling ID */\r\n  id: number;\r\n  /** Request ID */\r\n  request_id: string;\r\n  /** Generated at timestamp */\r\n  generated_at: string | null;\r\n  /** Start time */\r\n  start_time: string | null;\r\n  /** End time */\r\n  end_time: string | null;\r\n  /** Total duration in milliseconds */\r\n  total_duration_ms: number;\r\n  /** Status */\r\n  status: 'success' | 'failed';\r\n  /** Document type */\r\n  document_type: string | null;\r\n  /** Model name */\r\n  model_name: string | null;\r\n  /** Query preview */\r\n  query_preview: string | null;\r\n}\r\n\r\n/**\r\n * Profiling detail (includes markdown)\r\n */\r\nexport interface ProfilingDetail extends ProfilingListItem {\r\n  /** Full profiling markdown */\r\n  profiling_md: string;\r\n}\r\n\r\n/**\r\n * Profiling list API response\r\n */\r\nexport interface ProfilingListResponse {\r\n  /** Status */\r\n  status: string;\r\n  /** Total count */\r\n  total: number;\r\n  /** Limit */\r\n  limit: number;\r\n  /** Offset */\r\n  offset: number;\r\n  /** Profiling items */\r\n  data: ProfilingListItem[];\r\n}\r\n\r\n/**\r\n * Profiling detail API response\r\n */\r\nexport interface ProfilingDetailResponse {\r\n  /** Status */\r\n  status: string;\r\n  /** Profiling detail */\r\n  data: ProfilingDetail;\r\n}\r\n\r\n/**\r\n * Profiling statistics\r\n */\r\nexport interface ProfilingStats {\r\n  /** Total count */\r\n  total_count: number;\r\n  /** Success count */\r\n  success_count: number;\r\n  /** Failed count */\r\n  failed_count: number;\r\n  /** Average duration in milliseconds */\r\n  avg_duration_ms: number;\r\n  /** Minimum duration in milliseconds */\r\n  min_duration_ms: number;\r\n  /** Maximum duration in milliseconds */\r\n  max_duration_ms: number;\r\n  /** First profiling timestamp */\r\n  first_profiling: string | null;\r\n  /** Last profiling timestamp */\r\n  last_profiling: string | null;\r\n}\r\n\r\n/**\r\n * Profiling stats API response\r\n */\r\nexport interface ProfilingStatsResponse {\r\n  /** Status */\r\n  status: string;\r\n  /** Statistics data */\r\n  data: ProfilingStats;\r\n}\r\n\r\n/**\r\n * Profiling filters\r\n */\r\nexport interface ProfilingFilters {\r\n  /** Status filter */\r\n  status?: 'success' | 'failed' | null;\r\n  /** Start date filter */\r\n  startDate?: string | null;\r\n  /** End date filter */\r\n  endDate?: string | null;\r\n  /** Request ID filter */\r\n  requestId?: string | null;\r\n  /** Document type filter */\r\n  documentType?: string | null;\r\n  /** Sort by duration */\r\n  sortByDuration?: 'high' | 'low' | null;\r\n  /** Time period filter */\r\n  timePeriod?: 'today' | 'yesterday' | 'last_week' | 'last_month' | null;\r\n}\r\n\r\n// ============================================================================\r\n// Bureau Data (Package Test)\r\n// ============================================================================\r\n\r\n/**\r\n * Bureau loan detail\r\n */\r\n// Re-export from loan-summary.model to avoid duplication\r\nexport { BureauLoanDetail, BureauData, PackageTestResponse } from './loan-summary.model';\r\n\r\n// ============================================================================\r\n// Auth Models\r\n// ============================================================================\r\n\r\n/**\r\n * Login request\r\n */\r\nexport interface LoginRequest {\r\n  /** Username */\r\n  username: string;\r\n  /** Password */\r\n  password: string;\r\n}\r\n\r\n/**\r\n * Login response\r\n */\r\nexport interface LoginResponse {\r\n  /** Status */\r\n  status: string;\r\n  /** Last login timestamp */\r\n  lastLoginTimestamp: string;\r\n  /** Message */\r\n  message: string;\r\n}\r\n","// Models exports\r\nexport * from './loan-summary.model';\r\nexport * from './api-response.model';\r\n","import { GstSummary } from '../models/loan-summary.model';\n\n/**\n * Fallback GST demo data, used only when no real backend response\n * (gstQuickSummary) is available for a given proposal.\n *\n * Window: last 15 months ending Jul-26 (the borrower's most recent filed\n * period). Month keys use the same \"Mon-YY\" format across turnoverTrend,\n * monthlyReturns, and filingHistory so they merge correctly by month.\n */\nexport const MOCK_GST_SUMMARY: GstSummary = {\n  gstNumber: '27AABCA1234F1ZM',\n  gstRegistrationDate: '2018-05-15',\n  gstStatus: 'Active',\n  gstReturnFilingStatus: 'Regular',\n  gstReturnFilingFrequency: 'Monthly',\n  totalSales: 133460000,\n  totalPurchases: 98700000,\n  totalTaxPaid: 2822400,\n  totalTaxCollected: 3202400,\n  yoySalesGrowth: 12.5,\n  yoyPurchaseGrowth: 8.3,\n  momSalesGrowth: 7.5,\n  momPurchaseGrowth: 5.6,\n  filingCompliance: 96,\n  avgMonthlyTurnover: 10946667,\n  lastFilingDate: '2026-07-20',\n  lastFilingStatus: 'On Time',\n  turnoverTrend: [\n    { month: 'May-25', turnover: 9100000 },\n    { month: 'Jun-25', turnover: 9800000 },\n    { month: 'Jul-25', turnover: 10200000 },\n    { month: 'Aug-25', turnover: 9700000 },\n    { month: 'Sep-25', turnover: 10500000 },\n    { month: 'Oct-25', turnover: 10100000 },\n    { month: 'Nov-25', turnover: 9900000 },\n    { month: 'Dec-25', turnover: 11200000 },\n    { month: 'Jan-26', turnover: 10800000 },\n    { month: 'Feb-26', turnover: 9580000 },\n    { month: 'Mar-26', turnover: 10300000 },\n    { month: 'Apr-26', turnover: 10900000 },\n    { month: 'May-26', turnover: 11500000 },\n    { month: 'Jun-26', turnover: 11100000 },\n    { month: 'Jul-26', turnover: 12300000 },\n  ],\n  monthlyReturns: [\n    { month: 'Jul-26', totalSales: 12300000, totalPurchases: 8990000, totalTaxPaid: 590000 },\n    { month: 'Jun-26', totalSales: 11100000, totalPurchases: 8100000, totalTaxPaid: 530000 },\n    { month: 'May-26', totalSales: 11500000, totalPurchases: 8400000, totalTaxPaid: 550000 },\n    { month: 'Apr-26', totalSales: 10900000, totalPurchases: 8000000, totalTaxPaid: 520000 },\n    { month: 'Mar-26', totalSales: 10300000, totalPurchases: 7500000, totalTaxPaid: 504000 },\n    { month: 'Feb-26', totalSales: 9580000, totalPurchases: 7100000, totalTaxPaid: 446400 },\n  ],\n  filingHistory: [\n    { period: 'Jun-26', returnType: 'GSTR-3B', filedDate: '2026-07-20', status: 'Filed' },\n    { period: 'May-26', returnType: 'GSTR-3B', filedDate: '2026-06-19', status: 'Filed' },\n    { period: 'Apr-26', returnType: 'GSTR-3B', filedDate: '2026-05-22', status: 'Delayed' },\n    { period: 'Mar-26', returnType: 'GSTR-3B', filedDate: '2026-04-18', status: 'Filed' },\n    { period: 'Feb-26', returnType: 'GSTR-3B', filedDate: '2026-03-20', status: 'Filed' },\n  ],\n};\n","import { CreditBureauDetails } from '../models/loan-summary.model';\n\n/**\n * Fallback Credit Bureau demo data, used only when no real backend response\n * (bureauQuickSummary / bureauData) is available for a given proposal.\n */\nexport const MOCK_CREDIT_BUREAU_DETAILS: CreditBureauDetails = {\n  creditScore: 742,\n  scoreDate: '2026-07-01',\n  dpd: 0,\n  sma: 'SMA-0',\n  npa: false,\n  willfulDefaulterStatus: false,\n  suitFiledStatus: false,\n  recoverySuitFiledStatus: false,\n  fraudReportedStatus: false,\n  outstandingLoanAmount: 750000,\n  totalLoanAmount: 3702300,\n  totalEmiAmount: 45000,\n  totalOverdueAmount: 0,\n  totalNoOfLoans: 4,\n  totalNoOfActiveLoans: 4,\n  totalNoOfClosedLoans: 0,\n  creditUtilization: 32,\n  paymentHistory: { onTimePayments: 96, delayedPayments: 3, defaulted: 1 },\n  creditEnquiries: { last30Days: 2, last90Days: 5, last6Months: 9 },\n  loanDetails: [\n    { lender: 'NOTDISCLOSED', loanType: 'CASHCREDIT', sanctioned: 3002300, outstanding: 250000, dpd: 0, status: 'Active' },\n    { lender: 'ABCCompany', loanType: 'WorkingCapital', sanctioned: 100000, outstanding: 100000, dpd: 0, status: 'Active' },\n    { lender: 'ABCCompany', loanType: 'NonFunded', sanctioned: 200000, outstanding: 200000, dpd: 0, status: 'Active' },\n    { lender: 'ABCCompany', loanType: 'Forex', sanctioned: 200000, outstanding: 200000, dpd: 0, status: 'Active' },\n    { lender: 'XYZBank', loanType: 'WorkingCapital', sanctioned: 150000, outstanding: 90000, dpd: 5, status: 'Delayed' },\n  ],\n};\n","/**\r\n * UC-UI Library - Loan Summary Service\r\n * \r\n * Main service for loan summary data, AI inference, and proposal management.\r\n * All API endpoints are configurable through UcUiConfig.\r\n */\r\n\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable, of, delay, catchError, map } from 'rxjs';\r\n\r\nimport { UC_UI_CONFIG } from '../config/uc-ui-config.token';\r\nimport {\r\n  LoanSummaryResponse,\r\n  Proposal,\r\n  ProposalDocument,\r\n  SummaryService,\r\n  GoNoGoDecision,\r\n  LoanSummaryDetails,\r\n  DecisionFactor\r\n} from '../models/loan-summary.model';\r\nimport {\r\n  AIInferenceResponse,\r\n  MultiModelInferenceResponse,\r\n  PackageTestResponse\r\n} from '../models/api-response.model';\r\nimport { MOCK_GST_SUMMARY } from '../mock-data/gst-mock-data';\r\nimport { MOCK_CREDIT_BUREAU_DETAILS } from '../mock-data/credit-bureau-mock-data';\r\n\r\n/**\r\n * Service for managing loan summary data, AI inference, and proposals.\r\n * \r\n * @example\r\n * ```typescript\r\n * export class MyComponent {\r\n *   private loanSummaryService = inject(LoanSummaryService);\r\n *   \r\n *   ngOnInit() {\r\n *     this.loanSummaryService.getLoanSummary('APP-001').subscribe(summary => {\r\n *       console.log(summary);\r\n *     });\r\n *   }\r\n * }\r\n * ```\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class LoanSummaryService {\r\n  private readonly http = inject(HttpClient);\r\n  private readonly config = inject(UC_UI_CONFIG);\r\n\r\n  // ============================================================================\r\n  // Configuration Properties (synced with service state)\r\n  // ============================================================================\r\n  \r\n  /** Whether to use AI/RAG mode */\r\n  isAI = true;\r\n  \r\n  /** Whether to use RAG (Retrieval-Augmented Generation) */\r\n  isRag = true;\r\n  \r\n  /** Number of top results for RAG retrieval */\r\n  top_k = 15;\r\n  \r\n  /** Chunk size for document splitting */\r\n  chunk_size = 1000;\r\n  \r\n  /** Overlap between chunks */\r\n  chunk_overlap = 150;\r\n  \r\n  /** Embedding model to use */\r\n  embedding_model = 'embeddinggemma:300m';\r\n  \r\n  /** Search type for retrieval */\r\n  search_type = 'hybrid';\r\n  \r\n  /** Vector storage type */\r\n  storage_type = 'pgvector';\r\n  \r\n  /** Selected AI model for inference */\r\n  selectedModel = 'gemma4:latest';\r\n  \r\n  /** Document type selections */\r\n  selectedGst = true;\r\n  selectedBureau = false;\r\n  selectedFinancial = false;\r\n  \r\n  /** Prompt templates for each document type */\r\n  gstPromptTemplate = '';\r\n  bureauPromptTemplate = '';\r\n  financialPromptTemplate = '';\r\n  \r\n  /** Selected data type for analysis */\r\n  selectedDataType: 'gst' | 'bureau' = 'gst';\r\n  \r\n  /** Uploaded JSON files */\r\n  uploadedGstJsonFile: File | null = null;\r\n  uploadedGstJsonFileName = '';\r\n  uploadedBureauJsonFile: File | null = null;\r\n  uploadedBureauJsonFileName = '';\r\n\r\n  // ============================================================================\r\n  // Computed Properties\r\n  // ============================================================================\r\n  \r\n  /** Get uploaded file based on selected data type */\r\n  get uploadedJsonFile(): File | null {\r\n    return this.selectedDataType === 'gst' ? this.uploadedGstJsonFile : this.uploadedBureauJsonFile;\r\n  }\r\n  \r\n  set uploadedJsonFile(file: File | null) {\r\n    if (this.selectedDataType === 'gst') {\r\n      this.uploadedGstJsonFile = file;\r\n    } else {\r\n      this.uploadedBureauJsonFile = file;\r\n    }\r\n  }\r\n  \r\n  get uploadedJsonFileName(): string {\r\n    return this.selectedDataType === 'gst' ? this.uploadedGstJsonFileName : this.uploadedBureauJsonFileName;\r\n  }\r\n  \r\n  set uploadedJsonFileName(name: string) {\r\n    if (this.selectedDataType === 'gst') {\r\n      this.uploadedGstJsonFileName = name;\r\n    } else {\r\n      this.uploadedBureauJsonFileName = name;\r\n    }\r\n  }\r\n\r\n  // ============================================================================\r\n  // API Endpoint Getters (Configurable)\r\n  // ============================================================================\r\n  \r\n  /** Get AI inference endpoint URL */\r\n  private get aiInferenceEndpoint(): string {\r\n    return `${this.config.apiBaseUrl}${this.config.endpoints?.aiInference ?? '/v1/generate-summary'}`;\r\n  }\r\n  \r\n  /** Get multi-model inference endpoint URL */\r\n  private get multiModelInferenceEndpoint(): string {\r\n    return `${this.config.apiBaseUrl}${this.config.endpoints?.multiModelInference ?? '/v1/generate-multiple-summary'}`;\r\n  }\r\n\r\n  // ============================================================================\r\n  // Constructor\r\n  // ============================================================================\r\n  \r\n  constructor() {\r\n    // Apply config defaults\r\n    this.selectedModel = this.config.defaultModel ?? 'gemma4:latest';\r\n    \r\n    if (this.config.ragSettings) {\r\n      this.top_k = this.config.ragSettings.top_k ?? 15;\r\n      this.chunk_size = this.config.ragSettings.chunk_size ?? 1000;\r\n      this.chunk_overlap = this.config.ragSettings.chunk_overlap ?? 150;\r\n      this.embedding_model = this.config.ragSettings.embedding_model ?? 'embeddinggemma:300m';\r\n      this.search_type = this.config.ragSettings.search_type ?? 'hybrid';\r\n      this.storage_type = this.config.ragSettings.storage_type ?? 'pgvector';\r\n    }\r\n  }\r\n\r\n  // ============================================================================\r\n  // Data Methods\r\n  // ============================================================================\r\n\r\n  /**\r\n   * Get loan summary details by proposal number\r\n   * @param proposalNo - The proposal number to fetch\r\n   * @returns Observable of LoanSummaryResponse\r\n   */\r\n  getLoanSummary(proposalNo: string): Observable<LoanSummaryResponse> {\r\n    // TODO: Implement actual API call when endpoint is available\r\n    // For now, returns mock data with simulated delay\r\n    const delayMs = Math.random() * 5000 + 3000;\r\n    return of(this.getMockLoanSummary()).pipe(delay(delayMs));\r\n  }\r\n\r\n  /**\r\n   * Get list of proposals for inbox\r\n   * @returns Observable of Proposal array\r\n   */\r\n  getProposals(): Observable<Proposal[]> {\r\n    // TODO: Implement actual API call when endpoint is available\r\n    return of(this.getMockProposals()).pipe(delay(500));\r\n  }\r\n\r\n  /**\r\n   * Get available summary services\r\n   * @returns Observable of SummaryService array\r\n   */\r\n  getAvailableServices(): Observable<SummaryService[]> {\r\n    return of([...this.getDefaultServices().map(s => ({ ...s }))]);\r\n  }\r\n\r\n  // ============================================================================\r\n  // AI Inference Methods\r\n  // ============================================================================\r\n\r\n  /**\r\n   * Call AI inference API with prompt and model\r\n   * @param prompt - The prompt to send\r\n   * @param modelName - The model to use\r\n   * @returns Observable of AIInferenceResponse\r\n   */\r\n  callAIInference(prompt: string, modelName: string): Observable<AIInferenceResponse> {\r\n    return new Observable(observer => {\r\n      const uploadedFile = this.selectedDataType === 'gst' \r\n        ? this.uploadedGstJsonFile \r\n        : this.uploadedBureauJsonFile;\r\n      \r\n      if (uploadedFile) {\r\n        this.processJsonFileAndSendRequest(uploadedFile, prompt, modelName, observer);\r\n      } else {\r\n        // No uploaded file available - return error\r\n        observer.error(new Error(`No ${this.selectedDataType.toUpperCase()} JSON file uploaded. Please upload a file first.`));\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Call multi-model inference API\r\n   * @param prompts - Prompts for each document type\r\n   * @param modelName - The model to use\r\n   * @param proposalNo - Optional proposal number\r\n   * @param documents - Optional documents array from proposal\r\n   * @returns Observable of MultiModelInferenceResponse\r\n   */\r\n  callMultiModelInference(\r\n    prompts: { gst?: string; bureau?: string; financial?: string },\r\n    modelName: string,\r\n    proposalNo?: string,\r\n    documents?: ProposalDocument[]\r\n  ): Observable<MultiModelInferenceResponse> {\r\n    const requestBody: Record<string, unknown> = {\r\n      prompts,\r\n      model_name: modelName,\r\n      isRag: this.isRag,\r\n      top_k: this.top_k,\r\n      chunk_size: this.chunk_size,\r\n      chunk_overlap: this.chunk_overlap,\r\n      embedding_model: this.embedding_model,\r\n      search_type: this.search_type,\r\n      storage_type: this.storage_type,\r\n      enable_reranking: true,\r\n      chunking_strategy: 'recursive_json',\r\n      documents: this.normalizeDocuments(documents)\r\n    };\r\n    \r\n    if (proposalNo) {\r\n      requestBody['proposalNo'] = proposalNo;\r\n    }\r\n\r\n    console.log('🚀 [API REQUEST] callMultiModelInference:', {\r\n      endpoint: this.multiModelInferenceEndpoint,\r\n      requestBody\r\n    });\r\n\r\n    return this.http.post<MultiModelInferenceResponse>(\r\n      this.multiModelInferenceEndpoint,\r\n      requestBody\r\n    ).pipe(\r\n      catchError(error => {\r\n        console.error('Multi-Model Inference Error:', error);\r\n        throw error;\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Call single document inference API\r\n   * @param prompt - The prompt to send\r\n   * @param documentType - Type of document\r\n   * @param modelName - The model to use\r\n   * @param proposalNo - Optional proposal number\r\n   * @param documents - Optional documents array from proposal\r\n   * @returns Observable of MultiModelInferenceResponse\r\n   */\r\n  callSingleModelInference(\r\n    prompt: string,\r\n    documentType: 'gst' | 'bureau' | 'financial',\r\n    modelName: string,\r\n    proposalNo?: string,\r\n    documents?: ProposalDocument[]\r\n  ): Observable<MultiModelInferenceResponse> {\r\n    const requestBody: Record<string, unknown> = {\r\n      prompt,\r\n      document_type: documentType,\r\n      model_name: modelName,\r\n      isRag: this.isRag,\r\n      top_k: this.top_k,\r\n      chunk_size: this.chunk_size,\r\n      chunk_overlap: this.chunk_overlap,\r\n      embedding_model: this.embedding_model,\r\n      search_type: this.search_type,\r\n      storage_type: this.storage_type,\r\n      enable_reranking: true,\r\n      chunking_strategy: 'recursive_json',\r\n      documents: this.normalizeDocuments(documents)\r\n    };\r\n    \r\n    if (proposalNo) {\r\n      requestBody['proposalNo'] = proposalNo;\r\n    }\r\n\r\n    console.log('🚀 [API REQUEST] callSingleModelInference:', {\r\n      endpoint: this.multiModelInferenceEndpoint,\r\n      requestBody\r\n    });\r\n\r\n    return this.http.post<MultiModelInferenceResponse>(\r\n      this.multiModelInferenceEndpoint,\r\n      requestBody\r\n    ).pipe(\r\n      catchError(error => {\r\n        console.error('Single Model Inference Error:', error);\r\n        throw error;\r\n      })\r\n    );\r\n  }\r\n\r\n  // ============================================================================\r\n  // Decision Logic\r\n  // ============================================================================\r\n\r\n  /**\r\n   * Calculate Go/No-Go decision based on loan summary\r\n   * @param summary - The loan summary details\r\n   * @returns GoNoGoDecision\r\n   */\r\n  calculateGoNoGoDecision(summary: LoanSummaryDetails): GoNoGoDecision {\r\n    const factors: DecisionFactor[] = [];\r\n    let totalScore = 0;\r\n    let maxScore = 0;\r\n\r\n    // Credit Score Check (weight: 25)\r\n    const creditScore = summary.creditSummary.creditBureauDetails.creditScore;\r\n    factors.push({\r\n      name: 'Credit Score',\r\n      status: creditScore >= 700 ? 'pass' : creditScore >= 600 ? 'warning' : 'fail',\r\n      value: creditScore.toString(),\r\n      weight: 25,\r\n    });\r\n    totalScore += creditScore >= 700 ? 25 : creditScore >= 600 ? 15 : 0;\r\n    maxScore += 25;\r\n\r\n    // DPD Check (weight: 20)\r\n    const dpd = summary.creditSummary.creditBureauDetails.dpd;\r\n    factors.push({\r\n      name: 'Days Past Due (DPD)',\r\n      status: dpd === 0 ? 'pass' : dpd <= 30 ? 'warning' : 'fail',\r\n      value: dpd.toString() + ' days',\r\n      weight: 20,\r\n    });\r\n    totalScore += dpd === 0 ? 20 : dpd <= 30 ? 10 : 0;\r\n    maxScore += 20;\r\n\r\n    // NPA Check (weight: 20)\r\n    const npa = summary.creditSummary.creditBureauDetails.npa;\r\n    factors.push({\r\n      name: 'NPA Status',\r\n      status: npa ? 'fail' : 'pass',\r\n      value: npa ? 'Yes' : 'No',\r\n      weight: 20,\r\n    });\r\n    totalScore += npa ? 0 : 20;\r\n    maxScore += 20;\r\n\r\n    // Fraud/Defaulter Check (weight: 15)\r\n    const hasIssues =\r\n      summary.creditSummary.creditBureauDetails.willfulDefaulterStatus ||\r\n      summary.creditSummary.creditBureauDetails.fraudReportedStatus ||\r\n      summary.creditSummary.creditBureauDetails.suitFiledStatus;\r\n    factors.push({\r\n      name: 'Fraud/Defaulter Status',\r\n      status: hasIssues ? 'fail' : 'pass',\r\n      value: hasIssues ? 'Issues Found' : 'Clear',\r\n      weight: 15,\r\n    });\r\n    totalScore += hasIssues ? 0 : 15;\r\n    maxScore += 15;\r\n\r\n    // EWS Check (weight: 10)\r\n    const ewsGrade = summary.ewsDashboard.earlyWarningSignals.ewsGrade;\r\n    factors.push({\r\n      name: 'Early Warning Signals',\r\n      status: ewsGrade === 'Green' ? 'pass' : ewsGrade === 'Yellow' ? 'warning' : 'fail',\r\n      value: ewsGrade,\r\n      weight: 10,\r\n    });\r\n    totalScore += ewsGrade === 'Green' ? 10 : ewsGrade === 'Yellow' ? 5 : 0;\r\n    maxScore += 10;\r\n\r\n    // GST Status Check (weight: 10)\r\n    const gstStatus = summary.gstSummary.gstStatus;\r\n    factors.push({\r\n      name: 'GST Status',\r\n      status: gstStatus === 'Active' ? 'pass' : 'warning',\r\n      value: gstStatus,\r\n      weight: 10,\r\n    });\r\n    totalScore += gstStatus === 'Active' ? 10 : 5;\r\n    maxScore += 10;\r\n\r\n    // Calculate final decision\r\n    const percentage = (totalScore / maxScore) * 100;\r\n    let decision: 'GO' | 'NO-GO' | 'REVIEW';\r\n    let remarks: string;\r\n\r\n    if (percentage >= 80) {\r\n      decision = 'GO';\r\n      remarks = 'All key parameters are within acceptable limits. Recommended for approval.';\r\n    } else if (percentage >= 60) {\r\n      decision = 'REVIEW';\r\n      remarks = 'Some parameters need attention. Manual review recommended before decision.';\r\n    } else {\r\n      decision = 'NO-GO';\r\n      remarks = 'Multiple parameters are outside acceptable limits. Not recommended for approval.';\r\n    }\r\n\r\n    return { decision, score: Math.round(percentage), factors, remarks };\r\n  }\r\n\r\n  // ============================================================================\r\n  // Utility Methods\r\n  // ============================================================================\r\n\r\n  /**\r\n   * Format currency in Indian format\r\n   * @param amount - The amount to format\r\n   * @returns Formatted currency string\r\n   */\r\n  formatCurrency(amount: number): string {\r\n    return new Intl.NumberFormat('en-IN', {\r\n      style: 'currency',\r\n      currency: 'INR',\r\n      maximumFractionDigits: 0,\r\n    }).format(amount);\r\n  }\r\n\r\n  /**\r\n   * Format number in Indian format\r\n   * @param num - The number to format\r\n   * @returns Formatted number string\r\n   */\r\n  formatNumber(num: number): string {\r\n    return new Intl.NumberFormat('en-IN').format(num);\r\n  }\r\n\r\n  /**\r\n   * Get random loading tip\r\n   * @returns A loading tip string\r\n   */\r\n  getLoadingTip(): string {\r\n    const tips = [\r\n      '💰 Total loans sanctioned this quarter: ₹500 Cr',\r\n      '📊 Cross-sell tip: Insurance products have 40% uptake with Term Loan customers',\r\n      '🚀 Trending: Account Aggregator APIs for instant bank statement verification',\r\n      '📋 Latest: RBI Master Circular on Priority Sector Lending',\r\n      '💡 Did you know? 85% of approved loans have credit scores above 700',\r\n      '🔒 Security tip: Always verify KYC documents against government databases',\r\n      '📈 Fintech insight: AI-based credit scoring reduces processing time by 60%',\r\n      '🏦 RBI Update: New guidelines on digital lending platforms',\r\n    ];\r\n    return tips[Math.floor(Math.random() * tips.length)];\r\n  }\r\n\r\n  /**\r\n   * Check if a bureau data value is available\r\n   * @param value - The value to check\r\n   * @returns Boolean indicating availability\r\n   */\r\n  isBureauValueAvailable(value: string | number): boolean {\r\n    return value !== '-' && value !== null && value !== undefined;\r\n  }\r\n\r\n  /**\r\n   * Get numeric value from bureau data\r\n   * @param value - The value to convert\r\n   * @returns Numeric value (0 if unavailable)\r\n   */\r\n  getBureauNumericValue(value: string | number): number {\r\n    return this.parseAmountToNumber(value);\r\n  }\r\n\r\n  /**\r\n   * Parses a value that may be a plain number OR a backend-formatted currency\r\n   * string (e.g. \"₹30.02 Lakh\", \"₹1.20 Cr\", \"-₹0.75 Lakh\") into a raw number.\r\n   * Returns 0 for missing/unavailable values ('-', null, undefined, unparsable).\r\n   */\r\n  parseAmountToNumber(value: string | number | null | undefined): number {\r\n    if (value === null || value === undefined || value === '-' || value === '') {\r\n      return 0;\r\n    }\r\n    if (typeof value === 'number') {\r\n      return value;\r\n    }\r\n\r\n    const str = value.trim();\r\n    const numMatch = str.replace(/,/g, '').match(/-?\\d+(\\.\\d+)?/);\r\n    if (!numMatch) {\r\n      return 0;\r\n    }\r\n    const num = parseFloat(numMatch[0]);\r\n    if (isNaN(num)) {\r\n      return 0;\r\n    }\r\n\r\n    const lower = str.toLowerCase();\r\n    if (lower.includes('cr')) {\r\n      return num * 10000000;\r\n    }\r\n    if (lower.includes('lakh') || lower.includes('lac')) {\r\n      return num * 100000;\r\n    }\r\n    if (lower.includes('thousand') || /\\bk\\b/.test(lower)) {\r\n      return num * 1000;\r\n    }\r\n    return num;\r\n  }\r\n\r\n  /**\r\n   * Get string value from bureau data\r\n   * @param value - The value to convert\r\n   * @returns String value ('N/A' if unavailable)\r\n   */\r\n  getBureauStringValue(value: string | number): string {\r\n    if (value === '-' || value === null || value === undefined) {\r\n      return 'N/A';\r\n    }\r\n    return String(value);\r\n  }\r\n\r\n  // ============================================================================\r\n  // Private Helper Methods\r\n  // ============================================================================\r\n\r\n  private processJsonFileAndSendRequest(\r\n    file: File, \r\n    prompt: string, \r\n    modelName: string, \r\n    observer: { next: (value: AIInferenceResponse) => void; error: (error: unknown) => void; complete: () => void }\r\n  ): void {\r\n    const reader = new FileReader();\r\n    reader.onload = () => {\r\n      try {\r\n        const jsonContent = reader.result as string;\r\n        JSON.parse(jsonContent); // Validate JSON\r\n        const jsonBlob = new Blob([jsonContent], { type: 'application/json' });\r\n        this.sendApiRequest(jsonBlob, file.name, prompt, modelName, observer);\r\n      } catch {\r\n        observer.error(new Error('Invalid JSON file'));\r\n      }\r\n    };\r\n    reader.onerror = () => observer.error(new Error('Failed to read file'));\r\n    reader.readAsText(file);\r\n  }\r\n\r\n  private sendApiRequest(\r\n    jsonBlob: Blob, \r\n    fileName: string, \r\n    prompt: string, \r\n    modelName: string, \r\n    observer: { next: (value: AIInferenceResponse) => void; error: (error: unknown) => void; complete: () => void }\r\n  ): void {\r\n    const formData = new FormData();\r\n    formData.append('json_file', jsonBlob, fileName);\r\n    formData.append('prompt', prompt);\r\n    formData.append('model_name', modelName);\r\n    formData.append('isRag', this.isRag.toString());\r\n    formData.append('top_k', this.top_k.toString());\r\n    formData.append('chunk_size', this.chunk_size.toString());\r\n    formData.append('chunk_overlap', this.chunk_overlap.toString());\r\n    formData.append('embedding_model', this.embedding_model);\r\n    formData.append('search_type', this.search_type);\r\n    formData.append('storage_type', this.storage_type);\r\n    formData.append('enable_reranking', 'true');\r\n    formData.append('proposal_no', '1234567894');\r\n\r\n    this.http.post<AIInferenceResponse>(this.aiInferenceEndpoint, formData).subscribe({\r\n      next: (response) => {\r\n        observer.next(response);\r\n        observer.complete();\r\n      },\r\n      error: (error) => observer.error(error)\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Normalize document names for API consistency\r\n   * Maps: 'fin'/'financial' → 'financial', 'cibil'/'bureau' → 'cibil', 'gst' → 'gst'\r\n   * Supports partial matches (e.g., 'CIBIL Commercial Report' → 'cibil')\r\n   * @param documents - The documents array from proposal\r\n   * @returns Normalized documents array\r\n   */\r\n  private normalizeDocuments(documents?: ProposalDocument[]): Array<{ documentId: string; documentName: string; documentType: string }> {\r\n    if (!documents || documents.length === 0) {\r\n      return [];\r\n    }\r\n    \r\n    return documents.map(doc => {\r\n      const originalName = doc.documentName?.toLowerCase() || '';\r\n      let normalizedName = originalName;\r\n      \r\n      // Normalize document names using partial matching\r\n      if (originalName.includes('fin') || originalName.includes('financial')) {\r\n        normalizedName = 'financial';\r\n      } else if (originalName.includes('cibil') || originalName.includes('bureau')) {\r\n        normalizedName = 'cibil';\r\n      } else if (originalName.includes('gst')) {\r\n        normalizedName = 'gst';\r\n      }\r\n      \r\n      return {\r\n        documentId: doc.documentId,\r\n        documentName: normalizedName,\r\n        documentType: doc.documentType\r\n      };\r\n    });\r\n  }\r\n\r\n  // ============================================================================\r\n  // Mock Data (for development/testing)\r\n  // ============================================================================\r\n\r\n  private getMockLoanSummary(): LoanSummaryResponse {\r\n    return {\r\n      loanSummaryDetails: {\r\n        borrowerInformation: {\r\n          name: 'ABC Enterprises Pvt Ltd',\r\n          cin: 'U12345MH2020PTC123456',\r\n          doi: '2020-05-15',\r\n          din: '12345678',\r\n          address: '123, Business Park, Mumbai, Maharashtra - 400001',\r\n          pan: 'ABCDE1234F',\r\n          gst: '27ABCDE1234F1Z5',\r\n        },\r\n        companyDirectorInformation: [\r\n          {\r\n            name: 'Rajesh Kumar',\r\n            din: '12345678',\r\n            pan: 'ABCPK1234A',\r\n            panStatus: 'Active',\r\n            address: '456, Residential Complex, Mumbai - 400002',\r\n            phoneNumber: '+91-9876543210',\r\n            emailId: 'rajesh.kumar@example.com',\r\n            role: 'Managing Director & CEO',\r\n            experience: 18,\r\n            otherDirectorships: 2,\r\n            qualification: 'MBA, Chartered Accountant',\r\n            shareholding: 45,\r\n            appointedDate: '2020-05-15',\r\n          },\r\n        ],\r\n        loanFacilityInformation: [\r\n          {\r\n            facility: 'Term Loan',\r\n            natureOfLimit: 'Secured',\r\n            amountRequested: 5000000,\r\n            tenure: '60 months',\r\n          },\r\n        ],\r\n        creditSummary: {\r\n          creditBureauDetails: {\r\n            creditScore: 750,\r\n            scoreDate: '2026-03-15',\r\n            dpd: 0,\r\n            sma: 'SMA-0',\r\n            npa: false,\r\n            willfulDefaulterStatus: false,\r\n            suitFiledStatus: false,\r\n            recoverySuitFiledStatus: false,\r\n            fraudReportedStatus: false,\r\n            outstandingLoanAmount: 1500000,\r\n            totalLoanAmount: 3000000,\r\n            totalEmiAmount: 45000,\r\n            totalOverdueAmount: 0,\r\n            totalNoOfLoans: 8,\r\n            totalNoOfActiveLoans: 5,\r\n            totalNoOfClosedLoans: 3,\r\n            creditUtilization: 45,\r\n            paymentHistory: { onTimePayments: 92, delayedPayments: 6, defaulted: 2 },\r\n            creditEnquiries: { last30Days: 2, last90Days: 5, last6Months: 8 },\r\n            // No dedicated backend endpoint returns per-loan details yet -\r\n            // use the library's richer mock dataset so the chart has something to draw.\r\n            loanDetails: MOCK_CREDIT_BUREAU_DETAILS.loanDetails,\r\n          },\r\n          commercialCreditAssessmentDetails: {\r\n            creditAssessmentScore: 82,\r\n            creditAssessmentGrade: 'A',\r\n            creditAssessmentRemarks: 'Good credit history with consistent repayments',\r\n          },\r\n          crifScoreDetails: {\r\n            crifScore: 720,\r\n            crifGrade: 'B+',\r\n            crifRemarks: 'Satisfactory credit profile',\r\n          },\r\n        },\r\n        gstSummary: {\r\n          gstNumber: '27ABCDE1234F1Z5',\r\n          gstRegistrationDate: '2020-06-01',\r\n          gstStatus: 'Active',\r\n          gstReturnFilingStatus: 'Filed',\r\n          gstReturnFilingFrequency: 'Monthly',\r\n          totalSales: 25000000,\r\n          totalPurchases: 18000000,\r\n          totalTaxPaid: 1800000,\r\n          totalTaxCollected: 2250000,\r\n          yoySalesGrowth: 15.5,\r\n          yoyPurchaseGrowth: 12.3,\r\n          momSalesGrowth: 2.8,\r\n          momPurchaseGrowth: 1.9,\r\n          filingCompliance: 95,\r\n          avgMonthlyTurnover: 9580000,\r\n          lastFilingDate: '2026-02-20',\r\n          lastFilingStatus: 'On Time',\r\n          // No dedicated backend endpoint returns these trend/history arrays yet -\r\n          // use the library's richer mock dataset so charts have something to draw.\r\n          turnoverTrend: MOCK_GST_SUMMARY.turnoverTrend,\r\n          monthlyReturns: MOCK_GST_SUMMARY.monthlyReturns,\r\n          filingHistory: MOCK_GST_SUMMARY.filingHistory,\r\n        },\r\n        balanceSheetSummary: {\r\n          totalAssets: 50000000,\r\n          totalLiabilities: 30000000,\r\n          netWorth: 20000000,\r\n          currentRatio: 1.8,\r\n          debtEquityRatio: 1.5,\r\n          totalRevenue: 42000000,\r\n          grossProfit: 12600000,\r\n          netProfit: 4200000,\r\n          operatingProfit: 6300000,\r\n          workingCapital: 9500000,\r\n          interestCoverageRatio: 3.2,\r\n          returnOnEquity: 0.21,\r\n          returnOnAssets: 0.084,\r\n        },\r\n        riskAssessmentRating: {\r\n          icraRiskAssessmentDetails: { riskScore: 78, riskGrade: 'BBB+', riskRemarks: 'Moderate risk with stable outlook' },\r\n          crisilScore: 'A-',\r\n          riskAssessmentDetails: { riskScore: 75, riskGrade: 'Medium', riskRemarks: 'Acceptable risk level for lending' },\r\n          crankCheckerDetails: { crankScore: 680, crankGrade: 'B', crankRemarks: 'Within acceptable range' },\r\n        },\r\n        corpositoryDetails: { corpositoryScore: 72, corpositoryGrade: 'B+', corpositoryRemarks: 'Company compliance is satisfactory' },\r\n        ewsDashboard: { earlyWarningSignals: { ewsScore: 85, ewsGrade: 'Green', ewsRemarks: 'No early warning signals detected' } },\r\n        riskRatingAnalysis: {\r\n          overallRisk: 'Medium Risk',\r\n          riskScore: 68,\r\n          pd: 32,\r\n          recommendation: 'Proceed with caution. Recommend enhanced monitoring.',\r\n          riskFactors: [],\r\n          financialMetrics: [],\r\n        },\r\n      },\r\n    };\r\n  }\r\n\r\n  private getMockProposals(): Proposal[] {\r\n    return [\r\n      {\r\n        proposalNo: 'APP-2026-001',\r\n        borrowerName: 'ABC Enterprises Pvt Ltd',\r\n        loanType: 'Term Loan',\r\n        amountRequested: 5000000,\r\n        status: 'Under Review',\r\n        submissionDate: '2026-03-15',\r\n        assignedTo: 'John Doe',\r\n        documents: [],\r\n      },\r\n      {\r\n        proposalNo: 'APP-2026-002',\r\n        borrowerName: 'XYZ Industries Ltd',\r\n        loanType: 'Working Capital',\r\n        amountRequested: 2500000,\r\n        status: 'Pending',\r\n        submissionDate: '2026-03-18',\r\n        assignedTo: 'Jane Smith',\r\n        documents: [],\r\n      },\r\n    ];\r\n  }\r\n\r\n  private getDefaultServices(): SummaryService[] {\r\n    return [\r\n      { id: 'borrower-info', name: 'Borrower Information', description: 'Company details, CIN, PAN, GST information', icon: 'business', category: 'essential', selected: true },\r\n      { id: 'risk-rating', name: 'Risk Rating & Analysis', description: 'Overall risk score, PD, risk factors and financial metrics', icon: 'analytics', category: 'essential', selected: true },\r\n      { id: 'director-info', name: 'Director Information', description: 'List of company directors with DIN and contact details', icon: 'groups', category: 'essential', selected: true },\r\n      { id: 'loan-facility', name: 'Loan Facility', description: 'Facility types, limits, and tenure details', icon: 'payments', category: 'essential', selected: true },\r\n      { id: 'credit-bureau', name: 'Credit Bureau Details', description: 'Credit score, DPD, SMA, NPA status and loan history', icon: 'credit_score', category: 'essential', selected: true },\r\n      { id: 'credit-assessment', name: 'Credit Assessment', description: 'Commercial credit assessment score and CRIF details', icon: 'assessment', category: 'essential', selected: true },\r\n      { id: 'gst-summary', name: 'GST Summary', description: 'GST registration, filing status, sales and growth metrics', icon: 'receipt_long', category: 'essential', selected: true },\r\n      { id: 'balance-sheet', name: 'Balance Sheet Summary', description: 'Assets, liabilities, net worth and financial ratios', icon: 'account_balance', category: 'additional', selected: false },\r\n      { id: 'risk-assessment', name: 'Risk Assessment Rating', description: 'ICRA, CRISIL, CRANK risk scores and grades', icon: 'warning', category: 'additional', selected: false },\r\n      { id: 'corpository', name: 'Corpository Details', description: 'Company compliance and corpository score', icon: 'verified', category: 'additional', selected: false },\r\n      { id: 'ews-dashboard', name: 'EWS Dashboard', description: 'Early warning signals and risk indicators', icon: 'notifications_active', category: 'additional', selected: false },\r\n    ];\r\n  }\r\n}\r\n","/**\r\n * UC-UI Library - Auth Service\r\n * \r\n * Service for authentication operations.\r\n * API endpoints are configurable through UcUiConfig.\r\n */\r\n\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\n\r\nimport { UC_UI_CONFIG } from '../config/uc-ui-config.token';\r\nimport { LoginRequest, LoginResponse } from '../models/api-response.model';\r\n\r\n/**\r\n * Service for authentication operations.\r\n * \r\n * @example\r\n * ```typescript\r\n * export class LoginComponent {\r\n *   private authService = inject(AuthService);\r\n *   \r\n *   login(username: string, password: string) {\r\n *     this.authService.login({ username, password }).subscribe(response => {\r\n *       console.log('Logged in:', response);\r\n *     });\r\n *   }\r\n * }\r\n * ```\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class AuthService {\r\n  private readonly http = inject(HttpClient);\r\n  private readonly config = inject(UC_UI_CONFIG);\r\n\r\n  /**\r\n   * Get the auth API URL\r\n   */\r\n  private get authApiUrl(): string {\r\n    const baseUrl = this.config.auth?.authApiUrl ?? this.config.apiBaseUrl;\r\n    return baseUrl;\r\n  }\r\n\r\n  /**\r\n   * Get the login endpoint\r\n   */\r\n  private get loginEndpoint(): string {\r\n    return `${this.authApiUrl}${this.config.auth?.loginEndpoint ?? '/auth/login'}`;\r\n  }\r\n\r\n  /**\r\n   * Login with username and password\r\n   * @param request - Login credentials\r\n   * @returns Observable of LoginResponse\r\n   */\r\n  login(request: LoginRequest): Observable<LoginResponse> {\r\n    return this.http.post<LoginResponse>(this.loginEndpoint, request);\r\n  }\r\n}\r\n","/**\r\n * UC-UI Library - Profiling Service\r\n * \r\n * Service for managing profiling logs and statistics.\r\n * API endpoints are configurable through UcUiConfig.\r\n */\r\n\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\n\r\nimport { UC_UI_CONFIG } from '../config/uc-ui-config.token';\r\nimport {\r\n  ProfilingListResponse,\r\n  ProfilingDetailResponse,\r\n  ProfilingStatsResponse,\r\n  ProfilingFilters\r\n} from '../models/api-response.model';\r\n\r\n/**\r\n * Service for managing profiling logs and statistics.\r\n * \r\n * @example\r\n * ```typescript\r\n * export class ProfilingComponent {\r\n *   private profilingService = inject(ProfilingService);\r\n *   \r\n *   ngOnInit() {\r\n *     this.profilingService.getProfilings().subscribe(response => {\r\n *       console.log('Profiling data:', response);\r\n *     });\r\n *   }\r\n * }\r\n * ```\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class ProfilingService {\r\n  private readonly http = inject(HttpClient);\r\n  private readonly config = inject(UC_UI_CONFIG);\r\n\r\n  /**\r\n   * Get the profiling API URL\r\n   */\r\n  private get profilingApiUrl(): string {\r\n    return `${this.config.apiBaseUrl}${this.config.endpoints?.profiling ?? '/v1/profiling'}`;\r\n  }\r\n\r\n  /**\r\n   * Get all profiling records with optional filters\r\n   * @param filters - Optional filters\r\n   * @param limit - Number of records to return (default: 100)\r\n   * @param offset - Offset for pagination (default: 0)\r\n   * @returns Observable of ProfilingListResponse\r\n   */\r\n  getProfilings(\r\n    filters?: ProfilingFilters,\r\n    limit = 100,\r\n    offset = 0\r\n  ): Observable<ProfilingListResponse> {\r\n    let params = new HttpParams()\r\n      .set('limit', limit.toString())\r\n      .set('offset', offset.toString());\r\n\r\n    if (filters?.status) {\r\n      params = params.set('status_filter', filters.status);\r\n    }\r\n    if (filters?.startDate) {\r\n      params = params.set('start_date', filters.startDate);\r\n    }\r\n    if (filters?.endDate) {\r\n      params = params.set('end_date', filters.endDate);\r\n    }\r\n    if (filters?.requestId) {\r\n      params = params.set('request_id', filters.requestId);\r\n    }\r\n    if (filters?.documentType) {\r\n      params = params.set('document_type', filters.documentType);\r\n    }\r\n    if (filters?.sortByDuration) {\r\n      params = params.set('sort_by_duration', filters.sortByDuration);\r\n    }\r\n    if (filters?.timePeriod) {\r\n      params = params.set('time_period', filters.timePeriod);\r\n    }\r\n\r\n    return this.http.get<ProfilingListResponse>(this.profilingApiUrl, { params });\r\n  }\r\n\r\n  /**\r\n   * Get profiling detail by ID\r\n   * @param id - Profiling record ID\r\n   * @returns Observable of ProfilingDetailResponse\r\n   */\r\n  getProfilingById(id: number): Observable<ProfilingDetailResponse> {\r\n    return this.http.get<ProfilingDetailResponse>(`${this.profilingApiUrl}/${id}`);\r\n  }\r\n\r\n  /**\r\n   * Get profiling detail by request ID\r\n   * @param requestId - Request ID\r\n   * @returns Observable of ProfilingDetailResponse\r\n   */\r\n  getProfilingByRequestId(requestId: string): Observable<ProfilingDetailResponse> {\r\n    return this.http.get<ProfilingDetailResponse>(`${this.profilingApiUrl}/request/${requestId}`);\r\n  }\r\n\r\n  /**\r\n   * Get profiling statistics\r\n   * @returns Observable of ProfilingStatsResponse\r\n   */\r\n  getStats(): Observable<ProfilingStatsResponse> {\r\n    return this.http.get<ProfilingStatsResponse>(`${this.profilingApiUrl}/stats`);\r\n  }\r\n\r\n  /**\r\n   * Format duration in human-readable format\r\n   * @param ms - Duration in milliseconds\r\n   * @returns Formatted duration string\r\n   */\r\n  formatDuration(ms: number): string {\r\n    if (ms < 1000) {\r\n      return `${ms}ms`;\r\n    } else if (ms < 60000) {\r\n      return `${(ms / 1000).toFixed(2)}s`;\r\n    } else {\r\n      const minutes = Math.floor(ms / 60000);\r\n      const seconds = ((ms % 60000) / 1000).toFixed(1);\r\n      return `${minutes}m ${seconds}s`;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Format date for display\r\n   * @param dateStr - Date string\r\n   * @returns Formatted date string\r\n   */\r\n  formatDate(dateStr: string | null): string {\r\n    if (!dateStr) return '-';\r\n    const date = new Date(dateStr);\r\n    return date.toLocaleString('en-IN', {\r\n      year: 'numeric',\r\n      month: 'short',\r\n      day: 'numeric',\r\n      hour: '2-digit',\r\n      minute: '2-digit',\r\n    });\r\n  }\r\n}\r\n","/**\r\n * UC-UI Library - Workflow Orchestration Service\r\n * \r\n * Service for managing component state transitions and workflow communication.\r\n * This service acts as a central coordinator for multi-step workflows.\r\n */\r\n\r\nimport { Injectable, signal, computed } from '@angular/core';\r\nimport { Subject, Observable } from 'rxjs';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Workflow step states\r\n */\r\nexport type WorkflowStep = \r\n  | 'idle'\r\n  | 'selection'\r\n  | 'loading'\r\n  | 'processing'\r\n  | 'summary'\r\n  | 'review'\r\n  | 'complete'\r\n  | 'error';\r\n\r\n/**\r\n * Component state\r\n */\r\nexport interface ComponentState {\r\n  /** Component identifier */\r\n  id: string;\r\n  /** Current state */\r\n  state: 'idle' | 'loading' | 'ready' | 'error' | 'disabled';\r\n  /** Optional error message */\r\n  error?: string;\r\n  /** Optional data payload */\r\n  data?: unknown;\r\n  /** Last updated timestamp */\r\n  updatedAt: Date;\r\n}\r\n\r\n/**\r\n * Component state change event\r\n */\r\nexport interface ComponentStateChange {\r\n  /** Component identifier */\r\n  componentId: string;\r\n  /** Previous state */\r\n  previousState: ComponentState | undefined;\r\n  /** Current state */\r\n  currentState: ComponentState;\r\n}\r\n\r\n/**\r\n * Workflow context data\r\n */\r\nexport interface WorkflowContext {\r\n  /** Current proposal number */\r\n  proposalNo?: string;\r\n  /** Selected services for summary */\r\n  selectedServices?: string[];\r\n  /** AI model being used */\r\n  selectedModel?: string;\r\n  /** Summary type */\r\n  summaryType?: 'quick' | 'detailed';\r\n  /** Any additional context data */\r\n  metadata?: Record<string, unknown>;\r\n}\r\n\r\n// ============================================================================\r\n// Service\r\n// ============================================================================\r\n\r\n/**\r\n * Service for orchestrating workflow state and component communication.\r\n * \r\n * @example\r\n * ```typescript\r\n * export class MyComponent {\r\n *   private workflow = inject(WorkflowOrchestrationService);\r\n *   \r\n *   ngOnInit() {\r\n *     // Register component\r\n *     this.workflow.registerComponent('my-component', { \r\n *       id: 'my-component', \r\n *       state: 'idle', \r\n *       updatedAt: new Date() \r\n *     });\r\n *     \r\n *     // Listen to step changes\r\n *     this.workflow.stepChanged$.subscribe(step => {\r\n *       console.log('Workflow step:', step);\r\n *     });\r\n *   }\r\n *   \r\n *   onAction() {\r\n *     this.workflow.transitionTo('processing');\r\n *   }\r\n * }\r\n * ```\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class WorkflowOrchestrationService {\r\n  // ============================================================================\r\n  // State\r\n  // ============================================================================\r\n  \r\n  /** Current workflow step */\r\n  private readonly _currentStep = signal<WorkflowStep>('idle');\r\n  \r\n  /** Previous workflow step */\r\n  private readonly _previousStep = signal<WorkflowStep>('idle');\r\n  \r\n  /** Component states map */\r\n  private readonly _componentStates = signal<Map<string, ComponentState>>(new Map());\r\n  \r\n  /** Workflow context */\r\n  private readonly _context = signal<WorkflowContext>({});\r\n  \r\n  /** Step change subject */\r\n  private readonly _stepChangedSubject = new Subject<WorkflowStep>();\r\n  \r\n  /** Component state change subject */\r\n  private readonly _componentStateChangedSubject = new Subject<ComponentStateChange>();\r\n\r\n  // ============================================================================\r\n  // Public Observables\r\n  // ============================================================================\r\n  \r\n  /** Observable for step changes */\r\n  readonly stepChanged$: Observable<WorkflowStep> = this._stepChangedSubject.asObservable();\r\n  \r\n  /** Observable for component state changes */\r\n  readonly componentStateChanged$: Observable<ComponentStateChange> = this._componentStateChangedSubject.asObservable();\r\n\r\n  // ============================================================================\r\n  // Computed Properties\r\n  // ============================================================================\r\n  \r\n  /** Current workflow step (readonly) */\r\n  readonly currentStep = computed(() => this._currentStep());\r\n  \r\n  /** Previous workflow step (readonly) */\r\n  readonly previousStep = computed(() => this._previousStep());\r\n  \r\n  /** Current workflow context (readonly) */\r\n  readonly context = computed(() => this._context());\r\n  \r\n  /** Whether workflow is in a loading state */\r\n  readonly isLoading = computed(() => {\r\n    const step = this._currentStep();\r\n    return step === 'loading' || step === 'processing';\r\n  });\r\n  \r\n  /** Whether workflow is in an error state */\r\n  readonly isError = computed(() => this._currentStep() === 'error');\r\n  \r\n  /** Whether workflow is complete */\r\n  readonly isComplete = computed(() => this._currentStep() === 'complete');\r\n\r\n  // ============================================================================\r\n  // Workflow Step Methods\r\n  // ============================================================================\r\n  \r\n  /**\r\n   * Transition to a new workflow step\r\n   * @param step - The step to transition to\r\n   */\r\n  transitionTo(step: WorkflowStep): void {\r\n    const previous = this._currentStep();\r\n    if (previous !== step) {\r\n      this._previousStep.set(previous);\r\n      this._currentStep.set(step);\r\n      this._stepChangedSubject.next(step);\r\n    }\r\n  }\r\n  \r\n  /**\r\n   * Go back to the previous step\r\n   */\r\n  goBack(): void {\r\n    const previous = this._previousStep();\r\n    this.transitionTo(previous);\r\n  }\r\n  \r\n  /**\r\n   * Reset workflow to initial state\r\n   */\r\n  reset(): void {\r\n    this._previousStep.set('idle');\r\n    this._currentStep.set('idle');\r\n    this._context.set({});\r\n    this._componentStates.set(new Map());\r\n    this._stepChangedSubject.next('idle');\r\n  }\r\n\r\n  // ============================================================================\r\n  // Component State Methods\r\n  // ============================================================================\r\n  \r\n  /**\r\n   * Register a component with the workflow\r\n   * @param id - Component identifier\r\n   * @param initialState - Initial component state\r\n   */\r\n  registerComponent(id: string, initialState: Omit<ComponentState, 'id' | 'updatedAt'>): void {\r\n    const state: ComponentState = {\r\n      ...initialState,\r\n      id,\r\n      updatedAt: new Date()\r\n    };\r\n    const states = new Map(this._componentStates());\r\n    states.set(id, state);\r\n    this._componentStates.set(states);\r\n  }\r\n  \r\n  /**\r\n   * Unregister a component from the workflow\r\n   * @param id - Component identifier\r\n   */\r\n  unregisterComponent(id: string): void {\r\n    const states = new Map(this._componentStates());\r\n    states.delete(id);\r\n    this._componentStates.set(states);\r\n  }\r\n  \r\n  /**\r\n   * Update a component's state\r\n   * @param id - Component identifier\r\n   * @param update - Partial state update\r\n   */\r\n  updateComponentState(id: string, update: Partial<Omit<ComponentState, 'id' | 'updatedAt'>>): void {\r\n    const states = new Map(this._componentStates());\r\n    const currentState = states.get(id);\r\n    \r\n    const newState: ComponentState = {\r\n      id,\r\n      state: update.state ?? currentState?.state ?? 'idle',\r\n      error: update.error,\r\n      data: update.data ?? currentState?.data,\r\n      updatedAt: new Date()\r\n    };\r\n    \r\n    states.set(id, newState);\r\n    this._componentStates.set(states);\r\n    \r\n    this._componentStateChangedSubject.next({\r\n      componentId: id,\r\n      previousState: currentState,\r\n      currentState: newState\r\n    });\r\n  }\r\n  \r\n  /**\r\n   * Get a component's current state\r\n   * @param id - Component identifier\r\n   * @returns ComponentState or undefined\r\n   */\r\n  getComponentState(id: string): ComponentState | undefined {\r\n    return this._componentStates().get(id);\r\n  }\r\n  \r\n  /**\r\n   * Get all component states\r\n   * @returns Map of component states\r\n   */\r\n  getAllComponentStates(): Map<string, ComponentState> {\r\n    return new Map(this._componentStates());\r\n  }\r\n  \r\n  /**\r\n   * Check if all specified components are in a certain state\r\n   * @param componentIds - List of component IDs\r\n   * @param state - State to check\r\n   * @returns Boolean\r\n   */\r\n  areComponentsInState(componentIds: string[], state: ComponentState['state']): boolean {\r\n    const states = this._componentStates();\r\n    return componentIds.every(id => states.get(id)?.state === state);\r\n  }\r\n\r\n  // ============================================================================\r\n  // Context Methods\r\n  // ============================================================================\r\n  \r\n  /**\r\n   * Update workflow context\r\n   * @param update - Partial context update\r\n   */\r\n  updateContext(update: Partial<WorkflowContext>): void {\r\n    const current = this._context();\r\n    this._context.set({\r\n      ...current,\r\n      ...update,\r\n      metadata: {\r\n        ...current.metadata,\r\n        ...update.metadata\r\n      }\r\n    });\r\n  }\r\n  \r\n  /**\r\n   * Set the proposal number in context\r\n   * @param proposalNo - Proposal number\r\n   */\r\n  setProposalNo(proposalNo: string): void {\r\n    this.updateContext({ proposalNo });\r\n  }\r\n  \r\n  /**\r\n   * Set selected services in context\r\n   * @param services - List of service IDs\r\n   */\r\n  setSelectedServices(services: string[]): void {\r\n    this.updateContext({ selectedServices: services });\r\n  }\r\n  \r\n  /**\r\n   * Set the selected AI model in context\r\n   * @param model - Model name\r\n   */\r\n  setSelectedModel(model: string): void {\r\n    this.updateContext({ selectedModel: model });\r\n  }\r\n  \r\n  /**\r\n   * Clear workflow context\r\n   */\r\n  clearContext(): void {\r\n    this._context.set({});\r\n  }\r\n}\r\n","// Services exports\r\nexport * from './loan-summary.service';\r\nexport * from './auth.service';\r\nexport * from './profiling.service';\r\nexport * from './workflow-orchestration.service';\r\n","import { BalanceSheetSummary } from '../models/loan-summary.model';\n\n/**\n * Fallback Balance Sheet demo data, used only when no real backend response\n * (financialQuickSummary) is available for a given proposal.\n */\nexport const MOCK_BALANCE_SHEET_SUMMARY: BalanceSheetSummary = {\n  totalAssets: 9623116,\n  totalLiabilities: 6891861,\n  netWorth: 2731255,\n  currentRatio: 1.0955602203006813,\n  debtEquityRatio: 2.5233312158696277,\n  totalRevenue: 8270571,\n  grossProfit: 2481171,\n  netProfit: 56085,\n  operatingProfit: 992469,\n  workingCapital: 1850000,\n  interestCoverageRatio: 0.9785276260297509,\n  returnOnEquity: 0.14487294411281355,\n  returnOnAssets: 0.005829142857142857,\n};\n","/**\n * UC-UI Library - Mock/Demo Data\n *\n * Fallback datasets used by section components when no real backend\n * response is available for a given proposal.\n * @module uc-ui/mock-data\n */\n\nexport { MOCK_GST_SUMMARY } from './gst-mock-data';\nexport { MOCK_BALANCE_SHEET_SUMMARY } from './balance-sheet-mock-data';\nexport { MOCK_CREDIT_BUREAU_DETAILS } from './credit-bureau-mock-data';\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatRippleModule } from '@angular/material/core';\r\n\r\nimport { SummaryService } from '../../../../models/loan-summary.model';\r\n\r\n@Component({\r\n  selector: 'uc-service-card',\r\n  standalone: true,\r\n  imports: [CommonModule, MatCardModule, MatIconModule, MatRippleModule],\r\n  templateUrl: './service-card.component.html',\r\n  styleUrl: './service-card.component.scss',\r\n})\r\nexport class ServiceCardComponent {\r\n  @Input() service!: SummaryService;\r\n  @Output() toggleSelection = new EventEmitter<SummaryService>();\r\n\r\n  onCardClick(): void {\r\n    this.toggleSelection.emit(this.service);\r\n  }\r\n\r\n  getCategoryLabel(): string {\r\n    return this.service.category === 'essential' ? 'Essential' : 'Additional';\r\n  }\r\n}\r\n","<div\r\n  class=\"service-card\"\r\n  [class.selected]=\"service.selected\"\r\n  [class.essential]=\"service.category === 'essential'\"\r\n  matRipple\r\n  (click)=\"onCardClick()\"\r\n>\r\n  <div class=\"card-content\">\r\n    <div class=\"leading-icon\">\r\n      <mat-icon>{{ service.icon }}</mat-icon>\r\n    </div>\r\n    \r\n    <div class=\"card-info\">\r\n      <div class=\"card-header\">\r\n        <h4 class=\"card-title\">{{ service.name }}</h4>\r\n        <span class=\"category-badge\" [class.essential-badge]=\"service.category === 'essential'\">\r\n          {{ getCategoryLabel() }}\r\n        </span>\r\n      </div>\r\n      <p class=\"card-description\">{{ service.description }}</p>\r\n    </div>\r\n    \r\n    <div class=\"trailing-icon\">\r\n      <mat-icon class=\"selection-icon\">\r\n        {{ service.selected ? 'check_circle' : 'add_circle_outline' }}\r\n      </mat-icon>\r\n    </div>\r\n  </div>\r\n</div>\r\n","/**\r\n * UC-UI Library - Summary Loading Component\r\n * \r\n * A loading indicator component with animated spinner, rotating messages, and tips.\r\n * Used during AI summary generation.\r\n * \r\n * @example\r\n * ```html\r\n * <uc-summary-loading></uc-summary-loading>\r\n * ```\r\n */\r\n\r\nimport { Component, OnInit, OnDestroy, Input, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { trigger, transition, style, animate } from '@angular/animations';\r\n\r\nimport { LoanSummaryService } from '../../../services/loan-summary.service';\r\n\r\n@Component({\r\n  selector: 'uc-summary-loading',\r\n  standalone: true,\r\n  imports: [CommonModule, MatProgressSpinnerModule, MatIconModule],\r\n  template: `\r\n    <div class=\"loading-container\">\r\n      <!-- Animation Section -->\r\n      <div class=\"animation-section\">\r\n        <div class=\"spinner-wrapper\">\r\n          <mat-spinner [diameter]=\"spinnerSize\" color=\"primary\"></mat-spinner>\r\n          <div class=\"pulse-ring\"></div>\r\n        </div>\r\n        \r\n        <div class=\"animation-icons\">\r\n          <mat-icon [class.active]=\"animationPhase === 0\">hourglass_top</mat-icon>\r\n          <mat-icon [class.active]=\"animationPhase === 1\">auto_awesome</mat-icon>\r\n          <mat-icon [class.active]=\"animationPhase === 2\">psychology</mat-icon>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Loading Message -->\r\n      <div class=\"message-section\">\r\n        <h3 class=\"loading-title\">{{ title }}</h3>\r\n        <p class=\"loading-message\">{{ currentMessage }}</p>\r\n      </div>\r\n\r\n      <!-- Shimmer Skeleton -->\r\n      @if (showShimmer) {\r\n        <div class=\"shimmer-section\">\r\n          <div class=\"shimmer-card\">\r\n            <div class=\"shimmer shimmer-header\"></div>\r\n            <div class=\"shimmer shimmer-line\"></div>\r\n            <div class=\"shimmer shimmer-line short\"></div>\r\n          </div>\r\n          <div class=\"shimmer-card\">\r\n            <div class=\"shimmer shimmer-header\"></div>\r\n            <div class=\"shimmer shimmer-line\"></div>\r\n            <div class=\"shimmer shimmer-line short\"></div>\r\n          </div>\r\n        </div>\r\n      }\r\n\r\n      <!-- Tips Section -->\r\n      @if (showTips && currentTip) {\r\n        <div class=\"tips-section\" [@fadeIn]>\r\n          <div class=\"tip-card\">\r\n            <mat-icon>lightbulb</mat-icon>\r\n            <p>{{ currentTip }}</p>\r\n          </div>\r\n        </div>\r\n      }\r\n    </div>\r\n  `,\r\n  styles: [`\r\n    .loading-container {\r\n      display: flex;\r\n      flex-direction: column;\r\n      align-items: center;\r\n      justify-content: center;\r\n      padding: 32px;\r\n      min-height: 400px;\r\n    }\r\n\r\n    .animation-section {\r\n      position: relative;\r\n      display: flex;\r\n      flex-direction: column;\r\n      align-items: center;\r\n      margin-bottom: 24px;\r\n    }\r\n\r\n    .spinner-wrapper {\r\n      position: relative;\r\n      \r\n      .pulse-ring {\r\n        position: absolute;\r\n        top: 50%;\r\n        left: 50%;\r\n        transform: translate(-50%, -50%);\r\n        width: 100px;\r\n        height: 100px;\r\n        border: 3px solid rgba(103, 58, 183, 0.3);\r\n        border-radius: 50%;\r\n        animation: pulse 2s ease-out infinite;\r\n        opacity: 0;\r\n      }\r\n    }\r\n\r\n    @keyframes pulse {\r\n      0% {\r\n        transform: translate(-50%, -50%) scale(0.8);\r\n        opacity: 0.8;\r\n      }\r\n      100% {\r\n        transform: translate(-50%, -50%) scale(1.5);\r\n        opacity: 0;\r\n      }\r\n    }\r\n\r\n    .animation-icons {\r\n      display: flex;\r\n      gap: 16px;\r\n      margin-top: 16px;\r\n\r\n      mat-icon {\r\n        font-size: 32px;\r\n        width: 32px;\r\n        height: 32px;\r\n        color: #e0e0e0;\r\n        transition: all 0.3s ease;\r\n\r\n        &.active {\r\n          color: #673ab7;\r\n          transform: scale(1.2);\r\n        }\r\n      }\r\n    }\r\n\r\n    .message-section {\r\n      text-align: center;\r\n      margin-bottom: 24px;\r\n\r\n      .loading-title {\r\n        font-size: 20px;\r\n        font-weight: 500;\r\n        color: #333;\r\n        margin: 0 0 8px;\r\n      }\r\n\r\n      .loading-message {\r\n        font-size: 14px;\r\n        color: #666;\r\n        margin: 0;\r\n        min-height: 20px;\r\n        transition: opacity 0.3s ease;\r\n      }\r\n    }\r\n\r\n    .shimmer-section {\r\n      display: flex;\r\n      gap: 16px;\r\n      width: 100%;\r\n      max-width: 600px;\r\n    }\r\n\r\n    .shimmer-card {\r\n      flex: 1;\r\n      padding: 16px;\r\n      background: #fff;\r\n      border-radius: 8px;\r\n      box-shadow: 0 2px 4px rgba(0,0,0,0.1);\r\n    }\r\n\r\n    .shimmer {\r\n      background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);\r\n      background-size: 200% 100%;\r\n      animation: shimmer 1.5s infinite;\r\n      border-radius: 4px;\r\n    }\r\n\r\n    .shimmer-header {\r\n      width: 60%;\r\n      height: 16px;\r\n      margin-bottom: 16px;\r\n    }\r\n\r\n    .shimmer-line {\r\n      width: 100%;\r\n      height: 12px;\r\n      margin-bottom: 8px;\r\n\r\n      &.short {\r\n        width: 70%;\r\n      }\r\n    }\r\n\r\n    @keyframes shimmer {\r\n      0% { background-position: -200% 0; }\r\n      100% { background-position: 200% 0; }\r\n    }\r\n\r\n    .tips-section {\r\n      margin-top: 32px;\r\n      width: 100%;\r\n      max-width: 500px;\r\n    }\r\n\r\n    .tip-card {\r\n      display: flex;\r\n      align-items: flex-start;\r\n      gap: 16px;\r\n      padding: 16px;\r\n      background: linear-gradient(135deg, #fff8e1 0%, #ffecb3 100%);\r\n      border-radius: 8px;\r\n      border-left: 4px solid #ffa000;\r\n\r\n      mat-icon {\r\n        color: #ffa000;\r\n        flex-shrink: 0;\r\n      }\r\n\r\n      p {\r\n        margin: 0;\r\n        font-size: 13px;\r\n        color: #5d4037;\r\n        line-height: 1.5;\r\n      }\r\n    }\r\n  `],\r\n  animations: [\r\n    trigger('fadeIn', [\r\n      transition(':enter', [\r\n        style({ opacity: 0, transform: 'translateY(10px)' }),\r\n        animate('300ms ease-out', style({ opacity: 1, transform: 'translateY(0)' }))\r\n      ])\r\n    ])\r\n  ]\r\n})\r\nexport class SummaryLoadingComponent implements OnInit, OnDestroy {\r\n  private readonly loanSummaryService = inject(LoanSummaryService);\r\n\r\n  /**\r\n   * Title displayed above the loading message.\r\n   * @default 'Generating AI Summary'\r\n   */\r\n  @Input() title = 'Generating AI Summary';\r\n\r\n  /**\r\n   * Custom loading messages to rotate through.\r\n   * If not provided, uses default messages.\r\n   */\r\n  @Input() messages: string[] = [\r\n    'Analyzing borrower information...',\r\n    'Fetching credit bureau data...',\r\n    'Processing risk assessment...',\r\n    'Calculating Go/No-Go status...',\r\n    'Generating AI summary...',\r\n  ];\r\n\r\n  /**\r\n   * Spinner diameter in pixels.\r\n   * @default 80\r\n   */\r\n  @Input() spinnerSize = 80;\r\n\r\n  /**\r\n   * Whether to show the shimmer skeleton.\r\n   * @default true\r\n   */\r\n  @Input() showShimmer = true;\r\n\r\n  /**\r\n   * Delay in ms before showing tips.\r\n   * @default 5000\r\n   */\r\n  @Input() tipDelay = 5000;\r\n\r\n  /** Current loading message */\r\n  currentMessage = '';\r\n  \r\n  /** Current tip */\r\n  currentTip = '';\r\n  \r\n  /** Whether tips are visible */\r\n  showTips = false;\r\n  \r\n  /** Animation phase (0-2) */\r\n  animationPhase = 0;\r\n\r\n  private tipInterval?: ReturnType<typeof setInterval>;\r\n  private phaseInterval?: ReturnType<typeof setInterval>;\r\n  private messageInterval?: ReturnType<typeof setInterval>;\r\n  private tipTimeout?: ReturnType<typeof setTimeout>;\r\n  private messageIndex = 0;\r\n\r\n  ngOnInit(): void {\r\n    this.currentMessage = this.messages[0] || '';\r\n    this.startAnimations();\r\n    this.startMessageRotation();\r\n\r\n    this.tipTimeout = setTimeout(() => {\r\n      this.showTips = true;\r\n      this.currentTip = this.loanSummaryService.getLoadingTip();\r\n      this.startTipRotation();\r\n    }, this.tipDelay);\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.clearIntervals();\r\n  }\r\n\r\n  private startAnimations(): void {\r\n    this.phaseInterval = setInterval(() => {\r\n      this.animationPhase = (this.animationPhase + 1) % 3;\r\n    }, 2000);\r\n  }\r\n\r\n  private startMessageRotation(): void {\r\n    this.messageInterval = setInterval(() => {\r\n      this.messageIndex = (this.messageIndex + 1) % this.messages.length;\r\n      this.currentMessage = this.messages[this.messageIndex];\r\n    }, 2000);\r\n  }\r\n\r\n  private startTipRotation(): void {\r\n    this.tipInterval = setInterval(() => {\r\n      this.currentTip = this.loanSummaryService.getLoadingTip();\r\n    }, 6000);\r\n  }\r\n\r\n  private clearIntervals(): void {\r\n    if (this.tipInterval) clearInterval(this.tipInterval);\r\n    if (this.phaseInterval) clearInterval(this.phaseInterval);\r\n    if (this.messageInterval) clearInterval(this.messageInterval);\r\n    if (this.tipTimeout) clearTimeout(this.tipTimeout);\r\n  }\r\n}\r\n","/**\r\n * @fileoverview Go/No-Go Decision Component\r\n * @description Displays the underwriting decision (GO, NO-GO, or REVIEW)\r\n * along with score, decision factors, and AI-generated analysis summary.\r\n * \r\n * @module uc-ui/components/sections/go-nogo-decision\r\n */\r\n\r\nimport { Component, Input, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MarkdownModule } from 'ngx-markdown';\r\n\r\nimport { GoNoGoDecision } from '../../../models/loan-summary.model';\r\nimport { BureauQuickSummary } from '../../../models/api-response.model';\r\n\r\n/**\r\n * Go/No-Go Decision Component\r\n * \r\n * @description Displays the overall underwriting decision with visual\r\n * indicators, score, decision factors, and AI-generated markdown summary.\r\n * Parses AI-generated markdown to extract dynamic decision and score.\r\n * \r\n * @example\r\n * ```html\r\n * <uc-go-nogo-decision\r\n *   [goNoGoDecision]=\"loanSummary.goNoGoDecision\"\r\n *   [goNoGoSummaryMarkdown]=\"summaryMarkdown\"\r\n *   [bureauQuickSummary]=\"bureauQuickSummary\">\r\n * </uc-go-nogo-decision>\r\n * ```\r\n */\r\n@Component({\r\n  selector: 'uc-go-nogo-decision',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    MatCardModule,\r\n    MatIconModule,\r\n    MatDividerModule,\r\n    MarkdownModule,\r\n  ],\r\n  templateUrl: './go-nogo-decision.component.html',\r\n  styleUrl: './go-nogo-decision.component.scss',\r\n})\r\nexport class GoNoGoDecisionComponent implements OnChanges {\r\n  /** The Go/No-Go decision data (fallback values) */\r\n  @Input() goNoGoDecision!: GoNoGoDecision;\r\n  \r\n  /** AI-generated markdown summary for the decision */\r\n  @Input() goNoGoSummaryMarkdown: string = '';\r\n  \r\n  /** Bureau quick summary containing credit score */\r\n  @Input() bureauQuickSummary: BureauQuickSummary | null = null;\r\n\r\n  /** Parsed decision from AI markdown (GO, NO-GO, REVIEW) */\r\n  parsedDecision: 'GO' | 'NO-GO' | 'REVIEW' | null = null;\r\n  \r\n  /** Parsed score from AI markdown */\r\n  parsedScore: number | null = null;\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['goNoGoSummaryMarkdown'] && this.goNoGoSummaryMarkdown) {\r\n      this.parseDecisionFromMarkdown();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Parse decision and score from AI-generated markdown\r\n   * Looks for patterns like \"Decision: ❌ NO-GO\" and \"Summary Score: 20/100\"\r\n   */\r\n  private parseDecisionFromMarkdown(): void {\r\n    const markdown = this.goNoGoSummaryMarkdown;\r\n    \r\n    // Parse decision - look for patterns like \"Decision: ❌ NO-GO\" or \"Decision: ✅ GO\"\r\n    const decisionPatterns = [\r\n      /Decision:\\s*[❌✅⚠️🔴🟢🟡]*\\s*(NO-GO|NO GO|NOGO|GO|REVIEW)/i,\r\n      /\\*\\*Decision\\*\\*:\\s*[❌✅⚠️🔴🟢🟡]*\\s*(NO-GO|NO GO|NOGO|GO|REVIEW)/i,\r\n      /(NO-GO|GO|REVIEW)\\s*\\((?:Reject|Approve|Review)\\)/i,\r\n    ];\r\n    \r\n    for (const pattern of decisionPatterns) {\r\n      const match = markdown.match(pattern);\r\n      if (match) {\r\n        const decision = match[1].toUpperCase().replace(/\\s+/g, '-');\r\n        if (decision === 'NOGO' || decision === 'NO-GO' || decision === 'NO GO') {\r\n          this.parsedDecision = 'NO-GO';\r\n        } else if (decision === 'GO') {\r\n          this.parsedDecision = 'GO';\r\n        } else if (decision === 'REVIEW') {\r\n          this.parsedDecision = 'REVIEW';\r\n        }\r\n        break;\r\n      }\r\n    }\r\n    \r\n    // Parse score - look for patterns like \"Summary Score: 20/100\" or \"Score: 85%\"\r\n    const scorePatterns = [\r\n      /Summary\\s*Score:\\s*(\\d+)\\s*\\/\\s*100/i,\r\n      /\\*\\*Summary\\s*Score\\*\\*:\\s*(\\d+)\\s*\\/\\s*100/i,\r\n      /Score:\\s*(\\d+)\\s*(?:\\/\\s*100|%)/i,\r\n      /(\\d+)\\s*\\/\\s*100\\s*(?:points?)?/i,\r\n    ];\r\n    \r\n    for (const pattern of scorePatterns) {\r\n      const match = markdown.match(pattern);\r\n      if (match) {\r\n        this.parsedScore = parseInt(match[1], 10);\r\n        break;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get the effective decision (parsed from AI or fallback to input)\r\n   */\r\n  get effectiveDecision(): 'GO' | 'NO-GO' | 'REVIEW' {\r\n    return this.parsedDecision || this.goNoGoDecision?.decision || 'REVIEW';\r\n  }\r\n\r\n  /**\r\n   * Get the effective score (parsed from AI or fallback to input)\r\n   */\r\n  get effectiveScore(): number {\r\n    return this.parsedScore ?? this.goNoGoDecision?.score ?? 0;\r\n  }\r\n\r\n  /**\r\n   * Get credit score from bureau quick summary\r\n   */\r\n  get creditScore(): string | number {\r\n    return this.bureauQuickSummary?.cibil_score || '-';\r\n  }\r\n\r\n  /**\r\n   * Get factors excluding Credit Score (to avoid duplication with dynamic credit score)\r\n   */\r\n  get filteredFactors() {\r\n    if (!this.goNoGoDecision?.factors) return [];\r\n    return this.goNoGoDecision.factors.filter(\r\n      factor => factor.name.toLowerCase() !== 'credit score'\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get CSS class based on decision value\r\n   * @returns CSS class string for styling the decision indicator\r\n   */\r\n  getDecisionClass(): string {\r\n    switch (this.effectiveDecision) {\r\n      case 'GO':\r\n        return 'decision-go';\r\n      case 'NO-GO':\r\n        return 'decision-nogo';\r\n      default:\r\n        return 'decision-review';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get decision icon based on effective decision\r\n   */\r\n  getDecisionIcon(): string {\r\n    switch (this.effectiveDecision) {\r\n      case 'GO':\r\n        return 'check_circle';\r\n      case 'NO-GO':\r\n        return 'cancel';\r\n      default:\r\n        return 'help';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get CSS class based on factor status\r\n   * @param status - The status value (pass, fail, or other)\r\n   * @returns CSS class string for styling the status badge\r\n   */\r\n  getFactorStatusClass(status: string): string {\r\n    switch (status) {\r\n      case 'pass':\r\n        return 'status-green';\r\n      case 'fail':\r\n        return 'status-red';\r\n      default:\r\n        return 'status-yellow';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get CSS class for credit score based on score value\r\n   * @returns CSS class string for styling the credit score badge\r\n   */\r\n  getCreditScoreStatusClass(): string {\r\n    const score = this.creditScore;\r\n    if (score === '-' || score === null || score === undefined) {\r\n      return 'status-yellow';\r\n    }\r\n    const numScore = typeof score === 'number' ? score : parseInt(String(score), 10);\r\n    if (isNaN(numScore)) {\r\n      return 'status-yellow';\r\n    }\r\n    if (numScore >= 750) {\r\n      return 'status-green';\r\n    } else if (numScore >= 650) {\r\n      return 'status-yellow';\r\n    } else {\r\n      return 'status-red';\r\n    }\r\n  }\r\n}\r\n","<mat-card class=\"summary-card decision-card\">\r\n  <mat-card-header>\r\n    <mat-icon mat-card-avatar>verified</mat-icon>\r\n    <mat-card-title>Go/No-Go Decision</mat-card-title>\r\n  </mat-card-header>\r\n  <mat-card-content>\r\n    <div class=\"decision-display\" [ngClass]=\"getDecisionClass()\">\r\n      <mat-icon>{{ getDecisionIcon() }}</mat-icon>\r\n      <span class=\"decision-text\">{{ effectiveDecision }}</span>\r\n      <span class=\"decision-score\">Score: {{ effectiveScore }}%</span>\r\n    </div>\r\n\r\n    <mat-divider></mat-divider>\r\n\r\n    <!-- 50-50 Split Layout -->\r\n    <div class=\"decision-content-split\">\r\n      <!-- Left Column: Status Badges (2 columns x 3 rows) -->\r\n      <div class=\"status-badges-section\">\r\n        <div class=\"factors-grid-split\">\r\n          <!-- Credit Score as first factor (if available from bureau) -->\r\n          @if (creditScore && creditScore !== \"-\") {\r\n            <div class=\"factor-item\">\r\n              <span class=\"factor-name\">Credit Score</span>\r\n              <span\r\n                class=\"factor-value status-badge\"\r\n                [ngClass]=\"getCreditScoreStatusClass()\"\r\n              >\r\n                {{ creditScore }}\r\n              </span>\r\n            </div>\r\n          }\r\n          @for (factor of filteredFactors; track factor.name) {\r\n            <div class=\"factor-item\">\r\n              <span class=\"factor-name\">{{ factor.name }}</span>\r\n              <span\r\n                class=\"factor-value status-badge\"\r\n                [ngClass]=\"getFactorStatusClass(factor.status)\"\r\n              >\r\n                {{ factor.value }}\r\n              </span>\r\n            </div>\r\n          }\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Right Column: Analysis Text -->\r\n      <div class=\"analysis-text-section\">\r\n        <div class=\"markdown-wrapper\">\r\n          <markdown\r\n            [data]=\"goNoGoSummaryMarkdown\"\r\n            class=\"markdown-content\"\r\n          ></markdown>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </mat-card-content>\r\n</mat-card>\r\n","/**\r\n * @fileoverview Borrower Information Component\r\n * @description Displays borrower/company information including name, CIN, DIN,\r\n * PAN, GST, address, and date of incorporation.\r\n * \r\n * @module uc-ui/components/sections/borrower-info\r\n */\r\n\r\nimport { Component, Input } from '@angular/core';\r\nimport { CommonModule, DatePipe } from '@angular/common';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\nimport { BorrowerInformation, ProposalBorrowerInfo } from '../../../models/loan-summary.model';\r\n\r\n/**\r\n * Borrower Information Component\r\n * \r\n * @description Displays key borrower/company details in a card layout.\r\n * Supports both traditional BorrowerInformation and ProposalBorrowerInfo formats.\r\n * \r\n * @example\r\n * ```html\r\n * <uc-borrower-info\r\n *   [borrowerInformation]=\"loanSummary.borrowerInformation\"\r\n *   [proposalBorrowerInfo]=\"proposal.borrowerInfo\">\r\n * </uc-borrower-info>\r\n * ```\r\n */\r\n@Component({\r\n  selector: 'uc-borrower-info',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    MatCardModule,\r\n    MatIconModule,\r\n    DatePipe,\r\n  ],\r\n  templateUrl: './borrower-info.component.html',\r\n  styleUrl: './borrower-info.component.scss',\r\n})\r\nexport class BorrowerInfoComponent {\r\n  /** The borrower/company information data (legacy format) */\r\n  @Input() borrowerInformation!: BorrowerInformation;\r\n  \r\n  /** The borrower information from proposal (new format) */\r\n  @Input() proposalBorrowerInfo: ProposalBorrowerInfo | null = null;\r\n\r\n  /** Get company name from either data source */\r\n  get companyName(): string {\r\n    return this.proposalBorrowerInfo?.CompanyName || this.borrowerInformation?.name || '';\r\n  }\r\n\r\n  /** Get CIN from either data source */\r\n  get cin(): string {\r\n    return this.proposalBorrowerInfo?.CIN || this.borrowerInformation?.cin || '';\r\n  }\r\n\r\n  /** Get DIN from either data source */\r\n  get din(): string {\r\n    return this.proposalBorrowerInfo?.DIN || this.borrowerInformation?.din || '';\r\n  }\r\n\r\n  /** Get date of incorporation from either data source */\r\n  get dateOfIncorporation(): string {\r\n    return this.proposalBorrowerInfo?.dateOfIncorporation || this.borrowerInformation?.doi || '';\r\n  }\r\n\r\n  /** Get PAN from either data source */\r\n  get pan(): string {\r\n    return this.proposalBorrowerInfo?.Pan || this.borrowerInformation?.pan || '';\r\n  }\r\n\r\n  /** Get GST from either data source */\r\n  get gst(): string {\r\n    return this.proposalBorrowerInfo?.Gst || this.borrowerInformation?.gst || '';\r\n  }\r\n\r\n  /** Get address from either data source */\r\n  get address(): string {\r\n    return this.proposalBorrowerInfo?.address || this.borrowerInformation?.address || '';\r\n  }\r\n}\r\n","<mat-card class=\"summary-card\">\r\n  <mat-card-header>\r\n    <mat-icon mat-card-avatar>business</mat-icon>\r\n    <mat-card-title>Borrower Information</mat-card-title>\r\n  </mat-card-header>\r\n  <mat-card-content>\r\n    <div class=\"info-grid\">\r\n      <div class=\"info-item\">\r\n        <span class=\"label\">Company Name</span>\r\n        <span class=\"value\">{{ companyName }}</span>\r\n      </div>\r\n      <div class=\"info-item\">\r\n        <span class=\"label\">CIN</span>\r\n        <span class=\"value mono\">{{ cin }}</span>\r\n      </div>\r\n      <div class=\"info-item\">\r\n        <span class=\"label\">Date of Incorporation</span>\r\n        <span class=\"value\">{{\r\n          dateOfIncorporation | date: \"mediumDate\"\r\n        }}</span>\r\n      </div>\r\n      <div class=\"info-item\">\r\n        <span class=\"label\">DIN</span>\r\n        <span class=\"value mono\">{{ din }}</span>\r\n      </div>\r\n      <div class=\"info-item\">\r\n        <span class=\"label\">PAN</span>\r\n        <span class=\"value mono\">{{ pan }}</span>\r\n      </div>\r\n      <div class=\"info-item\">\r\n        <span class=\"label\">GST</span>\r\n        <span class=\"value mono\">{{ gst }}</span>\r\n      </div>\r\n      @if (address) {\r\n        <div class=\"info-item full-width\">\r\n          <span class=\"label\">Address</span>\r\n          <span class=\"value\">{{ address }}</span>\r\n        </div>\r\n      }\r\n    </div>\r\n  </mat-card-content>\r\n</mat-card>\r\n","/**\r\n * @fileoverview Risk Rating Component\r\n * @description Displays risk rating analysis with score, factors, and financial metrics.\r\n * \r\n * @module uc-ui/components/sections/risk-rating\r\n */\r\n\r\nimport { Component, Input } from '@angular/core';\r\nimport { CommonModule, DecimalPipe } from '@angular/common';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\nimport { RiskRatingAnalysis } from '../../../models/loan-summary.model';\r\n\r\n/**\r\n * Risk Rating Component\r\n * \r\n * @description Displays comprehensive risk rating analysis including overall risk level,\r\n * risk score, probability of default, risk factors, and financial metrics.\r\n * \r\n * @example\r\n * ```html\r\n * <uc-risk-rating\r\n *   [riskRatingAnalysis]=\"loanSummary.riskRatingAnalysis\">\r\n * </uc-risk-rating>\r\n * ```\r\n */\r\n@Component({\r\n  selector: 'uc-risk-rating',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    MatCardModule,\r\n    MatIconModule,\r\n    DecimalPipe,\r\n  ],\r\n  templateUrl: './risk-rating.component.html',\r\n  styleUrl: './risk-rating.component.scss',\r\n})\r\nexport class RiskRatingComponent {\r\n  /** Risk rating analysis data */\r\n  @Input() riskRatingAnalysis!: RiskRatingAnalysis;\r\n\r\n  /**\r\n   * Get CSS class based on risk level\r\n   */\r\n  getRiskLevelClass(riskLevel: string): string {\r\n    switch (riskLevel) {\r\n      case 'Low Risk':\r\n        return 'risk-low';\r\n      case 'Medium Risk':\r\n        return 'risk-medium';\r\n      case 'High Risk':\r\n        return 'risk-high';\r\n      default:\r\n        return 'risk-medium';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get progress bar color based on score\r\n   */\r\n  getRiskScoreBarColor(score: number): string {\r\n    if (score >= 75) return 'bar-green';\r\n    if (score >= 60) return 'bar-amber';\r\n    return 'bar-red';\r\n  }\r\n\r\n  /**\r\n   * Get CSS class based on metric status\r\n   */\r\n  getMetricStatusClass(status: string): string {\r\n    switch (status) {\r\n      case 'Strong':\r\n        return 'status-strong';\r\n      case 'Good':\r\n        return 'status-good';\r\n      case 'Adequate':\r\n        return 'status-adequate';\r\n      case 'Weak':\r\n        return 'status-weak';\r\n      default:\r\n        return '';\r\n    }\r\n  }\r\n}\r\n","<mat-card class=\"summary-card risk-rating-card\">\r\n  <mat-card-header>\r\n    <mat-icon mat-card-avatar>analytics</mat-icon>\r\n    <mat-card-title>Risk Rating & Analysis</mat-card-title>\r\n  </mat-card-header>\r\n  <mat-card-content>\r\n    <!-- Risk Summary Card -->\r\n    <div\r\n      class=\"risk-summary-section\"\r\n      [ngClass]=\"getRiskLevelClass(riskRatingAnalysis.overallRisk)\"\r\n    >\r\n      <div class=\"risk-summary-main\">\r\n        <div class=\"risk-rating-display\">\r\n          <div class=\"risk-icon-container\">\r\n            <mat-icon class=\"risk-pulse-icon\">{{\r\n              riskRatingAnalysis.overallRisk === \"Low Risk\"\r\n                ? \"verified_user\"\r\n                : riskRatingAnalysis.overallRisk === \"High Risk\"\r\n                  ? \"gpp_bad\"\r\n                  : \"shield\"\r\n            }}</mat-icon>\r\n          </div>\r\n          <div class=\"risk-info\">\r\n            <span class=\"risk-level-label\">{{\r\n              riskRatingAnalysis.overallRisk\r\n            }}</span>\r\n            <span class=\"risk-score-display\"\r\n              >Score: {{ riskRatingAnalysis.riskScore }}/100</span\r\n            >\r\n          </div>\r\n        </div>\r\n        <div class=\"risk-pd-display\">\r\n          <span class=\"pd-label\">Probability of Default</span>\r\n          <span class=\"pd-value\">{{ riskRatingAnalysis.pd }}%</span>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Animated Risk Meter -->\r\n      <div class=\"risk-meter-container\">\r\n        <div class=\"risk-meter\">\r\n          <div class=\"meter-track\"></div>\r\n          <div\r\n            class=\"meter-fill\"\r\n            [style.width.%]=\"riskRatingAnalysis.riskScore\"\r\n          ></div>\r\n          <div\r\n            class=\"meter-pointer\"\r\n            [style.left.%]=\"riskRatingAnalysis.riskScore\"\r\n          >\r\n            <div class=\"pointer-dot\"></div>\r\n          </div>\r\n        </div>\r\n        <div class=\"meter-labels\">\r\n          <span class=\"meter-label high\">High Risk</span>\r\n          <span class=\"meter-label medium\">Medium</span>\r\n          <span class=\"meter-label low\">Low Risk</span>\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Recommended Action Section -->\r\n    <div class=\"recommendation-section\">\r\n      <div class=\"recommendation-header\">\r\n        <mat-icon>lightbulb</mat-icon>\r\n        <h4>Recommended Action</h4>\r\n      </div>\r\n      <div class=\"recommendation-content\">\r\n        <p>{{ riskRatingAnalysis.recommendation }}</p>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Risk Factors Section -->\r\n    <div class=\"risk-factors-section\">\r\n      <div class=\"section-header\">\r\n        <mat-icon>tune</mat-icon>\r\n        <h4>Risk Factors</h4>\r\n      </div>\r\n      <div class=\"risk-factors-grid\">\r\n        @for (factor of riskRatingAnalysis.riskFactors; track factor.name) {\r\n          <div class=\"risk-factor-card\" [class.factor-hover]=\"true\">\r\n            <div class=\"factor-header\">\r\n              <div class=\"factor-icon-wrapper\">\r\n                <mat-icon>{{ factor.icon }}</mat-icon>\r\n              </div>\r\n              <div class=\"factor-info\">\r\n                <span class=\"factor-name\">{{ factor.name }}</span>\r\n                <span class=\"factor-weight\">Weight: {{ factor.weight }}%</span>\r\n              </div>\r\n              <span\r\n                class=\"factor-score\"\r\n                [ngClass]=\"getRiskScoreBarColor(factor.score)\"\r\n                >{{ factor.score }}/100</span\r\n              >\r\n            </div>\r\n            <div class=\"factor-progress\">\r\n              <div class=\"progress-track\">\r\n                <div\r\n                  class=\"progress-fill\"\r\n                  [ngClass]=\"getRiskScoreBarColor(factor.score)\"\r\n                  [style.width.%]=\"factor.score\"\r\n                >\r\n                  <div class=\"progress-glow\"></div>\r\n                </div>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        }\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Financial Metrics Section -->\r\n    <div class=\"financial-metrics-section\">\r\n      <div class=\"section-header\">\r\n        <mat-icon>bar_chart</mat-icon>\r\n        <h4>Financial Metrics</h4>\r\n      </div>\r\n      <div class=\"metrics-grid\">\r\n        @for (\r\n          metric of riskRatingAnalysis.financialMetrics;\r\n          track metric.label\r\n        ) {\r\n          <div\r\n            class=\"metric-card\"\r\n            [ngClass]=\"getMetricStatusClass(metric.status)\"\r\n          >\r\n            <div class=\"metric-header\">\r\n              <span class=\"metric-label\">{{ metric.label }}</span>\r\n              <span\r\n                class=\"metric-status-badge\"\r\n                [ngClass]=\"getMetricStatusClass(metric.status)\"\r\n              >\r\n                {{ metric.status }}\r\n              </span>\r\n            </div>\r\n            <span class=\"metric-value\">{{\r\n              metric.value | number: \"1.2-2\"\r\n            }}</span>\r\n          </div>\r\n        }\r\n      </div>\r\n    </div>\r\n  </mat-card-content>\r\n</mat-card>\r\n","/**\r\n * @fileoverview Director Information Component\r\n * @description Displays director details including contact info, experience, and shareholding.\r\n * \r\n * @module uc-ui/components/sections/director-info\r\n */\r\n\r\nimport { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\r\nimport { CommonModule, DatePipe } from '@angular/common';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\nimport { DirectorInformation, ProposalDirectorInfo } from '../../../models/loan-summary.model';\r\n\r\n/**\r\n * Director Information Component\r\n * \r\n * @description Displays detailed information about company directors including\r\n * their role, experience, contact details, and shareholding percentage.\r\n * Supports both legacy DirectorInformation and new ProposalDirectorInfo formats.\r\n * \r\n * @example\r\n * ```html\r\n * <uc-director-info \r\n *   [directors]=\"loanSummary.directors\"\r\n *   [proposalDirectorInfo]=\"proposal.directorInfo\">\r\n * </uc-director-info>\r\n * ```\r\n */\r\n@Component({\r\n  selector: 'uc-director-info',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    MatCardModule,\r\n    MatIconModule,\r\n    DatePipe,\r\n  ],\r\n  templateUrl: './director-info.component.html',\r\n  styleUrl: './director-info.component.scss',\r\n})\r\nexport class DirectorInfoComponent implements OnInit, OnChanges {\r\n  /** Array of director information objects (legacy format) */\r\n  @Input() directors: DirectorInformation[] = [];\r\n  \r\n  /** Array of director information from proposal (new format) */\r\n  @Input() proposalDirectorInfo: ProposalDirectorInfo[] = [];\r\n\r\n  /** Combined display data */\r\n  displayDirectors: DirectorInformation[] = [];\r\n\r\n  ngOnInit(): void {\r\n    // Initialize displayDirectors on component init\r\n    this.updateDisplayDirectors();\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['proposalDirectorInfo'] || changes['directors']) {\r\n      this.updateDisplayDirectors();\r\n    }\r\n  }\r\n\r\n  private updateDisplayDirectors(): void {\r\n    // If proposalDirectorInfo has data, map it to DirectorInformation format\r\n    if (this.proposalDirectorInfo && this.proposalDirectorInfo.length > 0) {\r\n      this.displayDirectors = this.proposalDirectorInfo.map(d => ({\r\n        name: d.directorName || '',\r\n        din: d.DIN || '',\r\n        pan: d.PAN || '',\r\n        panStatus: 'Verified',\r\n        address: '',\r\n        phoneNumber: '',\r\n        emailId: '',\r\n        role: d.posting || '',\r\n        experience: 0,\r\n        otherDirectorships: 0,\r\n        qualification: '',\r\n        shareholding: 0,\r\n        appointedDate: '',\r\n      }));\r\n    } else {\r\n      this.displayDirectors = this.directors;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get director initials from name for avatar display\r\n   */\r\n  getDirectorInitials(name: string): string {\r\n    if (!name) return '';\r\n    const parts = name.trim().split(/\\s+/);\r\n    if (parts.length === 1) return parts[0].charAt(0).toUpperCase();\r\n    return (parts[0].charAt(0) + parts[parts.length - 1].charAt(0)).toUpperCase();\r\n  }\r\n\r\n  /**\r\n   * Check if using proposal format (simplified view)\r\n   */\r\n  get isProposalFormat(): boolean {\r\n    return this.proposalDirectorInfo && this.proposalDirectorInfo.length > 0;\r\n  }\r\n}\r\n","<mat-card class=\"summary-card director-section-card\">\r\n  <mat-card-header>\r\n    <mat-icon mat-card-avatar>groups</mat-icon>\r\n    <mat-card-title>Director Details</mat-card-title>\r\n  </mat-card-header>\r\n  <mat-card-content>\r\n    <div class=\"director-cards-container\">\r\n      @for (director of displayDirectors; track director.din || $index) {\r\n        <div class=\"director-card\">\r\n          <!-- Top Section: Avatar, Name, Role, DIN -->\r\n          <div class=\"director-card-header\">\r\n            <div class=\"director-avatar\">\r\n              {{ getDirectorInitials(director.name) }}\r\n            </div>\r\n            <div class=\"director-identity\">\r\n              <span class=\"director-name\">{{ director.name }}</span>\r\n              <span class=\"director-role-badge\">{{ director.role }}</span>\r\n            </div>\r\n            <div class=\"director-din\">\r\n              <span class=\"din-label\">DIN</span>\r\n              <span class=\"din-value\">{{ director.din }}</span>\r\n            </div>\r\n          </div>\r\n\r\n          <!-- PAN Information (always shown) -->\r\n          @if (director.pan) {\r\n            <div class=\"director-pan-info\">\r\n              <div class=\"pan-item\">\r\n                <span class=\"pan-label\">PAN</span>\r\n                <span class=\"pan-value\">{{ director.pan }}</span>\r\n              </div>\r\n            </div>\r\n          }\r\n\r\n          <!-- Key Metrics Section (only for full format) -->\r\n          @if (\r\n            !isProposalFormat &&\r\n            (director.experience || director.otherDirectorships)\r\n          ) {\r\n            <div class=\"director-metrics\">\r\n              <div class=\"metric-item\">\r\n                <span class=\"metric-label\">Experience</span>\r\n                <span class=\"metric-value\"\r\n                  >{{ director.experience }} years</span\r\n                >\r\n              </div>\r\n              <div class=\"metric-item\">\r\n                <span class=\"metric-label\">Other Directorships</span>\r\n                <span class=\"metric-value\">{{\r\n                  director.otherDirectorships\r\n                }}</span>\r\n              </div>\r\n            </div>\r\n          }\r\n\r\n          <!-- Contact Information Section (only for full format) -->\r\n          @if (\r\n            !isProposalFormat &&\r\n            (director.emailId || director.phoneNumber || director.address)\r\n          ) {\r\n            <div class=\"director-contact\">\r\n              @if (director.emailId) {\r\n                <div class=\"contact-item\">\r\n                  <mat-icon>email</mat-icon>\r\n                  <div class=\"contact-details\">\r\n                    <span class=\"contact-label\">Email</span>\r\n                    <span class=\"contact-value\">{{ director.emailId }}</span>\r\n                  </div>\r\n                </div>\r\n              }\r\n              @if (director.phoneNumber) {\r\n                <div class=\"contact-item\">\r\n                  <mat-icon>phone</mat-icon>\r\n                  <div class=\"contact-details\">\r\n                    <span class=\"contact-label\">Phone</span>\r\n                    <span class=\"contact-value\">{{\r\n                      director.phoneNumber\r\n                    }}</span>\r\n                  </div>\r\n                </div>\r\n              }\r\n              @if (director.address) {\r\n                <div class=\"contact-item address-item\">\r\n                  <mat-icon>location_on</mat-icon>\r\n                  <div class=\"contact-details\">\r\n                    <span class=\"contact-label\">Address</span>\r\n                    <span class=\"contact-value\">{{ director.address }}</span>\r\n                  </div>\r\n                </div>\r\n              }\r\n            </div>\r\n          }\r\n\r\n          <!-- Additional Info Section (only for full format) -->\r\n          @if (\r\n            !isProposalFormat &&\r\n            (director.qualification ||\r\n              director.shareholding ||\r\n              director.appointedDate)\r\n          ) {\r\n            <div class=\"director-additional-info\">\r\n              <div class=\"info-row\">\r\n                @if (director.qualification) {\r\n                  <div class=\"info-item\">\r\n                    <span class=\"info-label\">Qualification</span>\r\n                    <span class=\"info-value\">{{ director.qualification }}</span>\r\n                  </div>\r\n                }\r\n                @if (director.shareholding) {\r\n                  <div class=\"info-item shareholding-highlight\">\r\n                    <span class=\"info-label\">Shareholding</span>\r\n                    <span class=\"info-value shareholding-value\"\r\n                      >{{ director.shareholding }}%</span\r\n                    >\r\n                  </div>\r\n                }\r\n              </div>\r\n              @if (director.appointedDate) {\r\n                <div class=\"info-row\">\r\n                  <div class=\"info-item\">\r\n                    <span class=\"info-label\">Appointed On</span>\r\n                    <span class=\"info-value\">{{\r\n                      director.appointedDate | date: \"dd MMM yyyy\"\r\n                    }}</span>\r\n                  </div>\r\n                </div>\r\n              }\r\n            </div>\r\n          }\r\n        </div>\r\n      }\r\n    </div>\r\n  </mat-card-content>\r\n</mat-card>\r\n","import { Component, Input, inject, OnChanges, OnInit, SimpleChanges } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTableModule } from '@angular/material/table';\r\n\r\nimport { LoanFacilityInformation, ProposalFacilityInfo } from '../../../models/loan-summary.model';\r\nimport { LoanSummaryService } from '../../../services/loan-summary.service';\r\n\r\n@Component({\r\n  selector: 'uc-loan-facility',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    MatCardModule,\r\n    MatIconModule,\r\n    MatTableModule,\r\n  ],\r\n  templateUrl: './loan-facility.component.html',\r\n  styleUrl: './loan-facility.component.scss',\r\n})\r\nexport class LoanFacilityComponent implements OnInit, OnChanges {\r\n  /** Legacy facility information */\r\n  @Input() facilities: LoanFacilityInformation[] = [];\r\n  \r\n  /** Proposal facility information (new format) */\r\n  @Input() proposalFacilityInfo: ProposalFacilityInfo[] = [];\r\n  \r\n  /** Display data source for table */\r\n  displayFacilities: LoanFacilityInformation[] = [];\r\n  \r\n  facilityColumns: string[] = [\r\n    'facility',\r\n    'natureOfLimit',\r\n    'amountRequested',\r\n    'tenure',\r\n  ];\r\n\r\n  private loanSummaryService = inject(LoanSummaryService);\r\n\r\n  ngOnInit(): void {\r\n    // Initialize displayFacilities on component init\r\n    this.updateDisplayFacilities();\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['proposalFacilityInfo'] || changes['facilities']) {\r\n      this.updateDisplayFacilities();\r\n    }\r\n  }\r\n\r\n  private updateDisplayFacilities(): void {\r\n    // If proposalFacilityInfo has data, map it to LoanFacilityInformation format\r\n    if (this.proposalFacilityInfo && this.proposalFacilityInfo.length > 0) {\r\n      this.displayFacilities = this.proposalFacilityInfo.map(f => ({\r\n        facility: f.facilityName || '',\r\n        natureOfLimit: f.natureOfLimit || '',\r\n        amountRequested: typeof f.amountRequested === 'number' \r\n          ? f.amountRequested \r\n          : parseFloat(f.amountRequested) || 0,\r\n        tenure: f.tenure || '',\r\n      }));\r\n    } else {\r\n      this.displayFacilities = this.facilities;\r\n    }\r\n  }\r\n\r\n  formatCurrency(amount: number): string {\r\n    return this.loanSummaryService.formatCurrency(amount);\r\n  }\r\n}\r\n","<mat-card class=\"summary-card\">\r\n  <mat-card-header>\r\n    <mat-icon mat-card-avatar>payments</mat-icon>\r\n    <mat-card-title>Loan Facility Information</mat-card-title>\r\n  </mat-card-header>\r\n  <mat-card-content>\r\n    <div class=\"table-wrapper\">\r\n      <table mat-table [dataSource]=\"displayFacilities\" class=\"facility-table\">\r\n        <ng-container matColumnDef=\"facility\">\r\n          <th mat-header-cell *matHeaderCellDef>Facility</th>\r\n          <td mat-cell *matCellDef=\"let item\">{{ item.facility }}</td>\r\n        </ng-container>\r\n        <ng-container matColumnDef=\"natureOfLimit\">\r\n          <th mat-header-cell *matHeaderCellDef>Nature of Limit</th>\r\n          <td mat-cell *matCellDef=\"let item\">\r\n            <span\r\n              class=\"nature-badge\"\r\n              [class.secured]=\"item.natureOfLimit === 'Secured'\"\r\n            >\r\n              {{ item.natureOfLimit }}\r\n            </span>\r\n          </td>\r\n        </ng-container>\r\n        <ng-container matColumnDef=\"amountRequested\">\r\n          <th mat-header-cell *matHeaderCellDef>Amount Requested</th>\r\n          <td mat-cell *matCellDef=\"let item\" class=\"amount\">\r\n            {{ formatCurrency(item.amountRequested) }}\r\n          </td>\r\n        </ng-container>\r\n        <ng-container matColumnDef=\"tenure\">\r\n          <th mat-header-cell *matHeaderCellDef>Tenure</th>\r\n          <td mat-cell *matCellDef=\"let item\">{{ item.tenure }}</td>\r\n        </ng-container>\r\n        <tr mat-header-row *matHeaderRowDef=\"facilityColumns\"></tr>\r\n        <tr mat-row *matRowDef=\"let row; columns: facilityColumns\"></tr>\r\n      </table>\r\n    </div>\r\n  </mat-card-content>\r\n</mat-card>\r\n","/**\n * Formats a raw rupee amount using the Indian Lakh/Crore convention,\n * e.g. 3002300 -> \"₹30.02L\", 150000000 -> \"₹15.00Cr\".\n */\nexport function formatLakhCrore(value: number): string {\n  const sign = value < 0 ? '-' : '';\n  const abs = Math.abs(value);\n\n  if (abs >= 10000000) {\n    return `${sign}₹${(abs / 10000000).toFixed(2)}Cr`;\n  }\n  if (abs >= 100000) {\n    return `${sign}₹${(abs / 100000).toFixed(2)}L`;\n  }\n  if (abs >= 1000) {\n    return `${sign}₹${(abs / 1000).toFixed(1)}K`;\n  }\n  return `${sign}₹${abs.toFixed(0)}`;\n}\n\n/**\n * Chart.js datalabels `display` callback that hides the always-on label for\n * whichever point/bar/slice is currently under the tooltip, so the hover\n * card takes over instead of overlapping the embedded label.\n */\nexport function hideDatalabelOnHover(context: any): boolean {\n  const active = context.chart.tooltip?.getActiveElements?.() ?? [];\n  return !active.some(\n    (el: any) => el.datasetIndex === context.datasetIndex && el.index === context.dataIndex\n  );\n}\n","import {\n  AfterViewInit,\n  Component,\n  ElementRef,\n  Input,\n  OnChanges,\n  OnDestroy,\n  SimpleChanges,\n  ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Chart, registerables } from 'chart.js';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { formatLakhCrore, hideDatalabelOnHover } from '../chart-format.util';\n\nChart.register(...registerables, ChartDataLabels);\n\n/**\n * Single dataset for the bar chart (e.g. \"Sanctioned\" or \"Outstanding\").\n */\nexport interface UcChartDataset {\n  label: string;\n  data: number[];\n  backgroundColor?: string | string[];\n}\n\nconst DEFAULT_COLORS = ['#2563eb', '#f59e0b', '#16a34a', '#dc2626', '#7c3aed'];\n\n/**\n * Self-contained bar chart built directly on top of chart.js (no ng2-charts,\n * no NgModule registration required by the consuming app). Safe to publish\n * as part of a standalone-component library since chart.js is bundled as a\n * regular dependency and imported imperatively.\n */\n@Component({\n  selector: 'uc-bar-chart',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div class=\"uc-bar-chart-wrapper\" [style.height.px]=\"height\">\n      @if (hasData) {\n        <canvas #chartCanvas></canvas>\n      } @else {\n        <div class=\"uc-bar-chart-empty\">No data available</div>\n      }\n    </div>\n  `,\n  styleUrl: './bar-chart.component.scss',\n})\nexport class UcBarChartComponent implements AfterViewInit, OnChanges, OnDestroy {\n  @Input() labels: string[] = [];\n  @Input() datasets: UcChartDataset[] = [];\n  @Input() height = 220;\n  @Input() horizontal = false;\n  @Input() showLegend = true;\n  @Input() yAxisLabel = '';\n  /** 'currency' renders values as ₹ Lakh/Crore; 'number' shows the raw value (e.g. counts). */\n  @Input() valueFormat: 'currency' | 'number' = 'number';\n\n  @ViewChild('chartCanvas') private canvasRef?: ElementRef<HTMLCanvasElement>;\n\n  private chart: Chart | null = null;\n\n  get hasData(): boolean {\n    return this.labels.length > 0 && this.datasets.length > 0;\n  }\n\n  ngAfterViewInit(): void {\n    this.renderChart();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (!changes['labels'] && !changes['datasets']) return;\n    if (this.chart) {\n      this.updateChart();\n    } else {\n      this.renderChart();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.chart?.destroy();\n    this.chart = null;\n  }\n\n  private formatValue = (value: number): string => {\n    return this.valueFormat === 'currency' ? formatLakhCrore(value) : String(value);\n  };\n\n  private buildDatasets() {\n    return this.datasets.map((ds, index) => ({\n      label: ds.label,\n      data: ds.data,\n      backgroundColor: ds.backgroundColor ?? DEFAULT_COLORS[index % DEFAULT_COLORS.length],\n      borderRadius: 4,\n      maxBarThickness: 48,\n    }));\n  }\n\n  private renderChart(): void {\n    if (!this.canvasRef?.nativeElement || !this.hasData) return;\n    const ctx = this.canvasRef.nativeElement.getContext('2d');\n    if (!ctx) return;\n\n    this.chart?.destroy();\n    this.chart = new Chart(ctx, {\n      type: 'bar',\n      data: {\n        labels: this.labels,\n        datasets: this.buildDatasets(),\n      },\n      options: {\n        indexAxis: this.horizontal ? 'y' : 'x',\n        responsive: true,\n        maintainAspectRatio: false,\n        plugins: {\n          legend: {\n            display: this.showLegend && this.datasets.length > 1,\n            position: 'bottom',\n            labels: { boxWidth: 12, font: { size: 12 } },\n          },\n          tooltip: {\n            enabled: true,\n            callbacks: {\n              label: (ctx) => `${ctx.dataset.label}: ${this.formatValue(ctx.parsed.y ?? ctx.parsed.x ?? 0)}`,\n            },\n          },\n          datalabels: {\n            display: hideDatalabelOnHover,\n            anchor: 'end',\n            align: 'end',\n            offset: 4,\n            color: '#374151',\n            font: { size: 10, weight: 'bold' },\n            formatter: (value: number) => this.formatValue(value),\n          },\n        },\n        scales: {\n          y: {\n            beginAtZero: true,\n            title: { display: !!this.yAxisLabel, text: this.yAxisLabel },\n            grid: { color: '#f1f5f9' },\n            ticks: { callback: (value) => this.formatValue(Number(value)) },\n          },\n          x: {\n            grid: { display: false },\n          },\n        },\n      },\n    });\n  }\n\n  private updateChart(): void {\n    if (!this.chart) return;\n    this.chart.data.labels = this.labels;\n    this.chart.data.datasets = this.buildDatasets();\n    this.chart.update();\n  }\n}\n","import { Component, Input, Output, EventEmitter, OnChanges, OnInit, SimpleChanges, inject } from '@angular/core';\r\nimport { CommonModule, DatePipe } from '@angular/common';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MarkdownModule } from 'ngx-markdown';\r\n\r\nimport { CreditBureauDetails, BureauData, BureauLoanDetail } from '../../../models/loan-summary.model';\r\nimport { BureauQuickSummary } from '../../../models/api-response.model';\r\nimport { LoanSummaryService } from '../../../services/loan-summary.service';\r\nimport { MOCK_CREDIT_BUREAU_DETAILS } from '../../../mock-data/credit-bureau-mock-data';\r\nimport { UcBarChartComponent, UcChartDataset } from '../../shared/charts/bar-chart/bar-chart.component';\r\n\r\n@Component({\r\n  selector: 'uc-credit-bureau',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    MatCardModule,\r\n    MatIconModule,\r\n    MatButtonToggleModule,\r\n    MarkdownModule,\r\n    DatePipe,\r\n    UcBarChartComponent,\r\n  ],\r\n  templateUrl: './credit-bureau.component.html',\r\n  styleUrl: './credit-bureau.component.scss',\r\n})\r\nexport class CreditBureauComponent implements OnInit, OnChanges {\r\n  /** Falls back to demo data only when no bureauQuickSummary response is bound */\r\n  @Input() creditBureauDetails: CreditBureauDetails = MOCK_CREDIT_BUREAU_DETAILS;\r\n  @Input() bureauViewMode: 'overview' | 'detailed' = 'overview';\r\n  @Input() bureauDetailedMarkdown: string = '';\r\n  @Input() isLoadingBureauDetails: boolean = false;\r\n  @Input() bureauData: BureauData | null = null;\r\n  /** Quick summary data from backend API for overview cards */\r\n  @Input() bureauQuickSummary: BureauQuickSummary | null = null;\r\n  @Output() bureauViewModeChange = new EventEmitter<'overview' | 'detailed'>();\r\n\r\n  // Display values that can be \"-\" or actual values\r\n  displayCibilScore: string | number = '-';\r\n  displayCibilRemarks: string = '-';\r\n  displayTotalAccounts: string | number = '-';\r\n  displayActiveAccounts: string | number = '-';\r\n  displayCreditUtilization: string | number = '-';\r\n  displayOnTimePayments: string | number = '-';\r\n  displayDelayedPayments: string | number = '-';\r\n  displayDefaultedPayments: string | number = '-';\r\n  displayLast30DaysEnquiries: string | number = '-';\r\n  displayLast90DaysEnquiries: string | number = '-';\r\n  displayLast6MonthsEnquiries: string | number = '-';\r\n  displayLoanDetails: Array<{\r\n    lender: string;\r\n    loanType: string;\r\n    sanctioned: string | number;\r\n    outstanding: string | number;\r\n    dpd: string | number;\r\n    status: string;\r\n  }> = [];\r\n\r\n  // Chart data - computed once per ngOnChanges rather than via getters, since\r\n  // getters would return a new array reference on every change-detection\r\n  // cycle and continuously restart the chart.js render/animation.\r\n  readonly enquiriesChartLabels: string[] = ['Last 6 Months', 'Last 90 Days', 'Last 30 Days'];\r\n  enquiriesChartDatasets: UcChartDataset[] = [];\r\n  loanTypeChartLabels: string[] = [];\r\n  loanTypeChartDatasets: UcChartDataset[] = [];\r\n\r\n  private loanSummaryService = inject(LoanSummaryService);\r\n\r\n  ngOnInit(): void {\r\n    this.computeChartData();\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    // When bureauQuickSummary arrives from multi-model API, map it to display values\r\n    if (changes['bureauQuickSummary'] && this.bureauQuickSummary) {\r\n      this.mapQuickSummaryToDisplay();\r\n    }\r\n    // Fallback: When bureauData arrives from package-test API, map it to display values\r\n    else if (changes['bureauData'] && this.bureauData) {\r\n      this.mapBureauDataToDisplay();\r\n    }\r\n\r\n    if (changes['bureauQuickSummary'] || changes['bureauData'] || changes['creditBureauDetails']) {\r\n      this.computeChartData();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Maps the bureauQuickSummary from multi-model API to display values\r\n   */\r\n  private mapQuickSummaryToDisplay(): void {\r\n    if (!this.bureauQuickSummary) return;\r\n\r\n    // Map all values - keep \"-\" as-is\r\n    this.displayCibilScore = this.bureauQuickSummary.cibil_score;\r\n    this.displayCibilRemarks = String(this.bureauQuickSummary.cibil_remarks);\r\n    this.displayTotalAccounts = this.bureauQuickSummary.total_accounts;\r\n    this.displayActiveAccounts = this.bureauQuickSummary.active_accounts;\r\n    this.displayCreditUtilization = this.bureauQuickSummary.credit_utilization;\r\n    this.displayOnTimePayments = this.bureauQuickSummary.ontime_payments;\r\n    this.displayDelayedPayments = this.bureauQuickSummary.delayed_payments;\r\n    this.displayDefaultedPayments = this.bureauQuickSummary.defaulted_payments;\r\n    this.displayLast30DaysEnquiries = this.bureauQuickSummary.last_30_days_credit_enquiries;\r\n    this.displayLast90DaysEnquiries = this.bureauQuickSummary.last_90_days_credit_enquiries;\r\n    this.displayLast6MonthsEnquiries = this.bureauQuickSummary.last_6_months_credit_enquiries;\r\n\r\n    // Map loan details if present (loan_details might be an array in quick_summary)\r\n    const loanDetails = this.bureauQuickSummary.loan_details;\r\n    if (loanDetails && Array.isArray(loanDetails) && loanDetails.length > 0) {\r\n      this.displayLoanDetails = loanDetails.map((loan: any) => ({\r\n        lender: String(loan.lender || '-'),\r\n        loanType: String(loan.loan_type || '-'),\r\n        sanctioned: loan.sanctioned_amount ?? '-',\r\n        outstanding: loan.outstanding_amount ?? '-',\r\n        dpd: loan.dpd ?? '-',\r\n        status: String(loan.status || '-')\r\n      }));\r\n    }\r\n    \r\n    console.log('📊 [BUREAU] Quick summary mapped to display:', {\r\n      cibilScore: this.displayCibilScore,\r\n      cibilRemarks: this.displayCibilRemarks,\r\n      totalAccounts: this.displayTotalAccounts,\r\n      activeAccounts: this.displayActiveAccounts\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Maps the package-test bureauData to display values (keeps \"-\" as-is)\r\n   */\r\n  private mapBureauDataToDisplay(): void {\r\n    if (!this.bureauData) return;\r\n\r\n    // Map all values - keep \"-\" as-is\r\n    this.displayCibilScore = this.bureauData.cibil_score;\r\n    this.displayCibilRemarks = String(this.bureauData.cibil_remarks);\r\n    this.displayTotalAccounts = this.bureauData.total_accounts;\r\n    this.displayActiveAccounts = this.bureauData.active_accounts;\r\n    this.displayCreditUtilization = this.bureauData.credit_utilization;\r\n    this.displayOnTimePayments = this.bureauData.ontime_payments;\r\n    this.displayDelayedPayments = this.bureauData.delayed_payments;\r\n    this.displayDefaultedPayments = this.bureauData.defaulted_payments;\r\n    this.displayLast30DaysEnquiries = this.bureauData.last_30_days_credit_enquiries;\r\n    this.displayLast90DaysEnquiries = this.bureauData.last_90_days_credit_enquiries;\r\n    this.displayLast6MonthsEnquiries = this.bureauData.last_6_months_credit_enquiries;\r\n\r\n    // Map loan details - keep \"-\" as-is\r\n    if (this.bureauData.loan_details && this.bureauData.loan_details.length > 0) {\r\n      this.displayLoanDetails = this.bureauData.loan_details.map((loan: BureauLoanDetail) => ({\r\n        lender: String(loan.lender),\r\n        loanType: String(loan.loan_type),\r\n        sanctioned: loan.sanctioned_amount,\r\n        outstanding: loan.outstanding_amount,\r\n        dpd: loan.dpd,\r\n        status: String(loan.status)\r\n      }));\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check if bureauData or bureauQuickSummary has been loaded (for conditional rendering)\r\n   */\r\n  hasBureauData(): boolean {\r\n    return this.bureauQuickSummary !== null || this.bureauData !== null;\r\n  }\r\n\r\n  /**\r\n   * Check if a value is \"-\" (not available)\r\n   */\r\n  isNotAvailable(value: string | number | undefined | null): boolean {\r\n    return value === '-' || value === null || value === undefined || value === '';\r\n  }\r\n\r\n  /** Appends \"%\" unless the value (e.g. from a pre-formatted backend response) already has one. */\r\n  withPercent(value: string | number): string {\r\n    const str = String(value);\r\n    return str.endsWith('%') ? str : `${str}%`;\r\n  }\r\n\r\n  /**\r\n   * Get numeric value for calculations (returns 0 if \"-\"). Handles both plain\r\n   * numbers and backend-formatted currency strings like \"₹30.02 Lakh\".\r\n   */\r\n  getNumericValue(value: string | number): number {\r\n    return this.loanSummaryService.parseAmountToNumber(value);\r\n  }\r\n\r\n  onBureauViewModeChange(mode: 'overview' | 'detailed'): void {\r\n    this.bureauViewModeChange.emit(mode);\r\n  }\r\n\r\n  formatCurrency(amount: number): string {\r\n    return this.loanSummaryService.formatCurrency(amount);\r\n  }\r\n\r\n  getCreditScoreColorClass(score: number): string {\r\n    if (score >= 800) return 'score-excellent';\r\n    if (score >= 750) return 'score-good';\r\n    if (score >= 700) return 'score-fair';\r\n    if (score >= 650) return 'score-average';\r\n    if (score >= 600) return 'score-poor';\r\n    return 'score-very-poor';\r\n  }\r\n\r\n  getCreditScoreBadgeClass(score: number): string {\r\n    if (score >= 800) return 'badge-excellent';\r\n    if (score >= 750) return 'badge-good';\r\n    if (score >= 700) return 'badge-fair';\r\n    if (score >= 650) return 'badge-average';\r\n    if (score >= 600) return 'badge-poor';\r\n    return 'badge-very-poor';\r\n  }\r\n\r\n  getCreditScoreLabel(score: number): string {\r\n    if (score >= 800) return 'Excellent';\r\n    if (score >= 750) return 'Good';\r\n    if (score >= 700) return 'Fair';\r\n    if (score >= 650) return 'Average';\r\n    if (score >= 600) return 'Poor';\r\n    return 'Very Poor';\r\n  }\r\n\r\n  getLoanStatusClass(status: string): string {\r\n    switch (status) {\r\n      case 'Active':\r\n        return 'loan-status-active';\r\n      case 'Closed':\r\n        return 'loan-status-closed';\r\n      case 'Delayed':\r\n        return 'loan-status-delayed';\r\n      default:\r\n        return '';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Recomputes chart-bound arrays once per input change. Credit Enquiries\r\n   * chart is ordered from 6 months down to 30 days; Loan Details chart is\r\n   * Sanctioned vs Outstanding grouped by Loan Type.\r\n   */\r\n  private computeChartData(): void {\r\n    const last6Months = this.hasBureauData()\r\n      ? this.getNumericValue(this.displayLast6MonthsEnquiries)\r\n      : this.creditBureauDetails?.creditEnquiries?.last6Months ?? 0;\r\n    const last90Days = this.hasBureauData()\r\n      ? this.getNumericValue(this.displayLast90DaysEnquiries)\r\n      : this.creditBureauDetails?.creditEnquiries?.last90Days ?? 0;\r\n    const last30Days = this.hasBureauData()\r\n      ? this.getNumericValue(this.displayLast30DaysEnquiries)\r\n      : this.creditBureauDetails?.creditEnquiries?.last30Days ?? 0;\r\n\r\n    this.enquiriesChartDatasets = [\r\n      {\r\n        label: 'Enquiries',\r\n        data: [last6Months, last90Days, last30Days],\r\n        backgroundColor: '#2563eb',\r\n      },\r\n    ];\r\n\r\n    const aggregates = this.getLoanTypeAggregates();\r\n    this.loanTypeChartLabels = aggregates.map((group) => group.loanType);\r\n    this.loanTypeChartDatasets = [\r\n      { label: 'Sanctioned', data: aggregates.map((g) => g.sanctioned), backgroundColor: '#2563eb' },\r\n      { label: 'Outstanding', data: aggregates.map((g) => g.outstanding), backgroundColor: '#f59e0b' },\r\n    ];\r\n  }\r\n\r\n  private getLoanTypeAggregates(): Array<{ loanType: string; sanctioned: number; outstanding: number }> {\r\n    const source =\r\n      this.hasBureauData() && this.displayLoanDetails.length > 0\r\n        ? this.displayLoanDetails.map((loan) => ({\r\n            loanType: loan.loanType,\r\n            sanctioned: this.getNumericValue(loan.sanctioned),\r\n            outstanding: this.getNumericValue(loan.outstanding),\r\n          }))\r\n        : (this.creditBureauDetails?.loanDetails ?? []).map((loan) => ({\r\n            loanType: loan.loanType,\r\n            sanctioned: loan.sanctioned,\r\n            outstanding: loan.outstanding,\r\n          }));\r\n\r\n    const aggregatesByType = new Map<string, { sanctioned: number; outstanding: number }>();\r\n    for (const loan of source) {\r\n      const key = loan.loanType || 'Other';\r\n      const existing = aggregatesByType.get(key) ?? { sanctioned: 0, outstanding: 0 };\r\n      existing.sanctioned += loan.sanctioned;\r\n      existing.outstanding += loan.outstanding;\r\n      aggregatesByType.set(key, existing);\r\n    }\r\n\r\n    return Array.from(aggregatesByType.entries()).map(([loanType, totals]) => ({ loanType, ...totals }));\r\n  }\r\n}\r\n","<mat-card class=\"summary-card credit-bureau-card\">\r\n  <mat-card-header>\r\n    <mat-icon mat-card-avatar>credit_score</mat-icon>\r\n    <mat-card-title>Bureau Information</mat-card-title>\r\n    <div class=\"bureau-view-toggle\">\r\n      <mat-button-toggle-group\r\n        [value]=\"bureauViewMode\"\r\n        (change)=\"onBureauViewModeChange($event.value)\"\r\n      >\r\n        <mat-button-toggle value=\"overview\">\r\n          <mat-icon>dashboard</mat-icon>\r\n          Overview\r\n        </mat-button-toggle>\r\n        <mat-button-toggle value=\"detailed\">\r\n          <mat-icon>article</mat-icon>\r\n          Detailed Analysis\r\n        </mat-button-toggle>\r\n      </mat-button-toggle-group>\r\n    </div>\r\n  </mat-card-header>\r\n  <mat-card-content>\r\n    @if (bureauViewMode === \"overview\") {\r\n      <!-- Credit Score Header Section -->\r\n      <div\r\n        class=\"credit-score-header\"\r\n        [ngClass]=\"\r\n          hasBureauData()\r\n            ? isNotAvailable(displayCibilScore)\r\n              ? ''\r\n              : getCreditScoreColorClass(getNumericValue(displayCibilScore))\r\n            : getCreditScoreColorClass(creditBureauDetails.creditScore)\r\n        \"\r\n      >\r\n        <div class=\"score-display\">\r\n          <span class=\"score-value\">{{\r\n            hasBureauData()\r\n              ? displayCibilScore\r\n              : creditBureauDetails.creditScore\r\n          }}</span>\r\n          <span class=\"score-date\"\r\n            >as of\r\n            {{ creditBureauDetails.scoreDate | date: \"dd MMM yyyy\" }}</span\r\n          >\r\n        </div>\r\n        <span\r\n          class=\"score-status-badge\"\r\n          [ngClass]=\"\r\n            hasBureauData()\r\n              ? isNotAvailable(displayCibilScore)\r\n                ? ''\r\n                : getCreditScoreBadgeClass(getNumericValue(displayCibilScore))\r\n              : getCreditScoreBadgeClass(creditBureauDetails.creditScore)\r\n          \"\r\n        >\r\n          {{\r\n            hasBureauData()\r\n              ? isNotAvailable(displayCibilScore)\r\n                ? \"-\"\r\n                : displayCibilRemarks !== \"-\"\r\n                  ? displayCibilRemarks\r\n                  : getCreditScoreLabel(getNumericValue(displayCibilScore))\r\n              : getCreditScoreLabel(creditBureauDetails.creditScore)\r\n          }}\r\n        </span>\r\n      </div>\r\n\r\n      <!-- KPI Cards Section - 3 Cards -->\r\n      <div class=\"credit-kpi-cards\">\r\n        <!-- Card 1: Total Accounts -->\r\n        <div class=\"credit-kpi-card kpi-total-accounts\">\r\n          <span class=\"kpi-title\">Total Accounts</span>\r\n          <span class=\"kpi-value\">{{\r\n            hasBureauData()\r\n              ? displayTotalAccounts\r\n              : creditBureauDetails.totalNoOfLoans\r\n          }}</span>\r\n        </div>\r\n\r\n        <!-- Card 2: Active Accounts -->\r\n        <div class=\"credit-kpi-card kpi-active-accounts\">\r\n          <span class=\"kpi-title\">Active Accounts</span>\r\n          <span class=\"kpi-value\">{{\r\n            hasBureauData()\r\n              ? displayActiveAccounts\r\n              : creditBureauDetails.totalNoOfActiveLoans\r\n          }}</span>\r\n        </div>\r\n\r\n        <!-- Card 3: Credit Utilization -->\r\n        <div class=\"credit-kpi-card kpi-credit-utilization\">\r\n          <span class=\"kpi-title\">Credit Utilization</span>\r\n          <span class=\"kpi-value\">{{\r\n            hasBureauData()\r\n              ? isNotAvailable(displayCreditUtilization)\r\n                ? \"-\"\r\n                : withPercent(displayCreditUtilization)\r\n              : withPercent(creditBureauDetails.creditUtilization)\r\n          }}</span>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Payment History Section -->\r\n      <div class=\"credit-section payment-history-section\">\r\n        <div class=\"section-header\">\r\n          <mat-icon>trending_up</mat-icon>\r\n          <h4>Payment History</h4>\r\n        </div>\r\n        <div class=\"payment-history-metrics\">\r\n          <div class=\"payment-metric on-time\">\r\n            <span class=\"metric-value\">{{\r\n              hasBureauData()\r\n                ? isNotAvailable(displayOnTimePayments)\r\n                  ? \"-\"\r\n                  : withPercent(displayOnTimePayments)\r\n                : withPercent(creditBureauDetails.paymentHistory.onTimePayments)\r\n            }}</span>\r\n            <span class=\"metric-label\">On-Time Payments</span>\r\n          </div>\r\n          <div class=\"payment-metric delayed\">\r\n            <span class=\"metric-value\">{{\r\n              hasBureauData()\r\n                ? isNotAvailable(displayDelayedPayments)\r\n                  ? \"-\"\r\n                  : withPercent(displayDelayedPayments)\r\n                : withPercent(creditBureauDetails.paymentHistory.delayedPayments)\r\n            }}</span>\r\n            <span class=\"metric-label\">Delayed Payments</span>\r\n          </div>\r\n          <div class=\"payment-metric defaulted\">\r\n            <span class=\"metric-value\">{{\r\n              hasBureauData()\r\n                ? isNotAvailable(displayDefaultedPayments)\r\n                  ? \"-\"\r\n                  : withPercent(displayDefaultedPayments)\r\n                : withPercent(creditBureauDetails.paymentHistory.defaulted)\r\n            }}</span>\r\n            <span class=\"metric-label\">Defaulted</span>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Credit Enquiries Section -->\r\n      <div class=\"credit-section enquiries-section\">\r\n        <div class=\"section-header\">\r\n          <mat-icon>info</mat-icon>\r\n          <h4>Credit Enquiries</h4>\r\n        </div>\r\n        <div class=\"enquiries-chart-wrapper\">\r\n          <uc-bar-chart\r\n            [labels]=\"enquiriesChartLabels\"\r\n            [datasets]=\"enquiriesChartDatasets\"\r\n            [height]=\"200\"\r\n            [showLegend]=\"false\"\r\n            yAxisLabel=\"Enquiries\"\r\n          ></uc-bar-chart>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Loan Details Section -->\r\n      <div class=\"credit-section loan-details-section\">\r\n        <div class=\"section-header\">\r\n          <mat-icon>account_balance</mat-icon>\r\n          <h4>Loan Details</h4>\r\n        </div>\r\n        <div class=\"table-wrapper\">\r\n          <table class=\"credit-loan-table\">\r\n            <thead>\r\n              <tr>\r\n                <th class=\"align-left\">Lender</th>\r\n                <th class=\"align-left\">Loan Type</th>\r\n                <th class=\"align-right\">Sanctioned</th>\r\n                <th class=\"align-right\">Outstanding</th>\r\n                <th class=\"align-right\">DPD</th>\r\n                <th class=\"align-left\">Status</th>\r\n              </tr>\r\n            </thead>\r\n            <tbody>\r\n              @if (hasBureauData() && displayLoanDetails.length > 0) {\r\n                @for (loan of displayLoanDetails; track loan.lender) {\r\n                  <tr>\r\n                    <td class=\"align-left\">{{ loan.lender }}</td>\r\n                    <td class=\"align-left\">{{ loan.loanType }}</td>\r\n                    <td class=\"align-right\">{{ loan.sanctioned }}</td>\r\n                    <td class=\"align-right\">{{ loan.outstanding }}</td>\r\n                    <td\r\n                      class=\"align-right\"\r\n                      [ngClass]=\"\r\n                        !isNotAvailable(loan.dpd) &&\r\n                        getNumericValue(loan.dpd) > 0\r\n                          ? 'text-error'\r\n                          : ''\r\n                      \"\r\n                    >\r\n                      {{ loan.dpd }}\r\n                    </td>\r\n                    <td class=\"align-left\">\r\n                      <span\r\n                        class=\"loan-status-badge\"\r\n                        [ngClass]=\"getLoanStatusClass(loan.status)\"\r\n                        >{{ loan.status }}</span\r\n                      >\r\n                    </td>\r\n                  </tr>\r\n                }\r\n              } @else {\r\n                @for (\r\n                  loan of creditBureauDetails.loanDetails;\r\n                  track loan.lender\r\n                ) {\r\n                  <tr>\r\n                    <td class=\"align-left\">{{ loan.lender }}</td>\r\n                    <td class=\"align-left\">{{ loan.loanType }}</td>\r\n                    <td class=\"align-right\">\r\n                      {{ formatCurrency(loan.sanctioned) }}\r\n                    </td>\r\n                    <td class=\"align-right\">\r\n                      {{ formatCurrency(loan.outstanding) }}\r\n                    </td>\r\n                    <td\r\n                      class=\"align-right\"\r\n                      [ngClass]=\"loan.dpd > 0 ? 'text-error' : ''\"\r\n                    >\r\n                      {{ loan.dpd }}\r\n                    </td>\r\n                    <td class=\"align-left\">\r\n                      <span\r\n                        class=\"loan-status-badge\"\r\n                        [ngClass]=\"getLoanStatusClass(loan.status)\"\r\n                        >{{ loan.status }}</span\r\n                      >\r\n                    </td>\r\n                  </tr>\r\n                }\r\n              }\r\n            </tbody>\r\n          </table>\r\n        </div>\r\n\r\n        <div class=\"loan-type-chart-wrapper\">\r\n          <div class=\"chart-subheader\">Sanctioned vs Outstanding by Loan Type</div>\r\n          <uc-bar-chart\r\n            [labels]=\"loanTypeChartLabels\"\r\n            [datasets]=\"loanTypeChartDatasets\"\r\n            [height]=\"240\"\r\n            [showLegend]=\"true\"\r\n            valueFormat=\"currency\"\r\n          ></uc-bar-chart>\r\n        </div>\r\n      </div>\r\n    } @else {\r\n      <!-- Detailed Bureau Analysis View -->\r\n      <div class=\"bureau-detailed-view\">\r\n        @if (isLoadingBureauDetails) {\r\n          <div class=\"loading-spinner\">\r\n            <mat-icon class=\"spin-icon\">sync</mat-icon>\r\n            <span>Loading detailed analysis...</span>\r\n          </div>\r\n        } @else {\r\n          <markdown [data]=\"bureauDetailedMarkdown\"></markdown>\r\n        }\r\n      </div>\r\n    }\r\n  </mat-card-content>\r\n</mat-card>\r\n","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\nimport { CreditSummary } from '../../../models/loan-summary.model';\r\n\r\n@Component({\r\n  selector: 'uc-credit-assessment',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    MatCardModule,\r\n    MatIconModule,\r\n  ],\r\n  templateUrl: './credit-assessment.component.html',\r\n  styleUrl: './credit-assessment.component.scss',\r\n})\r\nexport class CreditAssessmentComponent {\r\n  @Input() creditSummary!: CreditSummary;\r\n}\r\n","<mat-card class=\"summary-card\">\r\n  <mat-card-header>\r\n    <mat-icon mat-card-avatar>assessment</mat-icon>\r\n    <mat-card-title>Credit Assessment</mat-card-title>\r\n  </mat-card-header>\r\n  <mat-card-content>\r\n    <div class=\"assessment-grid\">\r\n      <div class=\"assessment-card\">\r\n        <h4>Commercial Credit Assessment</h4>\r\n        <div class=\"grade-display\">\r\n          <span class=\"grade\">{{\r\n            creditSummary.commercialCreditAssessmentDetails\r\n              .creditAssessmentGrade\r\n          }}</span>\r\n          <span class=\"score\"\r\n            >Score:\r\n            {{\r\n              creditSummary.commercialCreditAssessmentDetails\r\n                .creditAssessmentScore\r\n            }}</span\r\n          >\r\n        </div>\r\n        <p class=\"remarks\">\r\n          {{\r\n            creditSummary.commercialCreditAssessmentDetails\r\n              .creditAssessmentRemarks\r\n          }}\r\n        </p>\r\n      </div>\r\n      <div class=\"assessment-card\">\r\n        <h4>CRIF Score</h4>\r\n        <div class=\"grade-display\">\r\n          <span class=\"grade\">{{\r\n            creditSummary.crifScoreDetails.crifGrade\r\n          }}</span>\r\n          <span class=\"score\"\r\n            >Score: {{ creditSummary.crifScoreDetails.crifScore }}</span\r\n          >\r\n        </div>\r\n        <p class=\"remarks\">{{ creditSummary.crifScoreDetails.crifRemarks }}</p>\r\n      </div>\r\n    </div>\r\n  </mat-card-content>\r\n</mat-card>\r\n","import {\n  AfterViewInit,\n  Component,\n  ElementRef,\n  Input,\n  OnChanges,\n  OnDestroy,\n  SimpleChanges,\n  ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Chart, registerables } from 'chart.js';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { formatLakhCrore, hideDatalabelOnHover } from '../chart-format.util';\n\nChart.register(...registerables, ChartDataLabels);\n\n/**\n * Single line series (e.g. \"Turnover\").\n */\nexport interface UcLineChartDataset {\n  label: string;\n  data: number[];\n  color?: string;\n  fill?: boolean;\n}\n\nconst DEFAULT_COLORS = ['#2563eb', '#f59e0b', '#16a34a', '#dc2626', '#7c3aed'];\n\n/**\n * Self-contained line chart built directly on top of chart.js (no ng2-charts,\n * no NgModule registration required by the consuming app).\n */\n@Component({\n  selector: 'uc-line-chart',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div class=\"uc-line-chart-wrapper\" [style.height.px]=\"height\">\n      @if (hasData) {\n        <canvas #chartCanvas></canvas>\n      } @else {\n        <div class=\"uc-line-chart-empty\">No data available</div>\n      }\n    </div>\n  `,\n  styleUrl: './line-chart.component.scss',\n})\nexport class UcLineChartComponent implements AfterViewInit, OnChanges, OnDestroy {\n  @Input() labels: string[] = [];\n  @Input() datasets: UcLineChartDataset[] = [];\n  @Input() height = 220;\n  @Input() showLegend = true;\n  @Input() yAxisLabel = '';\n  /** 'currency' renders values as ₹ Lakh/Crore; 'number' shows the raw value. */\n  @Input() valueFormat: 'currency' | 'number' = 'number';\n\n  @ViewChild('chartCanvas') private canvasRef?: ElementRef<HTMLCanvasElement>;\n\n  private chart: Chart | null = null;\n\n  get hasData(): boolean {\n    return this.labels.length > 0 && this.datasets.length > 0;\n  }\n\n  ngAfterViewInit(): void {\n    this.renderChart();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (!changes['labels'] && !changes['datasets']) return;\n    if (this.chart) {\n      this.updateChart();\n    } else {\n      this.renderChart();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.chart?.destroy();\n    this.chart = null;\n  }\n\n  private formatValue = (value: number): string => {\n    return this.valueFormat === 'currency' ? formatLakhCrore(value) : String(value);\n  };\n\n  private buildDatasets() {\n    return this.datasets.map((ds, index) => {\n      const color = ds.color ?? DEFAULT_COLORS[index % DEFAULT_COLORS.length];\n      return {\n        label: ds.label,\n        data: ds.data,\n        borderColor: color,\n        backgroundColor: `${color}33`,\n        fill: ds.fill ?? true,\n        tension: 0.35,\n        pointRadius: 3,\n        pointBackgroundColor: color,\n        pointHoverRadius: 5,\n      };\n    });\n  }\n\n  private renderChart(): void {\n    if (!this.canvasRef?.nativeElement || !this.hasData) return;\n    const ctx = this.canvasRef.nativeElement.getContext('2d');\n    if (!ctx) return;\n\n    this.chart?.destroy();\n    this.chart = new Chart(ctx, {\n      type: 'line',\n      data: {\n        labels: this.labels,\n        datasets: this.buildDatasets(),\n      },\n      options: {\n        responsive: true,\n        maintainAspectRatio: false,\n        plugins: {\n          legend: {\n            display: this.showLegend && this.datasets.length > 1,\n            position: 'bottom',\n            labels: { boxWidth: 12, font: { size: 12 } },\n          },\n          tooltip: {\n            enabled: true,\n            callbacks: {\n              label: (ctx) => `${ctx.dataset.label}: ${this.formatValue(ctx.parsed.y ?? 0)}`,\n            },\n          },\n          datalabels: {\n            display: hideDatalabelOnHover,\n            anchor: 'end',\n            align: 'top',\n            offset: 4,\n            color: '#374151',\n            font: { size: 9, weight: 'bold' },\n            formatter: (value: number) => this.formatValue(value),\n          },\n        },\n        scales: {\n          y: {\n            beginAtZero: true,\n            title: { display: !!this.yAxisLabel, text: this.yAxisLabel },\n            grid: { color: '#f1f5f9' },\n            ticks: { callback: (value) => this.formatValue(Number(value)) },\n          },\n          x: {\n            grid: { display: false },\n          },\n        },\n      },\n    });\n  }\n\n  private updateChart(): void {\n    if (!this.chart) return;\n    this.chart.data.labels = this.labels;\n    this.chart.data.datasets = this.buildDatasets();\n    this.chart.update();\n  }\n}\n","import { Component, Input, Output, EventEmitter, OnChanges, OnInit, SimpleChanges, inject } from '@angular/core';\r\nimport { CommonModule, DatePipe } from '@angular/common';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MarkdownModule } from 'ngx-markdown';\r\n\r\nimport { GstSummary } from '../../../models/loan-summary.model';\r\nimport { GstQuickSummary } from '../../../models/api-response.model';\r\nimport { MOCK_GST_SUMMARY } from '../../../mock-data/gst-mock-data';\r\nimport { LoanSummaryService } from '../../../services/loan-summary.service';\r\nimport { UcLineChartComponent, UcLineChartDataset } from '../../shared/charts/line-chart/line-chart.component';\r\nimport { UcBarChartComponent, UcChartDataset } from '../../shared/charts/bar-chart/bar-chart.component';\r\n\r\n@Component({\r\n  selector: 'uc-gst-summary',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    MatCardModule,\r\n    MatIconModule,\r\n    MatButtonModule,\r\n    MatButtonToggleModule,\r\n    MatTooltipModule,\r\n    MarkdownModule,\r\n    DatePipe,\r\n    UcLineChartComponent,\r\n    UcBarChartComponent,\r\n  ],\r\n  templateUrl: './gst-summary.component.html',\r\n  styleUrl: './gst-summary.component.scss',\r\n})\r\nexport class GstSummaryComponent implements OnInit, OnChanges {\r\n  /** Falls back to demo data only when no gstQuickSummary response is bound */\r\n  @Input() gstSummary: GstSummary = MOCK_GST_SUMMARY;\r\n  @Input() gstViewMode: 'overview' | 'detailed' = 'overview';\r\n  @Input() gstDetailedMarkdown: string = '';\r\n  @Input() isLoadingGstDetails: boolean = false;\r\n  /** Quick summary data from backend API for overview cards */\r\n  @Input() gstQuickSummary: GstQuickSummary | null = null;\r\n  @Output() gstViewModeChange = new EventEmitter<'overview' | 'detailed'>();\r\n\r\n  // Pagination state for GST tables\r\n  monthlyReturnsPageIndex = 0;\r\n  filingHistoryPageIndex = 0;\r\n  readonly itemsPerPage = 5;\r\n\r\n  // Chart data - computed once per input change (not via getters) so\r\n  // chart.js isn't handed a new array reference on every change-detection\r\n  // cycle, which would otherwise keep restarting its render/animation.\r\n  turnoverChartLabels: string[] = [];\r\n  turnoverChartDatasets: UcLineChartDataset[] = [];\r\n  monthlyReturnsChartLabels: string[] = [];\r\n  monthlyReturnsChartDatasets: UcChartDataset[] = [];\r\n\r\n  private loanSummaryService = inject(LoanSummaryService);\r\n\r\n  ngOnInit(): void {\r\n    this.computeChartData();\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['gstSummary']) {\r\n      this.computeChartData();\r\n    }\r\n  }\r\n\r\n  private computeChartData(): void {\r\n    const turnoverTrend = this.gstSummary?.turnoverTrend ?? [];\r\n    this.turnoverChartLabels = turnoverTrend.map((item) => item.month);\r\n    this.turnoverChartDatasets = [\r\n      { label: 'Turnover', data: turnoverTrend.map((item) => item.turnover), color: '#2563eb' },\r\n    ];\r\n\r\n    this.updateMonthlyReturnsChart();\r\n  }\r\n\r\n  /** Keeps the Monthly Returns chart in sync with whatever page the table is showing. */\r\n  private updateMonthlyReturnsChart(): void {\r\n    const pageItems = this.getPaginatedMonthlyReturns();\r\n    this.monthlyReturnsChartLabels = pageItems.map((item) => item.month);\r\n    this.monthlyReturnsChartDatasets = [\r\n      { label: 'Total Sales', data: pageItems.map((item) => item.totalSales), backgroundColor: '#2563eb' },\r\n      { label: 'Total Purchases', data: pageItems.map((item) => item.totalPurchases), backgroundColor: '#f59e0b' },\r\n      { label: 'Total GST Paid', data: pageItems.map((item) => item.totalTaxPaid), backgroundColor: '#16a34a' },\r\n    ];\r\n  }\r\n\r\n  onGstViewModeChange(mode: 'overview' | 'detailed'): void {\r\n    this.gstViewModeChange.emit(mode);\r\n  }\r\n\r\n  formatLakhs(amount: number): string {\r\n    const lakhs = amount / 100000;\r\n    return `₹${lakhs.toFixed(2)}L`;\r\n  }\r\n\r\n  /** True when the backend quick-summary actually returned a usable value (not missing/\"-\"). */\r\n  hasQuickValue(value: string | number | undefined | null): boolean {\r\n    return value !== undefined && value !== null && value !== '-';\r\n  }\r\n\r\n  /** Appends \"%\" unless the value (e.g. from a pre-formatted backend response) already has one. */\r\n  withPercent(value: string | number): string {\r\n    const str = String(value);\r\n    return str.endsWith('%') ? str : `${str}%`;\r\n  }\r\n\r\n  getFilingStatusClass(status: string): string {\r\n    switch (status) {\r\n      case 'Filed':\r\n        return 'status-filed';\r\n      case 'Pending':\r\n        return 'status-pending';\r\n      case 'Delayed':\r\n        return 'status-delayed';\r\n      default:\r\n        return '';\r\n    }\r\n  }\r\n\r\n  // Combined data from turnoverTrend for Monthly Returns table\r\n  getCombinedMonthlyReturnsData(): Array<{\r\n    month: string;\r\n    turnover: number;\r\n    totalSales: number;\r\n    totalPurchases: number;\r\n    totalTaxPaid: number;\r\n  }> {\r\n    const turnoverTrend = this.gstSummary.turnoverTrend || [];\r\n    const monthlyReturns = this.gstSummary.monthlyReturns || [];\r\n\r\n    const returnsMap = new Map(\r\n      monthlyReturns.map((r) => [r.month, r])\r\n    );\r\n\r\n    return turnoverTrend.map((trend) => {\r\n      const returns = returnsMap.get(trend.month);\r\n      return {\r\n        month: trend.month,\r\n        turnover: trend.turnover,\r\n        totalSales: returns?.totalSales || trend.turnover * 0.9,\r\n        totalPurchases: returns?.totalPurchases || trend.turnover * 0.65,\r\n        totalTaxPaid: returns?.totalTaxPaid || trend.turnover * 0.05,\r\n      };\r\n    });\r\n  }\r\n\r\n  // Filing history from turnover trend data\r\n  getCombinedFilingHistoryData(): Array<{\r\n    period: string;\r\n    returnType: string;\r\n    filedDate: string;\r\n    status: 'Filed' | 'Pending' | 'Delayed';\r\n  }> {\r\n    const turnoverTrend = this.gstSummary.turnoverTrend || [];\r\n    const filingHistory = this.gstSummary.filingHistory || [];\r\n\r\n    const historyMap = new Map(\r\n      filingHistory.map((h) => [h.period, h])\r\n    );\r\n\r\n    return turnoverTrend.map((trend, index) => {\r\n      const existing = historyMap.get(trend.month);\r\n      if (existing) {\r\n        return existing;\r\n      }\r\n      return {\r\n        period: trend.month,\r\n        returnType: 'GSTR-3B',\r\n        filedDate: this.generateFilingDate(trend.month),\r\n        status: this.getRandomFilingStatus(index) as 'Filed' | 'Pending' | 'Delayed',\r\n      };\r\n    });\r\n  }\r\n\r\n  private generateFilingDate(month: string): string {\r\n    const parts = month.split('-');\r\n    if (parts.length === 2) {\r\n      const monthNames: { [key: string]: number } = {\r\n        'Jan': 0, 'Feb': 1, 'Mar': 2, 'Apr': 3, 'May': 4, 'Jun': 5,\r\n        'Jul': 6, 'Aug': 7, 'Sep': 8, 'Oct': 9, 'Nov': 10, 'Dec': 11\r\n      };\r\n      const monthNum = monthNames[parts[0]];\r\n      const year = 2000 + parseInt(parts[1], 10);\r\n      const filingDate = new Date(year, monthNum + 1, 20);\r\n      return filingDate.toISOString().split('T')[0];\r\n    }\r\n    return new Date().toISOString().split('T')[0];\r\n  }\r\n\r\n  private getRandomFilingStatus(index: number): string {\r\n    if (index % 7 === 3) return 'Delayed';\r\n    return 'Filed';\r\n  }\r\n\r\n  // Pagination methods for Monthly Returns\r\n  getPaginatedMonthlyReturns(): Array<{\r\n    month: string;\r\n    turnover: number;\r\n    totalSales: number;\r\n    totalPurchases: number;\r\n    totalTaxPaid: number;\r\n  }> {\r\n    const data = this.getCombinedMonthlyReturnsData();\r\n    const start = this.monthlyReturnsPageIndex * this.itemsPerPage;\r\n    return data.slice(start, start + this.itemsPerPage);\r\n  }\r\n\r\n  canGoPrevMonthlyReturns(): boolean {\r\n    return this.monthlyReturnsPageIndex > 0;\r\n  }\r\n\r\n  canGoNextMonthlyReturns(): boolean {\r\n    const data = this.getCombinedMonthlyReturnsData();\r\n    return (this.monthlyReturnsPageIndex + 1) * this.itemsPerPage < data.length;\r\n  }\r\n\r\n  prevMonthlyReturnsPage(): void {\r\n    if (this.canGoPrevMonthlyReturns()) {\r\n      this.monthlyReturnsPageIndex--;\r\n      this.updateMonthlyReturnsChart();\r\n    }\r\n  }\r\n\r\n  nextMonthlyReturnsPage(): void {\r\n    if (this.canGoNextMonthlyReturns()) {\r\n      this.monthlyReturnsPageIndex++;\r\n      this.updateMonthlyReturnsChart();\r\n    }\r\n  }\r\n\r\n  getMonthlyReturnsPaginationInfo(): string {\r\n    const data = this.getCombinedMonthlyReturnsData();\r\n    const start = this.monthlyReturnsPageIndex * this.itemsPerPage + 1;\r\n    const end = Math.min((this.monthlyReturnsPageIndex + 1) * this.itemsPerPage, data.length);\r\n    return `${start}-${end} of ${data.length}`;\r\n  }\r\n\r\n  // Pagination methods for Filing History\r\n  getPaginatedFilingHistory(): Array<{\r\n    period: string;\r\n    returnType: string;\r\n    filedDate: string;\r\n    status: 'Filed' | 'Pending' | 'Delayed';\r\n  }> {\r\n    const data = this.getCombinedFilingHistoryData();\r\n    const start = this.filingHistoryPageIndex * this.itemsPerPage;\r\n    return data.slice(start, start + this.itemsPerPage);\r\n  }\r\n\r\n  canGoPrevFilingHistory(): boolean {\r\n    return this.filingHistoryPageIndex > 0;\r\n  }\r\n\r\n  canGoNextFilingHistory(): boolean {\r\n    const data = this.getCombinedFilingHistoryData();\r\n    return (this.filingHistoryPageIndex + 1) * this.itemsPerPage < data.length;\r\n  }\r\n\r\n  prevFilingHistoryPage(): void {\r\n    if (this.canGoPrevFilingHistory()) {\r\n      this.filingHistoryPageIndex--;\r\n    }\r\n  }\r\n\r\n  nextFilingHistoryPage(): void {\r\n    if (this.canGoNextFilingHistory()) {\r\n      this.filingHistoryPageIndex++;\r\n    }\r\n  }\r\n\r\n  getFilingHistoryPaginationInfo(): string {\r\n    const data = this.getCombinedFilingHistoryData();\r\n    const start = this.filingHistoryPageIndex * this.itemsPerPage + 1;\r\n    const end = Math.min((this.filingHistoryPageIndex + 1) * this.itemsPerPage, data.length);\r\n    return `${start}-${end} of ${data.length}`;\r\n  }\r\n}\r\n","<mat-card class=\"summary-card gst-summary-card\">\r\n  <mat-card-header>\r\n    <mat-icon mat-card-avatar>receipt_long</mat-icon>\r\n    <mat-card-title>GST Summary</mat-card-title>\r\n    <div class=\"gst-view-toggle\">\r\n      <mat-button-toggle-group\r\n        [value]=\"gstViewMode\"\r\n        (change)=\"onGstViewModeChange($event.value)\"\r\n      >\r\n        <mat-button-toggle value=\"overview\">\r\n          <mat-icon>dashboard</mat-icon>\r\n          Overview\r\n        </mat-button-toggle>\r\n        <mat-button-toggle value=\"detailed\">\r\n          <mat-icon>article</mat-icon>\r\n          Detailed Analysis\r\n        </mat-button-toggle>\r\n      </mat-button-toggle-group>\r\n    </div>\r\n  </mat-card-header>\r\n  <mat-card-content>\r\n    @if (gstViewMode === \"overview\") {\r\n      <!-- GST Header Section -->\r\n      <div class=\"gst-header-section\">\r\n        <div class=\"gst-header-left\">\r\n          <span class=\"gst-number-large\">{{\r\n            gstQuickSummary?.gst_number || gstSummary.gstNumber\r\n          }}</span>\r\n          <span class=\"gst-registration-date\"\r\n            >Registered:\r\n            {{\r\n              gstQuickSummary?.registration_date ||\r\n                gstSummary.gstRegistrationDate | date: \"mediumDate\"\r\n            }}</span\r\n          >\r\n        </div>\r\n        <span\r\n          class=\"gst-status-badge\"\r\n          [ngClass]=\"\r\n            (gstQuickSummary?.gst_status || gstSummary.gstStatus) === 'Active'\r\n              ? 'status-active'\r\n              : 'status-inactive'\r\n          \"\r\n        >\r\n          {{ gstQuickSummary?.gst_status || gstSummary.gstStatus }}\r\n        </span>\r\n      </div>\r\n\r\n      <!-- KPI Cards Section - Exactly 3 Cards -->\r\n      <div class=\"gst-kpi-cards\">\r\n        <!-- Card 1: Filing Compliance -->\r\n        <div class=\"gst-kpi-card kpi-compliance\">\r\n          <span class=\"kpi-title\">Filing Compliance</span>\r\n          <span class=\"kpi-value\">{{\r\n            hasQuickValue(gstQuickSummary?.filing_compliance)\r\n              ? withPercent(gstQuickSummary?.filing_compliance ?? \"\")\r\n              : gstQuickSummary?.filing_compliance === \"-\"\r\n                ? \"-\"\r\n                : withPercent(gstSummary.filingCompliance)\r\n          }}</span>\r\n          <span class=\"kpi-subtitle\">Last 12 months</span>\r\n        </div>\r\n\r\n        <!-- Card 2: Avg. Monthly Turnover -->\r\n        <div class=\"gst-kpi-card kpi-turnover\">\r\n          <span class=\"kpi-title\">Avg. Monthly Turnover</span>\r\n          <span class=\"kpi-value\">\r\n            @if (hasQuickValue(gstQuickSummary?.avg_monthly_turnover)) {\r\n              {{ gstQuickSummary?.avg_monthly_turnover }}\r\n            } @else if (gstQuickSummary?.avg_monthly_turnover === \"-\") {\r\n              -\r\n            } @else {\r\n              {{ formatLakhs(gstSummary.avgMonthlyTurnover) }}\r\n            }\r\n          </span>\r\n          <span class=\"kpi-subtitle\">Last 6 months</span>\r\n        </div>\r\n\r\n        <!-- Card 3: Last Filing -->\r\n        <div class=\"gst-kpi-card kpi-filing\">\r\n          <span class=\"kpi-title\">Last Filing</span>\r\n          <span class=\"kpi-value\">{{\r\n            gstQuickSummary?.last_filing_date || gstSummary.lastFilingDate\r\n              | date: \"dd-MMM-yyyy\"\r\n          }}</span>\r\n          <span\r\n            class=\"filing-status-badge\"\r\n            [ngClass]=\"\r\n              (gstQuickSummary?.last_filing_status ||\r\n                gstSummary.lastFilingStatus) === 'On Time'\r\n                ? 'on-time'\r\n                : 'delayed'\r\n            \"\r\n          >\r\n            {{\r\n              gstQuickSummary?.last_filing_status || gstSummary.lastFilingStatus\r\n            }}\r\n          </span>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Additional KPI Cards - quick-summary response when available, mock data otherwise -->\r\n      <div class=\"gst-kpi-cards gst-kpi-additional\">\r\n        <!-- Card: Total Sales -->\r\n        <div class=\"gst-kpi-card kpi-sales\">\r\n          <span class=\"kpi-title\">Total Sales</span>\r\n          <span class=\"kpi-value\">{{\r\n            hasQuickValue(gstQuickSummary?.total_sales)\r\n              ? gstQuickSummary?.total_sales\r\n              : gstQuickSummary?.total_sales === \"-\"\r\n                ? \"-\"\r\n                : formatLakhs(gstSummary.totalSales)\r\n          }}</span>\r\n        </div>\r\n\r\n        <!-- Card: Total Purchases -->\r\n        <div class=\"gst-kpi-card kpi-purchases\">\r\n          <span class=\"kpi-title\">Total Purchases</span>\r\n          <span class=\"kpi-value\">{{\r\n            hasQuickValue(gstQuickSummary?.total_purchases)\r\n              ? gstQuickSummary?.total_purchases\r\n              : gstQuickSummary?.total_purchases === \"-\"\r\n                ? \"-\"\r\n                : formatLakhs(gstSummary.totalPurchases)\r\n          }}</span>\r\n        </div>\r\n\r\n        <!-- Card: Total Tax Paid -->\r\n        <div class=\"gst-kpi-card kpi-tax\">\r\n          <span class=\"kpi-title\">Total Tax Paid</span>\r\n          <span class=\"kpi-value\">{{\r\n            hasQuickValue(gstQuickSummary?.total_tax_paid)\r\n              ? gstQuickSummary?.total_tax_paid\r\n              : gstQuickSummary?.total_tax_paid === \"-\"\r\n                ? \"-\"\r\n                : formatLakhs(gstSummary.totalTaxPaid)\r\n          }}</span>\r\n        </div>\r\n\r\n        <!-- Card: YoY Sales Growth -->\r\n        <div class=\"gst-kpi-card kpi-growth\">\r\n          <span class=\"kpi-title\">YoY Sales Growth</span>\r\n          <span class=\"kpi-value\">{{\r\n            hasQuickValue(gstQuickSummary?.yoy_sales_growth)\r\n              ? gstQuickSummary?.yoy_sales_growth\r\n              : gstQuickSummary?.yoy_sales_growth === \"-\"\r\n                ? \"-\"\r\n                : gstSummary.yoySalesGrowth + \"%\"\r\n          }}</span>\r\n        </div>\r\n\r\n        <!-- Card: MoM Sales Growth -->\r\n        <div class=\"gst-kpi-card kpi-growth\">\r\n          <span class=\"kpi-title\">MoM Sales Growth</span>\r\n          <span class=\"kpi-value\">{{\r\n            hasQuickValue(gstQuickSummary?.mom_sales_growth)\r\n              ? gstQuickSummary?.mom_sales_growth\r\n              : gstQuickSummary?.mom_sales_growth === \"-\"\r\n                ? \"-\"\r\n                : gstSummary.momSalesGrowth + \"%\"\r\n          }}</span>\r\n        </div>\r\n\r\n        <!-- Card: Total Tax Collected -->\r\n        <div class=\"gst-kpi-card kpi-tax\">\r\n          <span class=\"kpi-title\">Total Tax Collected</span>\r\n          <span class=\"kpi-value\">{{\r\n            hasQuickValue(gstQuickSummary?.total_tax_collected)\r\n              ? gstQuickSummary?.total_tax_collected\r\n              : gstQuickSummary?.total_tax_collected === \"-\"\r\n                ? \"-\"\r\n                : formatLakhs(gstSummary.totalTaxCollected)\r\n          }}</span>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Turnover Trend Section -->\r\n      <div class=\"gst-turnover-trend\">\r\n        <div class=\"section-header\">\r\n          <mat-icon>show_chart</mat-icon>\r\n          <h4>Turnover Trend (Last 15 Months)</h4>\r\n        </div>\r\n        <div class=\"trend-chart-container\">\r\n          <uc-line-chart\r\n            [labels]=\"turnoverChartLabels\"\r\n            [datasets]=\"turnoverChartDatasets\"\r\n            [height]=\"240\"\r\n            [showLegend]=\"false\"\r\n            yAxisLabel=\"Turnover (₹)\"\r\n            valueFormat=\"currency\"\r\n          ></uc-line-chart>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Monthly Returns Summary Section -->\r\n      <div class=\"gst-monthly-returns\">\r\n        <div class=\"section-header\">\r\n          <mat-icon>table_chart</mat-icon>\r\n          <h4>Monthly Returns Summary</h4>\r\n        </div>\r\n        <div class=\"monthly-returns-chart-wrapper\">\r\n          <uc-bar-chart\r\n            [labels]=\"monthlyReturnsChartLabels\"\r\n            [datasets]=\"monthlyReturnsChartDatasets\"\r\n            [height]=\"240\"\r\n            [showLegend]=\"true\"\r\n            valueFormat=\"currency\"\r\n          ></uc-bar-chart>\r\n        </div>\r\n        <div class=\"table-wrapper\">\r\n          <table class=\"gst-table monthly-returns-table\">\r\n            <thead>\r\n              <tr>\r\n                <th class=\"align-left\">Month</th>\r\n                <th class=\"align-right\">Turnover</th>\r\n                <th class=\"align-right\">Sales</th>\r\n                <th class=\"align-right\">Purchases</th>\r\n                <th class=\"align-right\">GST Paid</th>\r\n              </tr>\r\n            </thead>\r\n            <tbody>\r\n              @for (item of getPaginatedMonthlyReturns(); track item.month) {\r\n                <tr>\r\n                  <td class=\"align-left month-bold\">{{ item.month }}</td>\r\n                  <td class=\"align-right\">{{ formatLakhs(item.turnover) }}</td>\r\n                  <td class=\"align-right\">\r\n                    {{ formatLakhs(item.totalSales) }}\r\n                  </td>\r\n                  <td class=\"align-right\">\r\n                    {{ formatLakhs(item.totalPurchases) }}\r\n                  </td>\r\n                  <td class=\"align-right\">\r\n                    {{ formatLakhs(item.totalTaxPaid) }}\r\n                  </td>\r\n                </tr>\r\n              }\r\n            </tbody>\r\n          </table>\r\n        </div>\r\n        <!-- Pagination Controls -->\r\n        <div class=\"table-pagination\">\r\n          <button\r\n            mat-icon-button\r\n            (click)=\"prevMonthlyReturnsPage()\"\r\n            [disabled]=\"!canGoPrevMonthlyReturns()\"\r\n            class=\"pagination-btn\"\r\n            matTooltip=\"Previous\"\r\n          >\r\n            <mat-icon>chevron_left</mat-icon>\r\n          </button>\r\n          <span class=\"pagination-info\">{{\r\n            getMonthlyReturnsPaginationInfo()\r\n          }}</span>\r\n          <button\r\n            mat-icon-button\r\n            (click)=\"nextMonthlyReturnsPage()\"\r\n            [disabled]=\"!canGoNextMonthlyReturns()\"\r\n            class=\"pagination-btn\"\r\n            matTooltip=\"Next\"\r\n          >\r\n            <mat-icon>chevron_right</mat-icon>\r\n          </button>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Recent Filing History Section -->\r\n      <div class=\"gst-filing-history\">\r\n        <div class=\"section-header\">\r\n          <mat-icon>info</mat-icon>\r\n          <h4>Recent Filing History</h4>\r\n        </div>\r\n        <div class=\"table-wrapper\">\r\n          <table class=\"gst-table filing-history-table\">\r\n            <thead>\r\n              <tr>\r\n                <th class=\"align-left\">Period</th>\r\n                <th class=\"align-left\">Return Type</th>\r\n                <th class=\"align-left\">Filed Date</th>\r\n                <th class=\"align-left\">Status</th>\r\n              </tr>\r\n            </thead>\r\n            <tbody>\r\n              @for (item of getPaginatedFilingHistory(); track item.period) {\r\n                <tr>\r\n                  <td class=\"align-left period-bold\">{{ item.period }}</td>\r\n                  <td class=\"align-left\">{{ item.returnType }}</td>\r\n                  <td class=\"align-left\">\r\n                    {{ item.filedDate | date: \"dd-MMM-yyyy\" }}\r\n                  </td>\r\n                  <td class=\"align-left\">\r\n                    <span\r\n                      class=\"filing-history-badge\"\r\n                      [ngClass]=\"getFilingStatusClass(item.status)\"\r\n                    >\r\n                      {{ item.status }}\r\n                    </span>\r\n                  </td>\r\n                </tr>\r\n              }\r\n            </tbody>\r\n          </table>\r\n        </div>\r\n        <!-- Pagination Controls -->\r\n        <div class=\"table-pagination\">\r\n          <button\r\n            mat-icon-button\r\n            (click)=\"prevFilingHistoryPage()\"\r\n            [disabled]=\"!canGoPrevFilingHistory()\"\r\n            class=\"pagination-btn\"\r\n            matTooltip=\"Previous\"\r\n          >\r\n            <mat-icon>chevron_left</mat-icon>\r\n          </button>\r\n          <span class=\"pagination-info\">{{\r\n            getFilingHistoryPaginationInfo()\r\n          }}</span>\r\n          <button\r\n            mat-icon-button\r\n            (click)=\"nextFilingHistoryPage()\"\r\n            [disabled]=\"!canGoNextFilingHistory()\"\r\n            class=\"pagination-btn\"\r\n            matTooltip=\"Next\"\r\n          >\r\n            <mat-icon>chevron_right</mat-icon>\r\n          </button>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- More Details Link -->\r\n      <div class=\"gst-more-details\">\r\n        <button\r\n          mat-stroked-button\r\n          color=\"primary\"\r\n          (click)=\"onGstViewModeChange('detailed')\"\r\n        >\r\n          <mat-icon>open_in_new</mat-icon>\r\n          More Details\r\n        </button>\r\n      </div>\r\n    } @else {\r\n      <!-- Detailed GST Analysis View -->\r\n      <div class=\"gst-detailed-view\">\r\n        @if (isLoadingGstDetails) {\r\n          <div class=\"loading-container\">\r\n            <mat-icon class=\"loading-spinner\">sync</mat-icon>\r\n            <span>Loading detailed analysis...</span>\r\n          </div>\r\n        } @else {\r\n          <div\r\n            class=\"markdown-wrapper\"\r\n            style=\"\r\n              padding: 16px;\r\n              box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\r\n              border-radius: 8px;\r\n            \"\r\n          >\r\n            <markdown\r\n              [data]=\"gstDetailedMarkdown\"\r\n              class=\"markdown-content\"\r\n            ></markdown>\r\n          </div>\r\n        }\r\n      </div>\r\n    }\r\n  </mat-card-content>\r\n</mat-card>\r\n","import {\n  AfterViewInit,\n  Component,\n  ElementRef,\n  Input,\n  OnChanges,\n  OnDestroy,\n  SimpleChanges,\n  ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Chart, registerables } from 'chart.js';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { formatLakhCrore, hideDatalabelOnHover } from '../chart-format.util';\n\nChart.register(...registerables, ChartDataLabels);\n\n/**\n * One slice of the pie (e.g. \"Total Liabilities\").\n */\nexport interface UcPieChartSlice {\n  label: string;\n  value: number;\n  color?: string;\n}\n\nconst DEFAULT_COLORS = ['#2563eb', '#f59e0b', '#16a34a', '#dc2626', '#7c3aed'];\n\n/**\n * Self-contained pie chart built directly on top of chart.js (no ng2-charts,\n * no NgModule registration required by the consuming app).\n */\n@Component({\n  selector: 'uc-pie-chart',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div class=\"uc-pie-chart-wrapper\" [style.height.px]=\"height\">\n      @if (hasData) {\n        <canvas #chartCanvas></canvas>\n      } @else {\n        <div class=\"uc-pie-chart-empty\">No data available</div>\n      }\n    </div>\n  `,\n  styleUrl: './pie-chart.component.scss',\n})\nexport class UcPieChartComponent implements AfterViewInit, OnChanges, OnDestroy {\n  @Input() slices: UcPieChartSlice[] = [];\n  @Input() height = 240;\n  @Input() showLegend = true;\n  /** 'currency' renders values as ₹ Lakh/Crore; 'number' shows the raw value. */\n  @Input() valueFormat: 'currency' | 'number' = 'number';\n\n  @ViewChild('chartCanvas') private canvasRef?: ElementRef<HTMLCanvasElement>;\n\n  private chart: Chart | null = null;\n\n  get hasData(): boolean {\n    return this.slices.length > 0 && this.slices.some((s) => s.value > 0);\n  }\n\n  ngAfterViewInit(): void {\n    this.renderChart();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (!changes['slices']) return;\n    if (this.chart) {\n      this.updateChart();\n    } else {\n      this.renderChart();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.chart?.destroy();\n    this.chart = null;\n  }\n\n  private formatValue = (value: number): string => {\n    return this.valueFormat === 'currency' ? formatLakhCrore(value) : String(value);\n  };\n\n  private buildColors(): string[] {\n    return this.slices.map((slice, index) => slice.color ?? DEFAULT_COLORS[index % DEFAULT_COLORS.length]);\n  }\n\n  private renderChart(): void {\n    if (!this.canvasRef?.nativeElement || !this.hasData) return;\n    const ctx = this.canvasRef.nativeElement.getContext('2d');\n    if (!ctx) return;\n\n    this.chart?.destroy();\n    this.chart = new Chart(ctx, {\n      type: 'pie',\n      data: {\n        labels: this.slices.map((s) => s.label),\n        datasets: [\n          {\n            data: this.slices.map((s) => s.value),\n            backgroundColor: this.buildColors(),\n            borderColor: '#ffffff',\n            borderWidth: 2,\n          },\n        ],\n      },\n      options: {\n        responsive: true,\n        maintainAspectRatio: false,\n        plugins: {\n          legend: {\n            display: this.showLegend,\n            position: 'bottom',\n            labels: { boxWidth: 12, font: { size: 12 } },\n          },\n          tooltip: {\n            enabled: true,\n            callbacks: {\n              label: (ctx) => `${ctx.label}: ${this.formatValue(Number(ctx.parsed))}`,\n            },\n          },\n          datalabels: {\n            display: hideDatalabelOnHover,\n            color: '#ffffff',\n            font: { size: 12, weight: 'bold' },\n            formatter: (value: number) => this.formatValue(value),\n          },\n        },\n      },\n    });\n  }\n\n  private updateChart(): void {\n    if (!this.chart) return;\n    this.chart.data.labels = this.slices.map((s) => s.label);\n    this.chart.data.datasets[0].data = this.slices.map((s) => s.value);\n    this.chart.data.datasets[0].backgroundColor = this.buildColors();\n    this.chart.update();\n  }\n}\n","import { Component, Input, Output, EventEmitter, inject, OnChanges, OnInit, SimpleChanges } from '@angular/core';\r\nimport { CommonModule, DecimalPipe } from '@angular/common';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MarkdownModule } from 'ngx-markdown';\r\n\r\nimport { BalanceSheetSummary } from '../../../models/loan-summary.model';\r\nimport { FinancialQuickSummary } from '../../../models/api-response.model';\r\nimport { LoanSummaryService } from '../../../services/loan-summary.service';\r\nimport { MOCK_BALANCE_SHEET_SUMMARY } from '../../../mock-data/balance-sheet-mock-data';\r\nimport { UcPieChartComponent, UcPieChartSlice } from '../../shared/charts/pie-chart/pie-chart.component';\r\n\r\n@Component({\r\n  selector: 'uc-balance-sheet',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    MatCardModule,\r\n    MatIconModule,\r\n    MatButtonToggleModule,\r\n    MarkdownModule,\r\n    DecimalPipe,\r\n    UcPieChartComponent,\r\n  ],\r\n  templateUrl: './balance-sheet.component.html',\r\n  styleUrl: './balance-sheet.component.scss',\r\n})\r\nexport class BalanceSheetComponent implements OnInit, OnChanges {\r\n  /** Falls back to demo data only when no financialQuickSummary response is bound */\r\n  @Input() balanceSheetSummary: BalanceSheetSummary = MOCK_BALANCE_SHEET_SUMMARY;\r\n  @Input() financialViewMode: 'overview' | 'detailed' = 'overview';\r\n  @Input() financialDetailedMarkdown: string = '';\r\n  @Input() isLoadingFinancialDetails: boolean = false;\r\n  /** Quick summary data from backend API for overview cards */\r\n  @Input() financialQuickSummary: FinancialQuickSummary | null = null;\r\n  @Output() financialViewModeChange = new EventEmitter<'overview' | 'detailed'>();\r\n\r\n  // Chart data - computed once per input change (not via a getter) so\r\n  // chart.js isn't handed a new array reference on every change-detection\r\n  // cycle, which would otherwise keep restarting its render/animation.\r\n  pieChartSlices: UcPieChartSlice[] = [];\r\n\r\n  private loanSummaryService = inject(LoanSummaryService);\r\n\r\n  ngOnInit(): void {\r\n    this.computePieChartData();\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['balanceSheetSummary'] || changes['financialQuickSummary']) {\r\n      this.computePieChartData();\r\n    }\r\n  }\r\n\r\n  private computePieChartData(): void {\r\n    this.pieChartSlices = [\r\n      { label: 'Total Liabilities', value: this.getEffectiveNumericValue('total_liabilities', this.balanceSheetSummary?.totalLiabilities), color: '#dc2626' },\r\n      { label: 'Net Worth', value: this.getEffectiveNumericValue('net_worth', this.balanceSheetSummary?.netWorth), color: '#2563eb' },\r\n    ];\r\n  }\r\n\r\n  /**\r\n   * Prefers the numeric quick-summary field from the backend (which may be a\r\n   * formatted currency string like \"₹61.18 Lakh\"); falls back to the typed\r\n   * model field otherwise.\r\n   */\r\n  private getEffectiveNumericValue(quickSummaryKey: keyof FinancialQuickSummary, fallback: number | undefined): number {\r\n    const quickValue = this.financialQuickSummary?.[quickSummaryKey];\r\n    if (quickValue !== undefined && quickValue !== null && quickValue !== '-') {\r\n      return this.loanSummaryService.parseAmountToNumber(quickValue);\r\n    }\r\n    return fallback ?? 0;\r\n  }\r\n\r\n  onFinancialViewModeChange(mode: 'overview' | 'detailed'): void {\r\n    this.financialViewModeChange.emit(mode);\r\n  }\r\n\r\n  formatCurrency(amount: number): string {\r\n    return this.loanSummaryService.formatCurrency(amount);\r\n  }\r\n\r\n  /** A percentage ratio stored as a decimal (0.1449 -> \"14.49%\"). */\r\n  formatPercent(ratioAsDecimal: number): string {\r\n    return `${(ratioAsDecimal * 100).toFixed(2)}%`;\r\n  }\r\n\r\n  /** True when the backend quick-summary actually returned a usable value (not missing/\"-\"). */\r\n  hasFinancialValue(value: string | number | undefined | null): boolean {\r\n    return value !== undefined && value !== null && value !== '-';\r\n  }\r\n\r\n  getEffectiveNetProfit(): number {\r\n    return this.getEffectiveNumericValue('net_profit', this.balanceSheetSummary?.netProfit);\r\n  }\r\n}\r\n","<mat-card class=\"summary-card financial-summary-card\">\r\n  <mat-card-header>\r\n    <mat-icon mat-card-avatar>account_balance</mat-icon>\r\n    <mat-card-title>Balance Sheet / Financial Statement</mat-card-title>\r\n    <div class=\"view-mode-toggle\">\r\n      <mat-button-toggle-group\r\n        [value]=\"financialViewMode\"\r\n        (change)=\"onFinancialViewModeChange($event.value)\"\r\n        class=\"compact-toggle\"\r\n      >\r\n        <mat-button-toggle value=\"overview\">Overview</mat-button-toggle>\r\n        <mat-button-toggle value=\"detailed\"\r\n          >Detailed Analysis</mat-button-toggle\r\n        >\r\n      </mat-button-toggle-group>\r\n    </div>\r\n  </mat-card-header>\r\n  <mat-card-content>\r\n    @if (financialViewMode === \"overview\") {\r\n      <div class=\"balance-sheet-layout\">\r\n      <div class=\"bs-left\">\r\n      <div class=\"balance-sheet-grid\">\r\n        <div class=\"bs-card assets\">\r\n          <mat-icon>trending_up</mat-icon>\r\n          <span class=\"bs-label\">Total Assets</span>\r\n          <span class=\"bs-value\">{{\r\n            financialQuickSummary?.total_assets &&\r\n            financialQuickSummary?.total_assets !== \"-\"\r\n              ? financialQuickSummary?.total_assets\r\n              : financialQuickSummary?.total_assets === \"-\"\r\n                ? \"-\"\r\n                : formatCurrency(balanceSheetSummary.totalAssets)\r\n          }}</span>\r\n        </div>\r\n        <div class=\"bs-card liabilities\">\r\n          <mat-icon>trending_down</mat-icon>\r\n          <span class=\"bs-label\">Total Liabilities</span>\r\n          <span class=\"bs-value\">{{\r\n            financialQuickSummary?.total_liabilities &&\r\n            financialQuickSummary?.total_liabilities !== \"-\"\r\n              ? financialQuickSummary?.total_liabilities\r\n              : financialQuickSummary?.total_liabilities === \"-\"\r\n                ? \"-\"\r\n                : formatCurrency(balanceSheetSummary.totalLiabilities)\r\n          }}</span>\r\n        </div>\r\n        <div class=\"bs-card networth\">\r\n          <mat-icon>account_balance_wallet</mat-icon>\r\n          <span class=\"bs-label\">Net Worth</span>\r\n          <span class=\"bs-value\">{{\r\n            financialQuickSummary?.net_worth &&\r\n            financialQuickSummary?.net_worth !== \"-\"\r\n              ? financialQuickSummary?.net_worth\r\n              : financialQuickSummary?.net_worth === \"-\"\r\n                ? \"-\"\r\n                : formatCurrency(balanceSheetSummary.netWorth)\r\n          }}</span>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Additional Financial KPIs - quick-summary response when available, mock data otherwise -->\r\n      <div class=\"balance-sheet-grid financial-kpi-grid\">\r\n        <div class=\"bs-card revenue\">\r\n          <mat-icon>attach_money</mat-icon>\r\n          <span class=\"bs-label\">Total Revenue</span>\r\n          <span class=\"bs-value\">{{\r\n            hasFinancialValue(financialQuickSummary?.total_revenue)\r\n              ? financialQuickSummary?.total_revenue\r\n              : financialQuickSummary?.total_revenue === \"-\"\r\n                ? \"-\"\r\n                : formatCurrency(balanceSheetSummary.totalRevenue)\r\n          }}</span>\r\n        </div>\r\n        <div class=\"bs-card profit\">\r\n          <mat-icon>account_balance</mat-icon>\r\n          <span class=\"bs-label\">Gross Profit</span>\r\n          <span class=\"bs-value\">{{\r\n            hasFinancialValue(financialQuickSummary?.gross_profit)\r\n              ? financialQuickSummary?.gross_profit\r\n              : financialQuickSummary?.gross_profit === \"-\"\r\n                ? \"-\"\r\n                : formatCurrency(balanceSheetSummary.grossProfit)\r\n          }}</span>\r\n        </div>\r\n        <div\r\n          class=\"bs-card net-profit\"\r\n          [ngClass]=\"{ negative: getEffectiveNetProfit() < 0 }\"\r\n        >\r\n          <mat-icon>{{\r\n            getEffectiveNetProfit() < 0 ? \"trending_down\" : \"trending_up\"\r\n          }}</mat-icon>\r\n          <span class=\"bs-label\">Net Profit</span>\r\n          <span class=\"bs-value\">{{\r\n            hasFinancialValue(financialQuickSummary?.net_profit)\r\n              ? financialQuickSummary?.net_profit\r\n              : financialQuickSummary?.net_profit === \"-\"\r\n                ? \"-\"\r\n                : formatCurrency(balanceSheetSummary.netProfit)\r\n          }}</span>\r\n        </div>\r\n        <div class=\"bs-card operating\">\r\n          <mat-icon>work</mat-icon>\r\n          <span class=\"bs-label\">Operating Profit</span>\r\n          <span class=\"bs-value\">{{\r\n            hasFinancialValue(financialQuickSummary?.operating_profit)\r\n              ? financialQuickSummary?.operating_profit\r\n              : financialQuickSummary?.operating_profit === \"-\"\r\n                ? \"-\"\r\n                : formatCurrency(balanceSheetSummary.operatingProfit)\r\n          }}</span>\r\n        </div>\r\n        <div class=\"bs-card working-capital\">\r\n          <mat-icon>savings</mat-icon>\r\n          <span class=\"bs-label\">Working Capital</span>\r\n          <span class=\"bs-value\">{{\r\n            hasFinancialValue(financialQuickSummary?.working_capital)\r\n              ? financialQuickSummary?.working_capital\r\n              : financialQuickSummary?.working_capital === \"-\"\r\n                ? \"-\"\r\n                : formatCurrency(balanceSheetSummary.workingCapital)\r\n          }}</span>\r\n        </div>\r\n        <div class=\"bs-card interest-coverage\">\r\n          <mat-icon>percent</mat-icon>\r\n          <span class=\"bs-label\">Interest Coverage Ratio</span>\r\n          <span class=\"bs-value\">{{\r\n            hasFinancialValue(financialQuickSummary?.interest_coverage_ratio)\r\n              ? financialQuickSummary?.interest_coverage_ratio\r\n              : financialQuickSummary?.interest_coverage_ratio === \"-\"\r\n                ? \"-\"\r\n                : (balanceSheetSummary.interestCoverageRatio | number: \"1.2-2\")\r\n          }}</span>\r\n        </div>\r\n      </div>\r\n\r\n      <div class=\"ratios-section\">\r\n        <h4>Financial Ratios</h4>\r\n        <div class=\"ratio-items\">\r\n          <div class=\"ratio-item\">\r\n            <span class=\"ratio-name\">Current Ratio</span>\r\n            <span\r\n              class=\"ratio-value\"\r\n              [ngClass]=\"\r\n                financialQuickSummary?.current_ratio &&\r\n                financialQuickSummary?.current_ratio !== '-'\r\n                  ? +(financialQuickSummary?.current_ratio || 0) >= 1.5\r\n                    ? 'text-success'\r\n                    : 'text-warning'\r\n                  : balanceSheetSummary.currentRatio >= 1.5\r\n                    ? 'text-success'\r\n                    : 'text-warning'\r\n              \"\r\n            >\r\n              {{\r\n                financialQuickSummary?.current_ratio &&\r\n                financialQuickSummary?.current_ratio !== \"-\"\r\n                  ? financialQuickSummary?.current_ratio\r\n                  : financialQuickSummary?.current_ratio === \"-\"\r\n                    ? \"-\"\r\n                    : (balanceSheetSummary.currentRatio | number: \"1.2-2\")\r\n              }}\r\n            </span>\r\n          </div>\r\n          <div class=\"ratio-item\">\r\n            <span class=\"ratio-name\">Debt-Equity Ratio</span>\r\n            <span\r\n              class=\"ratio-value\"\r\n              [ngClass]=\"\r\n                financialQuickSummary?.debt_equity_ratio &&\r\n                financialQuickSummary?.debt_equity_ratio !== '-'\r\n                  ? +(financialQuickSummary?.debt_equity_ratio || 0) <= 2\r\n                    ? 'text-success'\r\n                    : 'text-warning'\r\n                  : balanceSheetSummary.debtEquityRatio <= 2\r\n                    ? 'text-success'\r\n                    : 'text-warning'\r\n              \"\r\n            >\r\n              {{\r\n                financialQuickSummary?.debt_equity_ratio &&\r\n                financialQuickSummary?.debt_equity_ratio !== \"-\"\r\n                  ? financialQuickSummary?.debt_equity_ratio\r\n                  : financialQuickSummary?.debt_equity_ratio === \"-\"\r\n                    ? \"-\"\r\n                    : (balanceSheetSummary.debtEquityRatio | number: \"1.2-2\")\r\n              }}\r\n            </span>\r\n          </div>\r\n          <div class=\"ratio-item\">\r\n            <span class=\"ratio-name\">Return on Equity</span>\r\n            <span class=\"ratio-value\">{{\r\n              hasFinancialValue(financialQuickSummary?.return_on_equity)\r\n                ? financialQuickSummary?.return_on_equity\r\n                : financialQuickSummary?.return_on_equity === \"-\"\r\n                  ? \"-\"\r\n                  : formatPercent(balanceSheetSummary.returnOnEquity)\r\n            }}</span>\r\n          </div>\r\n          <div class=\"ratio-item\">\r\n            <span class=\"ratio-name\">Return on Assets</span>\r\n            <span class=\"ratio-value\">{{\r\n              hasFinancialValue(financialQuickSummary?.return_on_assets)\r\n                ? financialQuickSummary?.return_on_assets\r\n                : financialQuickSummary?.return_on_assets === \"-\"\r\n                  ? \"-\"\r\n                  : formatPercent(balanceSheetSummary.returnOnAssets)\r\n            }}</span>\r\n          </div>\r\n        </div>\r\n      </div>\r\n      </div>\r\n\r\n      <div class=\"bs-right\">\r\n        <div class=\"chart-subheader\">Total Assets Composition</div>\r\n        <uc-pie-chart [slices]=\"pieChartSlices\" [height]=\"260\" valueFormat=\"currency\"></uc-pie-chart>\r\n      </div>\r\n      </div>\r\n    } @else {\r\n      <!-- Financial Detailed View (AI Generated) -->\r\n      @if (isLoadingFinancialDetails) {\r\n        <div class=\"loading-details\">\r\n          <mat-icon class=\"spin-icon\">sync</mat-icon>\r\n          <span>Loading detailed Financial Statement analysis...</span>\r\n        </div>\r\n      } @else {\r\n        <div\r\n          class=\"markdown-wrapper\"\r\n          style=\"\r\n            padding: 16px;\r\n            box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\r\n            border-radius: 8px;\r\n          \"\r\n        >\r\n          <markdown\r\n            [data]=\"financialDetailedMarkdown\"\r\n            class=\"markdown-content\"\r\n          ></markdown>\r\n        </div>\r\n      }\r\n    }\r\n  </mat-card-content>\r\n</mat-card>\r\n","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\n\r\nimport { RiskAssessmentRating, CorpositoryDetails } from '../../../models/loan-summary.model';\r\n\r\n@Component({\r\n  selector: 'uc-risk-assessment',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    MatCardModule,\r\n    MatIconModule,\r\n    MatDividerModule,\r\n  ],\r\n  templateUrl: './risk-assessment.component.html',\r\n  styleUrl: './risk-assessment.component.scss',\r\n})\r\nexport class RiskAssessmentComponent {\r\n  @Input() riskAssessmentRating!: RiskAssessmentRating;\r\n  @Input() corpositoryDetails!: CorpositoryDetails;\r\n}\r\n","<mat-card class=\"summary-card\">\r\n  <mat-card-header>\r\n    <mat-icon mat-card-avatar>warning</mat-icon>\r\n    <mat-card-title>Risk Assessment Rating</mat-card-title>\r\n  </mat-card-header>\r\n  <mat-card-content>\r\n    <div class=\"risk-grid\">\r\n      <div class=\"risk-card\">\r\n        <h5>ICRA Rating</h5>\r\n        <span class=\"risk-grade\">{{\r\n          riskAssessmentRating.icraRiskAssessmentDetails.riskGrade\r\n        }}</span>\r\n        <span class=\"risk-score\"\r\n          >Score:\r\n          {{ riskAssessmentRating.icraRiskAssessmentDetails.riskScore }}</span\r\n        >\r\n        <p>{{ riskAssessmentRating.icraRiskAssessmentDetails.riskRemarks }}</p>\r\n      </div>\r\n      <div class=\"risk-card\">\r\n        <h5>CRISIL Score</h5>\r\n        <span class=\"risk-grade\">{{ riskAssessmentRating.crisilScore }}</span>\r\n      </div>\r\n      <div class=\"risk-card\">\r\n        <h5>Risk Assessment</h5>\r\n        <span class=\"risk-grade\">{{\r\n          riskAssessmentRating.riskAssessmentDetails.riskGrade\r\n        }}</span>\r\n        <span class=\"risk-score\"\r\n          >Score:\r\n          {{ riskAssessmentRating.riskAssessmentDetails.riskScore }}</span\r\n        >\r\n        <p>{{ riskAssessmentRating.riskAssessmentDetails.riskRemarks }}</p>\r\n      </div>\r\n      <div class=\"risk-card\">\r\n        <h5>CRANK Checker</h5>\r\n        <span class=\"risk-grade\">{{\r\n          riskAssessmentRating.crankCheckerDetails.crankGrade\r\n        }}</span>\r\n        <span class=\"risk-score\"\r\n          >Score:\r\n          {{ riskAssessmentRating.crankCheckerDetails.crankScore }}</span\r\n        >\r\n        <p>{{ riskAssessmentRating.crankCheckerDetails.crankRemarks }}</p>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Corpository -->\r\n    <mat-divider></mat-divider>\r\n    <div class=\"corpository-section\">\r\n      <h4>Corpository Details</h4>\r\n      <div class=\"corp-info\">\r\n        <span class=\"corp-grade\">{{\r\n          corpositoryDetails.corpositoryGrade\r\n        }}</span>\r\n        <span class=\"corp-score\"\r\n          >Score: {{ corpositoryDetails.corpositoryScore }}</span\r\n        >\r\n      </div>\r\n      <p>{{ corpositoryDetails.corpositoryRemarks }}</p>\r\n    </div>\r\n  </mat-card-content>\r\n</mat-card>\r\n","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\nimport { EwsDashboard } from '../../../models/loan-summary.model';\r\n\r\n@Component({\r\n  selector: 'uc-ews-dashboard',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    MatCardModule,\r\n    MatIconModule,\r\n  ],\r\n  templateUrl: './ews-dashboard.component.html',\r\n  styleUrl: './ews-dashboard.component.scss',\r\n})\r\nexport class EwsDashboardComponent {\r\n  @Input() ewsDashboard!: EwsDashboard;\r\n}\r\n","<mat-card class=\"summary-card\">\r\n  <mat-card-header>\r\n    <mat-icon mat-card-avatar>notifications_active</mat-icon>\r\n    <mat-card-title>Early Warning Signals Dashboard</mat-card-title>\r\n  </mat-card-header>\r\n  <mat-card-content>\r\n    <div\r\n      class=\"ews-display\"\r\n      [ngClass]=\"\r\n        'ews-' + ewsDashboard.earlyWarningSignals.ewsGrade.toLowerCase()\r\n      \"\r\n    >\r\n      <div class=\"ews-indicator\">\r\n        <mat-icon>{{\r\n          ewsDashboard.earlyWarningSignals.ewsGrade === \"Green\"\r\n            ? \"check_circle\"\r\n            : ewsDashboard.earlyWarningSignals.ewsGrade === \"Yellow\"\r\n              ? \"warning\"\r\n              : \"error\"\r\n        }}</mat-icon>\r\n        <span class=\"ews-grade\">{{\r\n          ewsDashboard.earlyWarningSignals.ewsGrade\r\n        }}</span>\r\n      </div>\r\n      <div class=\"ews-details\">\r\n        <span class=\"ews-score\"\r\n          >Score: {{ ewsDashboard.earlyWarningSignals.ewsScore }}</span\r\n        >\r\n        <p class=\"ews-remarks\">\r\n          {{ ewsDashboard.earlyWarningSignals.ewsRemarks }}\r\n        </p>\r\n      </div>\r\n    </div>\r\n  </mat-card-content>\r\n</mat-card>\r\n","/**\r\n * UC-UI Library - Section Components\r\n * \r\n * Individual section components for the Loan Summary view.\r\n * Each section displays specific loan/borrower information.\r\n * \r\n * @module uc-ui/components/sections\r\n */\r\n\r\n// Go/No-Go Decision Section\r\nexport { GoNoGoDecisionComponent } from './go-nogo-decision/go-nogo-decision.component';\r\n\r\n// Borrower Information Section\r\nexport { BorrowerInfoComponent } from './borrower-info/borrower-info.component';\r\n\r\n// Risk Rating Section\r\nexport { RiskRatingComponent } from './risk-rating/risk-rating.component';\r\n\r\n// Director Information Section\r\nexport { DirectorInfoComponent } from './director-info/director-info.component';\r\n\r\n// Loan Facility Section\r\nexport { LoanFacilityComponent } from './loan-facility/loan-facility.component';\r\n\r\n// Credit Bureau Section\r\nexport { CreditBureauComponent } from './credit-bureau/credit-bureau.component';\r\n\r\n// Credit Assessment Section\r\nexport { CreditAssessmentComponent } from './credit-assessment/credit-assessment.component';\r\n\r\n// GST Summary Section\r\nexport { GstSummaryComponent } from './gst-summary/gst-summary.component';\r\n\r\n// Balance Sheet Section\r\nexport { BalanceSheetComponent } from './balance-sheet/balance-sheet.component';\r\n\r\n// Risk Assessment Section\r\nexport { RiskAssessmentComponent } from './risk-assessment/risk-assessment.component';\r\n\r\n// EWS Dashboard Section\r\nexport { EwsDashboardComponent } from './ews-dashboard/ews-dashboard.component';\r\n","/**\r\n * @fileoverview AI Settings Panel Component\r\n * @description A comprehensive settings panel for configuring AI inference parameters,\r\n * RAG configuration, document type selection, and prompt templates. Designed as a\r\n * side panel that can be integrated into the loan summary workflow.\r\n * \r\n * @module uc-ui/components/shared/ai-settings-panel\r\n * @requires @angular/core\r\n * @requires @angular/common\r\n * @requires @angular/forms\r\n * @requires @angular/material\r\n */\r\n\r\nimport { Component, Input, Output, EventEmitter, ViewChild, ElementRef, OnInit, OnChanges, SimpleChanges, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSliderModule } from '@angular/material/slider';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { LoanSummaryService } from '../../../services/loan-summary.service';\r\n\r\n/**\r\n * Interface representing the AI settings panel configuration data\r\n * @interface AiSettingsPanelData\r\n */\r\nexport interface AiSettingsPanelData {\r\n  /** Selected LLM model for inference */\r\n  selectedModel: string;\r\n  /** Custom prompt template */\r\n  promptTemplate: string;\r\n  /** Chunk size for document splitting (RAG) */\r\n  chunkSize: number;\r\n  /** Overlap between consecutive chunks */\r\n  chunkOverlap: number;\r\n  /** Number of top similar chunks to retrieve */\r\n  topK: number;\r\n  /** Embedding model for vector representation */\r\n  embeddingModel: string;\r\n  /** Search type (similarity, mmr, hybrid) */\r\n  searchType: string;\r\n  /** Vector store backend (pgvector, inmemory) */\r\n  vectorStore: string;\r\n  /** Whether GST analysis is selected */\r\n  selectedGst: boolean;\r\n  /** Whether Bureau analysis is selected */\r\n  selectedBureau: boolean;\r\n  /** Whether Financial analysis is selected */\r\n  selectedFinancial: boolean;\r\n  /** GST-specific prompt template */\r\n  gstPromptTemplate: string;\r\n  /** Bureau-specific prompt template */\r\n  bureauPromptTemplate: string;\r\n  /** Financial-specific prompt template */\r\n  financialPromptTemplate: string;\r\n}\r\n\r\n/**\r\n * Interface for tracking prompt history items\r\n * @interface PromptHistoryItem\r\n */\r\nexport interface PromptHistoryItem {\r\n  /** The prompt template content */\r\n  template: string;\r\n  /** ISO timestamp when the prompt was saved */\r\n  timestamp: string;\r\n  /** Source of the prompt (typed manually or uploaded from file) */\r\n  source: 'typed' | 'uploaded';\r\n}\r\n\r\n/**\r\n * AI Settings Panel Component\r\n * \r\n * @description Provides a comprehensive UI for configuring AI model settings,\r\n * RAG parameters, and prompt templates. Supports document type selection,\r\n * prompt history, and file upload functionality.\r\n * \r\n * @example\r\n * ```html\r\n * <uc-ai-settings-panel\r\n *   (closePanel)=\"onPanelClose()\"\r\n *   (settingsSaved)=\"onSettingsSaved($event)\"\r\n *   (settingsReset)=\"onSettingsReset()\">\r\n * </uc-ai-settings-panel>\r\n * ```\r\n */\r\n@Component({\r\n  selector: 'uc-ai-settings-panel',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    FormsModule,\r\n    MatButtonModule,\r\n    MatIconModule,\r\n    MatInputModule,\r\n    MatFormFieldModule,\r\n    MatSelectModule,\r\n    MatSliderModule,\r\n    MatTooltipModule,\r\n  ],\r\n  templateUrl: './ai-settings-panel.component.html',\r\n  styleUrl: './ai-settings-panel.component.scss',\r\n})\r\nexport class AiSettingsPanelComponent implements OnInit, OnChanges {\r\n  // Document availability inputs (based on proposal.documents)\r\n  /** Whether GST document is available in the proposal */\r\n  @Input() hasGstDocument = false;\r\n  \r\n  /** Whether Bureau document is available in the proposal */\r\n  @Input() hasBureauDocument = false;\r\n  \r\n  /** Whether Financial document is available in the proposal */\r\n  @Input() hasFinancialDocument = false;\r\n\r\n  /** Event emitted when the panel is closed */\r\n  @Output() closePanel = new EventEmitter<void>();\r\n  \r\n  /** Event emitted when settings are saved successfully */\r\n  @Output() settingsSaved = new EventEmitter<AiSettingsPanelData>();\r\n  \r\n  /** Event emitted when settings are reset to defaults */\r\n  @Output() settingsReset = new EventEmitter<void>();\r\n\r\n  /** Reference to GST prompt file input element */\r\n  @ViewChild('gstPromptFileInput') gstPromptFileInput!: ElementRef<HTMLInputElement>;\r\n  \r\n  /** Reference to Bureau prompt file input element */\r\n  @ViewChild('bureauPromptFileInput') bureauPromptFileInput!: ElementRef<HTMLInputElement>;\r\n  \r\n  /** Reference to Financial prompt file input element */\r\n  @ViewChild('financialPromptFileInput') financialPromptFileInput!: ElementRef<HTMLInputElement>;\r\n\r\n  /** Injected loan summary service for state management */\r\n  private readonly loanSummaryService = inject(LoanSummaryService);\r\n\r\n  // Model settings\r\n  /** Available LLM models for selection */\r\n  availableModels: string[] = [\r\n    'llama3.2:3b',\r\n    'mistral:7b',\r\n    'qwen3.5:latest',\r\n    'gemma4:latest',\r\n    'deepseek-r1:latest'\r\n  ];\r\n  \r\n  /** Currently selected LLM model */\r\n  selectedModel = 'gemma4:latest';\r\n  \r\n  /** Custom prompt template */\r\n  promptTemplate = '';\r\n\r\n  // RAG Configuration State\r\n  /** Chunk size for document splitting */\r\n  chunkSize = 1000;\r\n  \r\n  /** Overlap between consecutive chunks */\r\n  chunkOverlap = 150;\r\n  \r\n  /** Number of top similar chunks to retrieve */\r\n  topK = 15;\r\n\r\n  /** Available embedding models */\r\n  availableEmbeddingModels: string[] = ['embeddinggemma:300m', 'all-minilm'];\r\n  \r\n  /** Currently selected embedding model */\r\n  selectedEmbeddingModel = 'embeddinggemma:300m';\r\n\r\n  /** Available search types with labels */\r\n  availableSearchTypes: Array<{ value: string; label: string }> = [\r\n    { value: 'similarity', label: 'Similarity Search' },\r\n    { value: 'mmr', label: 'Max Marginal Relevance' },\r\n    { value: 'hybrid', label: 'Hybrid Search - Similarity + BM25' }\r\n  ];\r\n  \r\n  /** Currently selected search type */\r\n  selectedSearchType = 'hybrid';\r\n\r\n  /** Available vector store backends */\r\n  availableVectorStores: Array<{ value: string; label: string }> = [\r\n    { value: 'pgvector', label: 'PG Vector' },\r\n    { value: 'inmemory', label: 'InMemoryVector' },\r\n  ];\r\n  \r\n  /** Currently selected vector store */\r\n  selectedVectorStore = 'pgvector';\r\n\r\n  // Document type selection\r\n  /** Whether GST analysis is selected */\r\n  selectedGst = true;\r\n  \r\n  /** Whether Bureau analysis is selected */\r\n  selectedBureau = false;\r\n  \r\n  /** Whether Financial analysis is selected */\r\n  selectedFinancial = false;\r\n\r\n  // Prompt templates\r\n  /** GST-specific prompt template */\r\n  gstPromptTemplate = '';\r\n  \r\n  /** Bureau-specific prompt template */\r\n  bureauPromptTemplate = '';\r\n  \r\n  /** Financial-specific prompt template */\r\n  financialPromptTemplate = '';\r\n\r\n  // Prompt history\r\n  /** History of GST prompt templates */\r\n  gstPromptHistory: PromptHistoryItem[] = [];\r\n  \r\n  /** History of Bureau prompt templates */\r\n  bureauPromptHistory: PromptHistoryItem[] = [];\r\n  \r\n  /** History of Financial prompt templates */\r\n  financialPromptHistory: PromptHistoryItem[] = [];\r\n  \r\n  /** Whether GST prompt history is expanded */\r\n  showGstPromptHistory = false;\r\n  \r\n  /** Whether Bureau prompt history is expanded */\r\n  showBureauPromptHistory = false;\r\n  \r\n  /** Whether Financial prompt history is expanded */\r\n  showFinancialPromptHistory = false;\r\n\r\n  // Storage keys\r\n  private readonly settingsStorageKey = 'uc-ui.aiSettings.v1';\r\n  private readonly gstHistoryStorageKey = 'uc-ui.aiSettings.gstPromptHistory';\r\n  private readonly bureauHistoryStorageKey = 'uc-ui.aiSettings.bureauPromptHistory';\r\n  private readonly financialHistoryStorageKey = 'uc-ui.aiSettings.financialPromptHistory';\r\n\r\n  // Backup state for cancel functionality\r\n  private backupSelectedModel = 'gemma4:latest';\r\n  private backupPromptTemplate = '';\r\n  private backupChunkSize = 1000;\r\n  private backupChunkOverlap = 150;\r\n  private backupTopK = 15;\r\n  private backupSelectedEmbeddingModel = 'embeddinggemma:300m';\r\n  private backupSelectedSearchType = 'hybrid';\r\n  private backupSelectedVectorStore = 'pgvector';\r\n  private backupSelectedGst = true;\r\n  private backupSelectedBureau = false;\r\n  private backupSelectedFinancial = false;\r\n  private backupGstPromptTemplate = '';\r\n  private backupBureauPromptTemplate = '';\r\n  private backupFinancialPromptTemplate = '';\r\n\r\n  /** Default GST prompt template */\r\n  readonly defaultGstPromptTemplate = `\r\nCredit underwriter summary for \r\n1. Detailed profile and GST report analysis\r\n2. ITC Utilization pattern\r\n3. Customer and supplier risk assessment\r\n4. Fraud & Compliance risk assessment\r\n5. Concentration Risk Assessment\r\n6. Financial Health indicators\r\n7. Underwriter Recommendation\r\n8. Final Recommendation\r\nNote: Don't include the document number in the response\r\n`;\r\n\r\n  /** Default Bureau prompt template */\r\n  readonly defaultBureauPromptTemplate = `Generate in detailed CIBIL summary along with the profile`;\r\n\r\n  /** Default Financial prompt template */\r\n  readonly defaultFinancialPromptTemplate = `Generate a comprehensive Financial Statement analysis covering:\r\n1. Balance Sheet Analysis - Assets, Liabilities, and Equity breakdown\r\n2. Income Statement Review - Revenue, Expenses, and Profitability trends\r\n3. Cash Flow Analysis - Operating, Investing, and Financing activities\r\n4. Key Financial Ratios - Liquidity, Solvency, Profitability, and Efficiency ratios\r\n5. Working Capital Assessment\r\n6. Debt Analysis and Coverage Ratios\r\n7. Year-over-Year Comparison and Trends\r\n8. Financial Health Indicators and Risk Flags\r\n9. Recommendations for Credit Assessment\r\nNote: Focus on data-driven insights relevant for credit underwriting decisions.`;\r\n\r\n  ngOnInit(): void {\r\n    this.loadPromptHistories();\r\n    // Set initial checkbox selections based on document availability\r\n    this.initializeDocumentSelections();\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    // React when document availability inputs change\r\n    if (changes['hasGstDocument'] || changes['hasBureauDocument'] || changes['hasFinancialDocument']) {\r\n      this.initializeDocumentSelections();\r\n      console.log('[AI-SETTINGS-PANEL] Document availability changed:', {\r\n        gst: this.hasGstDocument,\r\n        bureau: this.hasBureauDocument,\r\n        financial: this.hasFinancialDocument,\r\n        selectedGst: this.selectedGst,\r\n        selectedBureau: this.selectedBureau,\r\n        selectedFinancial: this.selectedFinancial\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Initialize checkbox selections based on document availability\r\n   * All available documents should be selected by default\r\n   */\r\n  private initializeDocumentSelections(): void {\r\n    this.selectedGst = this.hasGstDocument;\r\n    this.selectedBureau = this.hasBureauDocument;\r\n    this.selectedFinancial = this.hasFinancialDocument;\r\n    \r\n    // Update backups as well\r\n    this.backupSelectedGst = this.selectedGst;\r\n    this.backupSelectedBureau = this.selectedBureau;\r\n    this.backupSelectedFinancial = this.selectedFinancial;\r\n  }\r\n\r\n  /**\r\n   * Initialize the panel with current settings from the service\r\n   * Should be called when the panel is opened\r\n   */\r\n  initializeSettings(): void {\r\n    // Sync settings from the service\r\n    this.selectedModel = this.loanSummaryService.selectedModel;\r\n    this.chunkSize = this.loanSummaryService.chunk_size;\r\n    this.chunkOverlap = this.loanSummaryService.chunk_overlap;\r\n    this.topK = this.loanSummaryService.top_k;\r\n    this.selectedEmbeddingModel = this.loanSummaryService.embedding_model;\r\n    this.selectedSearchType = this.loanSummaryService.search_type;\r\n    this.selectedVectorStore = this.loanSummaryService.storage_type;\r\n    \r\n    // Set selections based on document availability - all available documents checked by default\r\n    this.selectedGst = this.hasGstDocument;\r\n    this.selectedBureau = this.hasBureauDocument;\r\n    this.selectedFinancial = this.hasFinancialDocument;\r\n\r\n    // Sync prompt templates from service\r\n    if (this.loanSummaryService.gstPromptTemplate) {\r\n      this.gstPromptTemplate = this.loanSummaryService.gstPromptTemplate;\r\n    }\r\n    if (this.loanSummaryService.bureauPromptTemplate) {\r\n      this.bureauPromptTemplate = this.loanSummaryService.bureauPromptTemplate;\r\n    }\r\n    if (this.loanSummaryService.financialPromptTemplate) {\r\n      this.financialPromptTemplate = this.loanSummaryService.financialPromptTemplate;\r\n    }\r\n\r\n    // Create backup for cancel functionality\r\n    this.createBackup();\r\n  }\r\n\r\n  private createBackup(): void {\r\n    this.backupSelectedModel = this.selectedModel;\r\n    this.backupPromptTemplate = this.promptTemplate;\r\n    this.backupChunkSize = this.chunkSize;\r\n    this.backupChunkOverlap = this.chunkOverlap;\r\n    this.backupTopK = this.topK;\r\n    this.backupSelectedEmbeddingModel = this.selectedEmbeddingModel;\r\n    this.backupSelectedSearchType = this.selectedSearchType;\r\n    this.backupSelectedVectorStore = this.selectedVectorStore;\r\n    this.backupSelectedGst = this.selectedGst;\r\n    this.backupSelectedBureau = this.selectedBureau;\r\n    this.backupSelectedFinancial = this.selectedFinancial;\r\n    this.backupGstPromptTemplate = this.gstPromptTemplate;\r\n    this.backupBureauPromptTemplate = this.bureauPromptTemplate;\r\n    this.backupFinancialPromptTemplate = this.financialPromptTemplate;\r\n  }\r\n\r\n  private restoreBackup(): void {\r\n    this.selectedModel = this.backupSelectedModel;\r\n    this.promptTemplate = this.backupPromptTemplate;\r\n    this.chunkSize = this.backupChunkSize;\r\n    this.chunkOverlap = this.backupChunkOverlap;\r\n    this.topK = this.backupTopK;\r\n    this.selectedEmbeddingModel = this.backupSelectedEmbeddingModel;\r\n    this.selectedSearchType = this.backupSelectedSearchType;\r\n    this.selectedVectorStore = this.backupSelectedVectorStore;\r\n    this.selectedGst = this.backupSelectedGst;\r\n    this.selectedBureau = this.backupSelectedBureau;\r\n    this.selectedFinancial = this.backupSelectedFinancial;\r\n    this.gstPromptTemplate = this.backupGstPromptTemplate;\r\n    this.bureauPromptTemplate = this.backupBureauPromptTemplate;\r\n    this.financialPromptTemplate = this.backupFinancialPromptTemplate;\r\n  }\r\n\r\n  /**\r\n   * Handle panel close - restores backup and emits close event\r\n   */\r\n  onClose(): void {\r\n    this.restoreBackup();\r\n    this.closePanel.emit();\r\n  }\r\n\r\n  /**\r\n   * Save all settings to localStorage and sync with service\r\n   */\r\n  saveSettings(): void {\r\n    // Validate prompts\r\n    if (this.selectedGst && !this.gstPromptTemplate?.trim()) {\r\n      alert('GST prompt template cannot be empty when GST is selected.');\r\n      return;\r\n    }\r\n    if (this.selectedBureau && !this.bureauPromptTemplate?.trim()) {\r\n      alert('Bureau prompt template cannot be empty when Bureau is selected.');\r\n      return;\r\n    }\r\n    if (this.selectedFinancial && !this.financialPromptTemplate?.trim()) {\r\n      alert('Financial prompt template cannot be empty when Financial Statement is selected.');\r\n      return;\r\n    }\r\n\r\n    const settings: AiSettingsPanelData = {\r\n      selectedModel: this.selectedModel,\r\n      promptTemplate: this.promptTemplate,\r\n      chunkSize: this.chunkSize,\r\n      chunkOverlap: this.chunkOverlap,\r\n      topK: this.topK,\r\n      embeddingModel: this.selectedEmbeddingModel,\r\n      searchType: this.selectedSearchType,\r\n      vectorStore: this.selectedVectorStore,\r\n      selectedGst: this.selectedGst,\r\n      selectedBureau: this.selectedBureau,\r\n      selectedFinancial: this.selectedFinancial,\r\n      gstPromptTemplate: this.gstPromptTemplate,\r\n      bureauPromptTemplate: this.bureauPromptTemplate,\r\n      financialPromptTemplate: this.financialPromptTemplate\r\n    };\r\n\r\n    try {\r\n      localStorage.setItem(this.settingsStorageKey, JSON.stringify(settings));\r\n\r\n      // Save prompts to history\r\n      if (this.selectedGst && this.gstPromptTemplate?.trim()) {\r\n        this.addToGstPromptHistory(this.gstPromptTemplate, 'typed');\r\n      }\r\n      if (this.selectedBureau && this.bureauPromptTemplate?.trim()) {\r\n        this.addToBureauPromptHistory(this.bureauPromptTemplate, 'typed');\r\n      }\r\n      if (this.selectedFinancial && this.financialPromptTemplate?.trim()) {\r\n        this.addToFinancialPromptHistory(this.financialPromptTemplate, 'typed');\r\n      }\r\n\r\n      // Update backup\r\n      this.createBackup();\r\n\r\n      // Sync to service\r\n      this.loanSummaryService.selectedModel = this.selectedModel;\r\n      this.loanSummaryService.chunk_size = this.chunkSize;\r\n      this.loanSummaryService.chunk_overlap = this.chunkOverlap;\r\n      this.loanSummaryService.top_k = this.topK;\r\n      this.loanSummaryService.embedding_model = this.selectedEmbeddingModel;\r\n      this.loanSummaryService.search_type = this.selectedSearchType;\r\n      this.loanSummaryService.storage_type = this.selectedVectorStore;\r\n      this.loanSummaryService.selectedGst = this.selectedGst;\r\n      this.loanSummaryService.selectedBureau = this.selectedBureau;\r\n      this.loanSummaryService.selectedFinancial = this.selectedFinancial;\r\n      this.loanSummaryService.gstPromptTemplate = this.gstPromptTemplate;\r\n      this.loanSummaryService.bureauPromptTemplate = this.bureauPromptTemplate;\r\n      this.loanSummaryService.financialPromptTemplate = this.financialPromptTemplate;\r\n\r\n      this.settingsSaved.emit(settings);\r\n\r\n      console.log('AI settings saved to cache.');\r\n    } catch (e) {\r\n      console.error('Failed to save settings to localStorage:', e);\r\n      alert('Failed to save settings. Please try again.');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Reset all settings to default values\r\n   */\r\n  resetSettings(): void {\r\n    this.selectedModel = 'llama3.2:3b';\r\n    this.promptTemplate = '';\r\n    this.chunkSize = 500;\r\n    this.chunkOverlap = 100;\r\n    this.topK = 10;\r\n    this.selectedEmbeddingModel = 'embeddinggemma:300m';\r\n    this.selectedSearchType = 'similarity';\r\n    this.selectedVectorStore = 'inmemory';\r\n\r\n    this.createBackup();\r\n\r\n    try {\r\n      localStorage.removeItem(this.settingsStorageKey);\r\n      console.log('AI settings reset to defaults.');\r\n    } catch (e) {\r\n      console.error('Failed to clear settings from localStorage:', e);\r\n    }\r\n\r\n    this.settingsReset.emit();\r\n  }\r\n\r\n  /**\r\n   * Format slider label for display\r\n   */\r\n  formatSliderLabel(value: number): string {\r\n    return `${value}`;\r\n  }\r\n\r\n  // ========== Document Type Toggle Methods ==========\r\n\r\n  toggleGstSelection(): void {\r\n    if (this.selectedGst && !this.selectedBureau && !this.selectedFinancial) {\r\n      return;\r\n    }\r\n    this.selectedGst = !this.selectedGst;\r\n  }\r\n\r\n  toggleBureauSelection(): void {\r\n    if (this.selectedBureau && !this.selectedGst && !this.selectedFinancial) {\r\n      return;\r\n    }\r\n    this.selectedBureau = !this.selectedBureau;\r\n  }\r\n\r\n  toggleFinancialSelection(): void {\r\n    if (this.selectedFinancial && !this.selectedGst && !this.selectedBureau) {\r\n      return;\r\n    }\r\n    this.selectedFinancial = !this.selectedFinancial;\r\n\r\n    if (this.selectedFinancial && !this.financialPromptTemplate?.trim()) {\r\n      this.financialPromptTemplate = this.defaultFinancialPromptTemplate;\r\n    }\r\n  }\r\n\r\n  // ========== Default Prompt Template Methods ==========\r\n\r\n  loadDefaultGstPromptTemplate(): void {\r\n    this.gstPromptTemplate = this.defaultGstPromptTemplate;\r\n  }\r\n\r\n  loadDefaultBureauPromptTemplate(): void {\r\n    this.bureauPromptTemplate = this.defaultBureauPromptTemplate;\r\n  }\r\n\r\n  loadDefaultFinancialPromptTemplate(): void {\r\n    this.financialPromptTemplate = this.defaultFinancialPromptTemplate;\r\n  }\r\n\r\n  // ========== File Upload Methods ==========\r\n\r\n  triggerGstPromptFileUpload(): void {\r\n    this.gstPromptFileInput?.nativeElement?.click();\r\n  }\r\n\r\n  triggerBureauPromptFileUpload(): void {\r\n    this.bureauPromptFileInput?.nativeElement?.click();\r\n  }\r\n\r\n  triggerFinancialPromptFileUpload(): void {\r\n    this.financialPromptFileInput?.nativeElement?.click();\r\n  }\r\n\r\n  onGstPromptFileUpload(event: Event): void {\r\n    this.handleFileUpload(event, 'gst');\r\n  }\r\n\r\n  onBureauPromptFileUpload(event: Event): void {\r\n    this.handleFileUpload(event, 'bureau');\r\n  }\r\n\r\n  onFinancialPromptFileUpload(event: Event): void {\r\n    this.handleFileUpload(event, 'financial');\r\n  }\r\n\r\n  private handleFileUpload(event: Event, type: 'gst' | 'bureau' | 'financial'): void {\r\n    const input = event.target as HTMLInputElement;\r\n    const file = input.files?.[0];\r\n\r\n    if (!file) return;\r\n\r\n    if (!file.name.toLowerCase().endsWith('.txt')) {\r\n      alert('Please upload a .txt file.');\r\n      input.value = '';\r\n      return;\r\n    }\r\n\r\n    const maxSizeBytes = 1 * 1024 * 1024;\r\n    if (file.size > maxSizeBytes) {\r\n      alert('File size exceeds 1 MB limit.');\r\n      input.value = '';\r\n      return;\r\n    }\r\n\r\n    const reader = new FileReader();\r\n    reader.onload = () => {\r\n      const content = reader.result as string;\r\n      if (content && content.trim()) {\r\n        switch (type) {\r\n          case 'gst':\r\n            this.gstPromptTemplate = content.trim();\r\n            this.addToGstPromptHistory(this.gstPromptTemplate, 'uploaded');\r\n            break;\r\n          case 'bureau':\r\n            this.bureauPromptTemplate = content.trim();\r\n            this.addToBureauPromptHistory(this.bureauPromptTemplate, 'uploaded');\r\n            break;\r\n          case 'financial':\r\n            this.financialPromptTemplate = content.trim();\r\n            this.addToFinancialPromptHistory(this.financialPromptTemplate, 'uploaded');\r\n            break;\r\n        }\r\n        console.log(`${type.toUpperCase()} Prompt template loaded from file.`);\r\n      } else {\r\n        alert('The uploaded file is empty.');\r\n      }\r\n    };\r\n    reader.onerror = () => {\r\n      alert('Failed to read file.');\r\n    };\r\n    reader.readAsText(file);\r\n    input.value = '';\r\n  }\r\n\r\n  // ========== Prompt History Methods ==========\r\n\r\n  private loadPromptHistories(): void {\r\n    this.loadGstPromptHistory();\r\n    this.loadBureauPromptHistory();\r\n    this.loadFinancialPromptHistory();\r\n  }\r\n\r\n  toggleGstPromptHistory(): void {\r\n    this.showGstPromptHistory = !this.showGstPromptHistory;\r\n  }\r\n\r\n  toggleBureauPromptHistory(): void {\r\n    this.showBureauPromptHistory = !this.showBureauPromptHistory;\r\n  }\r\n\r\n  toggleFinancialPromptHistory(): void {\r\n    this.showFinancialPromptHistory = !this.showFinancialPromptHistory;\r\n  }\r\n\r\n  private loadGstPromptHistory(): void {\r\n    try {\r\n      const cached = localStorage.getItem(this.gstHistoryStorageKey);\r\n      if (cached) {\r\n        this.gstPromptHistory = JSON.parse(cached);\r\n      }\r\n    } catch (e) {\r\n      console.error('Failed to load GST prompt history:', e);\r\n      this.gstPromptHistory = [];\r\n    }\r\n  }\r\n\r\n  private loadBureauPromptHistory(): void {\r\n    try {\r\n      const cached = localStorage.getItem(this.bureauHistoryStorageKey);\r\n      if (cached) {\r\n        this.bureauPromptHistory = JSON.parse(cached);\r\n      }\r\n    } catch (e) {\r\n      console.error('Failed to load Bureau prompt history:', e);\r\n      this.bureauPromptHistory = [];\r\n    }\r\n  }\r\n\r\n  private loadFinancialPromptHistory(): void {\r\n    try {\r\n      const cached = localStorage.getItem(this.financialHistoryStorageKey);\r\n      if (cached) {\r\n        this.financialPromptHistory = JSON.parse(cached);\r\n      }\r\n    } catch (e) {\r\n      console.error('Failed to load Financial prompt history:', e);\r\n      this.financialPromptHistory = [];\r\n    }\r\n  }\r\n\r\n  addToGstPromptHistory(template: string, source: 'typed' | 'uploaded'): void {\r\n    if (template === this.defaultGstPromptTemplate) return;\r\n    if (this.gstPromptHistory.length > 0 && this.gstPromptHistory[0].template === template) return;\r\n\r\n    const newEntry: PromptHistoryItem = {\r\n      template: template,\r\n      timestamp: new Date().toISOString(),\r\n      source: source\r\n    };\r\n\r\n    this.gstPromptHistory = [newEntry, ...this.gstPromptHistory.filter(h => h.template !== template)].slice(0, 10);\r\n\r\n    try {\r\n      localStorage.setItem(this.gstHistoryStorageKey, JSON.stringify(this.gstPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to save GST prompt history:', e);\r\n    }\r\n  }\r\n\r\n  addToBureauPromptHistory(template: string, source: 'typed' | 'uploaded'): void {\r\n    if (template === this.defaultBureauPromptTemplate) return;\r\n    if (this.bureauPromptHistory.length > 0 && this.bureauPromptHistory[0].template === template) return;\r\n\r\n    const newEntry: PromptHistoryItem = {\r\n      template: template,\r\n      timestamp: new Date().toISOString(),\r\n      source: source\r\n    };\r\n\r\n    this.bureauPromptHistory = [newEntry, ...this.bureauPromptHistory.filter(h => h.template !== template)].slice(0, 10);\r\n\r\n    try {\r\n      localStorage.setItem(this.bureauHistoryStorageKey, JSON.stringify(this.bureauPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to save Bureau prompt history:', e);\r\n    }\r\n  }\r\n\r\n  addToFinancialPromptHistory(template: string, source: 'typed' | 'uploaded'): void {\r\n    if (template === this.defaultFinancialPromptTemplate) return;\r\n    if (this.financialPromptHistory.length > 0 && this.financialPromptHistory[0].template === template) return;\r\n\r\n    const newEntry: PromptHistoryItem = {\r\n      template: template,\r\n      timestamp: new Date().toISOString(),\r\n      source: source\r\n    };\r\n\r\n    this.financialPromptHistory = [newEntry, ...this.financialPromptHistory.filter(h => h.template !== template)].slice(0, 10);\r\n\r\n    try {\r\n      localStorage.setItem(this.financialHistoryStorageKey, JSON.stringify(this.financialPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to save Financial prompt history:', e);\r\n    }\r\n  }\r\n\r\n  selectGstFromHistory(historyItem: PromptHistoryItem): void {\r\n    this.gstPromptTemplate = historyItem.template;\r\n    this.showGstPromptHistory = false;\r\n  }\r\n\r\n  selectBureauFromHistory(historyItem: PromptHistoryItem): void {\r\n    this.bureauPromptTemplate = historyItem.template;\r\n    this.showBureauPromptHistory = false;\r\n  }\r\n\r\n  selectFinancialFromHistory(historyItem: PromptHistoryItem): void {\r\n    this.financialPromptTemplate = historyItem.template;\r\n    this.showFinancialPromptHistory = false;\r\n  }\r\n\r\n  deleteGstFromHistory(index: number, event: Event): void {\r\n    event.stopPropagation();\r\n    this.gstPromptHistory.splice(index, 1);\r\n    try {\r\n      localStorage.setItem(this.gstHistoryStorageKey, JSON.stringify(this.gstPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to update GST prompt history:', e);\r\n    }\r\n  }\r\n\r\n  deleteBureauFromHistory(index: number, event: Event): void {\r\n    event.stopPropagation();\r\n    this.bureauPromptHistory.splice(index, 1);\r\n    try {\r\n      localStorage.setItem(this.bureauHistoryStorageKey, JSON.stringify(this.bureauPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to update Bureau prompt history:', e);\r\n    }\r\n  }\r\n\r\n  deleteFinancialFromHistory(index: number, event: Event): void {\r\n    event.stopPropagation();\r\n    this.financialPromptHistory.splice(index, 1);\r\n    try {\r\n      localStorage.setItem(this.financialHistoryStorageKey, JSON.stringify(this.financialPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to update Financial prompt history:', e);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Format history date for display\r\n   */\r\n  formatHistoryDate(timestamp: string): string {\r\n    const date = new Date(timestamp);\r\n    return date.toLocaleDateString('en-US', {\r\n      month: 'short',\r\n      day: 'numeric',\r\n      year: 'numeric',\r\n      hour: '2-digit',\r\n      minute: '2-digit'\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Get preview text for prompt history items\r\n   */\r\n  getPromptPreview(template: string): string {\r\n    return template.length > 80 ? template.substring(0, 80) + '...' : template;\r\n  }\r\n}\r\n","<!-- Settings Panel Content -->\r\n<div class=\"settings-panel\">\r\n  <div class=\"settings-header\">\r\n    <h3>\r\n      <mat-icon>settings</mat-icon>\r\n      AI Settings\r\n    </h3>\r\n    <button mat-icon-button (click)=\"onClose()\" matTooltip=\"Close\">\r\n      <mat-icon>close</mat-icon>\r\n    </button>\r\n  </div>\r\n\r\n  <div class=\"settings-content\">\r\n    <!-- Model Selection -->\r\n    <div class=\"settings-section\">\r\n      <label class=\"section-label\">\r\n        <mat-icon>smart_toy</mat-icon>\r\n        Select Model\r\n      </label>\r\n      <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n        <mat-select [(ngModel)]=\"selectedModel\">\r\n          @for (model of availableModels; track model) {\r\n            <mat-option [value]=\"model\">{{ model }}</mat-option>\r\n          }\r\n        </mat-select>\r\n      </mat-form-field>\r\n    </div>\r\n\r\n    <!-- Data Type Selection (Checkboxes - at least one required) -->\r\n    <div class=\"settings-section\">\r\n      <label class=\"section-label\">\r\n        <mat-icon>category</mat-icon>\r\n        Select Document Types for Analysis\r\n      </label>\r\n      <p class=\"section-hint\">\r\n        Select one or more document types (minimum one required)\r\n      </p>\r\n      <div class=\"data-type-selection\">\r\n        @if (hasGstDocument) {\r\n          <div\r\n            class=\"data-type-option\"\r\n            [class.selected]=\"selectedGst\"\r\n            (click)=\"toggleGstSelection()\"\r\n          >\r\n            <div class=\"checkbox-square\" [class.checked]=\"selectedGst\">\r\n              @if (selectedGst) {\r\n                <mat-icon class=\"check-icon\">check</mat-icon>\r\n              }\r\n            </div>\r\n            <mat-icon>receipt_long</mat-icon>\r\n            <span>GST Data</span>\r\n          </div>\r\n        }\r\n        @if (hasBureauDocument) {\r\n          <div\r\n            class=\"data-type-option\"\r\n            [class.selected]=\"selectedBureau\"\r\n            (click)=\"toggleBureauSelection()\"\r\n          >\r\n            <div class=\"checkbox-square\" [class.checked]=\"selectedBureau\">\r\n              @if (selectedBureau) {\r\n                <mat-icon class=\"check-icon\">check</mat-icon>\r\n              }\r\n            </div>\r\n            <mat-icon>credit_score</mat-icon>\r\n            <span>Bureau Data</span>\r\n          </div>\r\n        }\r\n        @if (hasFinancialDocument) {\r\n          <div\r\n            class=\"data-type-option\"\r\n            [class.selected]=\"selectedFinancial\"\r\n            (click)=\"toggleFinancialSelection()\"\r\n          >\r\n            <div class=\"checkbox-square\" [class.checked]=\"selectedFinancial\">\r\n              @if (selectedFinancial) {\r\n                <mat-icon class=\"check-icon\">check</mat-icon>\r\n              }\r\n            </div>\r\n            <mat-icon>account_balance</mat-icon>\r\n            <span>Financial Statement</span>\r\n          </div>\r\n        }\r\n      </div>\r\n    </div>\r\n\r\n    <!-- GST Prompt Template (shown when GST selected and available) -->\r\n    @if (selectedGst && hasGstDocument) {\r\n      <div class=\"settings-section\">\r\n        <div class=\"section-header-row\">\r\n          <label class=\"section-label\">\r\n            <mat-icon>receipt_long</mat-icon>\r\n            GST Prompt Template\r\n          </label>\r\n          <div class=\"prompt-actions\">\r\n            <div\r\n              class=\"default-prompt-card\"\r\n              (click)=\"loadDefaultGstPromptTemplate()\"\r\n              matTooltip=\"Load Default GST Template\"\r\n            >\r\n              <mat-icon>auto_fix_high</mat-icon>\r\n              <span>Default</span>\r\n            </div>\r\n          </div>\r\n        </div>\r\n        <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n          <textarea\r\n            matInput\r\n            [(ngModel)]=\"gstPromptTemplate\"\r\n            rows=\"6\"\r\n            placeholder=\"Enter your GST analysis prompt...\"\r\n          ></textarea>\r\n        </mat-form-field>\r\n\r\n        <!-- GST Prompt File Upload -->\r\n        <div class=\"file-upload-inline\">\r\n          <div\r\n            class=\"file-upload-area small\"\r\n            (click)=\"triggerGstPromptFileUpload()\"\r\n          >\r\n            <mat-icon>cloud_upload</mat-icon>\r\n            <span>Upload .txt file</span>\r\n          </div>\r\n          <input\r\n            type=\"file\"\r\n            #gstPromptFileInput\r\n            accept=\".txt\"\r\n            (change)=\"onGstPromptFileUpload($event)\"\r\n            style=\"display: none\"\r\n          />\r\n        </div>\r\n\r\n        <!-- GST Prompt History -->\r\n        <div class=\"prompt-history-inline\">\r\n          <div class=\"history-header\" (click)=\"toggleGstPromptHistory()\">\r\n            <mat-icon>history</mat-icon>\r\n            <span>GST Prompt History</span>\r\n            <mat-icon class=\"expand-icon\">{{\r\n              showGstPromptHistory ? \"expand_less\" : \"expand_more\"\r\n            }}</mat-icon>\r\n          </div>\r\n          @if (showGstPromptHistory && gstPromptHistory.length > 0) {\r\n            <div class=\"history-list-compact\">\r\n              @for (\r\n                item of gstPromptHistory;\r\n                track item.timestamp;\r\n                let i = $index\r\n              ) {\r\n                <div\r\n                  class=\"history-item-compact\"\r\n                  (click)=\"selectGstFromHistory(item)\"\r\n                  [class.selected]=\"gstPromptTemplate === item.template\"\r\n                >\r\n                  <p class=\"history-preview\">\r\n                    {{ getPromptPreview(item.template) }}\r\n                  </p>\r\n                  <div class=\"history-meta\">\r\n                    <span>{{ formatHistoryDate(item.timestamp) }}</span>\r\n                    <button\r\n                      mat-icon-button\r\n                      class=\"delete-btn-small\"\r\n                      (click)=\"deleteGstFromHistory(i, $event)\"\r\n                      matTooltip=\"Delete\"\r\n                    >\r\n                      <mat-icon>close</mat-icon>\r\n                    </button>\r\n                  </div>\r\n                </div>\r\n              }\r\n            </div>\r\n          }\r\n          @if (showGstPromptHistory && gstPromptHistory.length === 0) {\r\n            <p class=\"history-empty-text\">No GST prompt history yet</p>\r\n          }\r\n        </div>\r\n      </div>\r\n    }\r\n\r\n    <!-- Bureau Prompt Template (shown when Bureau selected and available) -->\r\n    @if (selectedBureau && hasBureauDocument) {\r\n      <div class=\"settings-section\">\r\n        <div class=\"section-header-row\">\r\n          <label class=\"section-label\">\r\n            <mat-icon>credit_score</mat-icon>\r\n            Bureau Prompt Template\r\n          </label>\r\n          <div class=\"prompt-actions\">\r\n            <div\r\n              class=\"default-prompt-card\"\r\n              (click)=\"loadDefaultBureauPromptTemplate()\"\r\n              matTooltip=\"Load Default Bureau Template\"\r\n            >\r\n              <mat-icon>auto_fix_high</mat-icon>\r\n              <span>Default</span>\r\n            </div>\r\n          </div>\r\n        </div>\r\n        <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n          <textarea\r\n            matInput\r\n            [(ngModel)]=\"bureauPromptTemplate\"\r\n            rows=\"6\"\r\n            placeholder=\"Enter your Bureau analysis prompt...\"\r\n          ></textarea>\r\n        </mat-form-field>\r\n\r\n        <!-- Bureau Prompt File Upload -->\r\n        <div class=\"file-upload-inline\">\r\n          <div\r\n            class=\"file-upload-area small\"\r\n            (click)=\"triggerBureauPromptFileUpload()\"\r\n          >\r\n            <mat-icon>cloud_upload</mat-icon>\r\n            <span>Upload .txt file</span>\r\n          </div>\r\n          <input\r\n            type=\"file\"\r\n            #bureauPromptFileInput\r\n            accept=\".txt\"\r\n            (change)=\"onBureauPromptFileUpload($event)\"\r\n            style=\"display: none\"\r\n          />\r\n        </div>\r\n\r\n        <!-- Bureau Prompt History -->\r\n        <div class=\"prompt-history-inline\">\r\n          <div class=\"history-header\" (click)=\"toggleBureauPromptHistory()\">\r\n            <mat-icon>history</mat-icon>\r\n            <span>Bureau Prompt History</span>\r\n            <mat-icon class=\"expand-icon\">{{\r\n              showBureauPromptHistory ? \"expand_less\" : \"expand_more\"\r\n            }}</mat-icon>\r\n          </div>\r\n          @if (showBureauPromptHistory && bureauPromptHistory.length > 0) {\r\n            <div class=\"history-list-compact\">\r\n              @for (\r\n                item of bureauPromptHistory;\r\n                track item.timestamp;\r\n                let i = $index\r\n              ) {\r\n                <div\r\n                  class=\"history-item-compact\"\r\n                  (click)=\"selectBureauFromHistory(item)\"\r\n                  [class.selected]=\"bureauPromptTemplate === item.template\"\r\n                >\r\n                  <p class=\"history-preview\">\r\n                    {{ getPromptPreview(item.template) }}\r\n                  </p>\r\n                  <div class=\"history-meta\">\r\n                    <span>{{ formatHistoryDate(item.timestamp) }}</span>\r\n                    <button\r\n                      mat-icon-button\r\n                      class=\"delete-btn-small\"\r\n                      (click)=\"deleteBureauFromHistory(i, $event)\"\r\n                      matTooltip=\"Delete\"\r\n                    >\r\n                      <mat-icon>close</mat-icon>\r\n                    </button>\r\n                  </div>\r\n                </div>\r\n              }\r\n            </div>\r\n          }\r\n          @if (showBureauPromptHistory && bureauPromptHistory.length === 0) {\r\n            <p class=\"history-empty-text\">No Bureau prompt history yet</p>\r\n          }\r\n        </div>\r\n      </div>\r\n    }\r\n\r\n    <!-- Financial Prompt Template (shown when Financial selected and available) -->\r\n    @if (selectedFinancial && hasFinancialDocument) {\r\n      <div class=\"settings-section\">\r\n        <div class=\"section-header-row\">\r\n          <label class=\"section-label\">\r\n            <mat-icon>account_balance</mat-icon>\r\n            Financial Statement Prompt Template\r\n          </label>\r\n          <div class=\"prompt-actions\">\r\n            <div\r\n              class=\"default-prompt-card\"\r\n              (click)=\"loadDefaultFinancialPromptTemplate()\"\r\n              matTooltip=\"Load Default Financial Template\"\r\n            >\r\n              <mat-icon>auto_fix_high</mat-icon>\r\n              <span>Default</span>\r\n            </div>\r\n          </div>\r\n        </div>\r\n        <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n          <textarea\r\n            matInput\r\n            [(ngModel)]=\"financialPromptTemplate\"\r\n            rows=\"6\"\r\n            placeholder=\"Enter your Financial Statement analysis prompt...\"\r\n          ></textarea>\r\n        </mat-form-field>\r\n\r\n        <!-- Financial Prompt File Upload -->\r\n        <div class=\"file-upload-inline\">\r\n          <div\r\n            class=\"file-upload-area small\"\r\n            (click)=\"triggerFinancialPromptFileUpload()\"\r\n          >\r\n            <mat-icon>cloud_upload</mat-icon>\r\n            <span>Upload .txt file</span>\r\n          </div>\r\n          <input\r\n            type=\"file\"\r\n            #financialPromptFileInput\r\n            accept=\".txt\"\r\n            (change)=\"onFinancialPromptFileUpload($event)\"\r\n            style=\"display: none\"\r\n          />\r\n        </div>\r\n\r\n        <!-- Financial Prompt History -->\r\n        <div class=\"prompt-history-inline\">\r\n          <div class=\"history-header\" (click)=\"toggleFinancialPromptHistory()\">\r\n            <mat-icon>history</mat-icon>\r\n            <span>Financial Prompt History</span>\r\n            <mat-icon class=\"expand-icon\">{{\r\n              showFinancialPromptHistory ? \"expand_less\" : \"expand_more\"\r\n            }}</mat-icon>\r\n          </div>\r\n          @if (\r\n            showFinancialPromptHistory && financialPromptHistory.length > 0\r\n          ) {\r\n            <div class=\"history-list-compact\">\r\n              @for (\r\n                item of financialPromptHistory;\r\n                track item.timestamp;\r\n                let i = $index\r\n              ) {\r\n                <div\r\n                  class=\"history-item-compact\"\r\n                  (click)=\"selectFinancialFromHistory(item)\"\r\n                  [class.selected]=\"financialPromptTemplate === item.template\"\r\n                >\r\n                  <p class=\"history-preview\">\r\n                    {{ getPromptPreview(item.template) }}\r\n                  </p>\r\n                  <div class=\"history-meta\">\r\n                    <span>{{ formatHistoryDate(item.timestamp) }}</span>\r\n                    <button\r\n                      mat-icon-button\r\n                      class=\"delete-btn-small\"\r\n                      (click)=\"deleteFinancialFromHistory(i, $event)\"\r\n                      matTooltip=\"Delete\"\r\n                    >\r\n                      <mat-icon>close</mat-icon>\r\n                    </button>\r\n                  </div>\r\n                </div>\r\n              }\r\n            </div>\r\n          }\r\n          @if (\r\n            showFinancialPromptHistory && financialPromptHistory.length === 0\r\n          ) {\r\n            <p class=\"history-empty-text\">No Financial prompt history yet</p>\r\n          }\r\n        </div>\r\n      </div>\r\n    }\r\n\r\n    <!-- RAG Configuration Section -->\r\n    <div class=\"settings-section rag-config-section\">\r\n      <div class=\"section-divider\">\r\n        <span class=\"divider-label\">RAG Configuration</span>\r\n      </div>\r\n      <p class=\"rag-description\">\r\n        Configure RAG system settings to control output accuracy\r\n      </p>\r\n\r\n      <!-- Chunk Size -->\r\n      <div class=\"rag-field\">\r\n        <label class=\"field-label\">\r\n          <mat-icon>view_module</mat-icon>\r\n          Chunk Size\r\n        </label>\r\n        <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n          <input\r\n            matInput\r\n            type=\"number\"\r\n            [(ngModel)]=\"chunkSize\"\r\n            min=\"100\"\r\n            max=\"2000\"\r\n            placeholder=\"500\"\r\n          />\r\n          <mat-hint>Recommended: 300-1000</mat-hint>\r\n        </mat-form-field>\r\n      </div>\r\n\r\n      <!-- Chunk Overlap -->\r\n      <div class=\"rag-field\">\r\n        <label class=\"field-label\">\r\n          <mat-icon>layers</mat-icon>\r\n          Chunk Overlap\r\n        </label>\r\n        <div class=\"slider-container\">\r\n          <mat-slider\r\n            min=\"50\"\r\n            max=\"1000\"\r\n            step=\"50\"\r\n            discrete\r\n            [displayWith]=\"formatSliderLabel\"\r\n          >\r\n            <input matSliderThumb [(ngModel)]=\"chunkOverlap\" />\r\n          </mat-slider>\r\n          <span class=\"slider-value\">{{ chunkOverlap }}</span>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Top K -->\r\n      <div class=\"rag-field\">\r\n        <label class=\"field-label\">\r\n          <mat-icon>filter_list</mat-icon>\r\n          Top K (Retrieved Chunks)\r\n        </label>\r\n        <div class=\"slider-container\">\r\n          <mat-slider\r\n            min=\"1\"\r\n            max=\"20\"\r\n            step=\"1\"\r\n            discrete\r\n            [displayWith]=\"formatSliderLabel\"\r\n          >\r\n            <input matSliderThumb [(ngModel)]=\"topK\" />\r\n          </mat-slider>\r\n          <span class=\"slider-value\">{{ topK }}</span>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Embedding Model -->\r\n      <div class=\"rag-field\">\r\n        <label class=\"field-label\">\r\n          <mat-icon>hub</mat-icon>\r\n          Embedding Model\r\n        </label>\r\n        <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n          <mat-select [(ngModel)]=\"selectedEmbeddingModel\">\r\n            @for (model of availableEmbeddingModels; track model) {\r\n              <mat-option [value]=\"model\">{{ model }}</mat-option>\r\n            }\r\n          </mat-select>\r\n        </mat-form-field>\r\n      </div>\r\n\r\n      <!-- Search Type -->\r\n      <div class=\"rag-field\">\r\n        <label class=\"field-label\">\r\n          <mat-icon>search</mat-icon>\r\n          Search Type\r\n        </label>\r\n        <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n          <mat-select [(ngModel)]=\"selectedSearchType\">\r\n            @for (type of availableSearchTypes; track type.value) {\r\n              <mat-option [value]=\"type.value\">{{ type.label }}</mat-option>\r\n            }\r\n          </mat-select>\r\n        </mat-form-field>\r\n      </div>\r\n\r\n      <!-- Vector Store Type -->\r\n      <div class=\"rag-field\">\r\n        <label class=\"field-label\">\r\n          <mat-icon>storage</mat-icon>\r\n          Vector Store Type\r\n        </label>\r\n        <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n          <mat-select [(ngModel)]=\"selectedVectorStore\">\r\n            @for (store of availableVectorStores; track store.value) {\r\n              <mat-option [value]=\"store.value\">{{ store.label }}</mat-option>\r\n            }\r\n          </mat-select>\r\n        </mat-form-field>\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n  <div class=\"settings-footer\">\r\n    <button mat-stroked-button color=\"warn\" (click)=\"resetSettings()\">\r\n      <mat-icon>refresh</mat-icon>\r\n      Reset\r\n    </button>\r\n    <button mat-flat-button color=\"primary\" (click)=\"saveSettings()\">\r\n      <mat-icon>save</mat-icon>\r\n      Save\r\n    </button>\r\n  </div>\r\n</div>\r\n","import { Component, Input, Output, EventEmitter, ViewChild, ElementRef, AfterViewInit, OnDestroy, OnInit, OnChanges, SimpleChanges, HostListener, NgZone } from '@angular/core';\r\nimport {\r\n  CommonModule,\r\n  DecimalPipe,\r\n  DatePipe,\r\n} from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatSidenavModule } from '@angular/material/sidenav';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSliderModule } from '@angular/material/slider';\r\nimport { MarkdownModule } from 'ngx-markdown';\r\n\r\nimport {\r\n  LoanSummaryDetails,\r\n  GoNoGoDecision,\r\n  SummaryService,\r\n  BureauData,\r\n  ProposalDocument,\r\n} from '../../../models/loan-summary.model';\r\nimport {\r\n  GstQuickSummary,\r\n  BureauQuickSummary,\r\n  FinancialQuickSummary,\r\n} from '../../../models/api-response.model';\r\nimport { LoanSummaryService } from '../../../services/loan-summary.service';\r\n\r\n// Import Section Components\r\nimport {\r\n  GoNoGoDecisionComponent,\r\n  BorrowerInfoComponent,\r\n  RiskRatingComponent,\r\n  DirectorInfoComponent,\r\n  LoanFacilityComponent,\r\n  CreditBureauComponent,\r\n  CreditAssessmentComponent,\r\n  GstSummaryComponent,\r\n  BalanceSheetComponent,\r\n  RiskAssessmentComponent,\r\n  EwsDashboardComponent,\r\n} from '../../sections';\r\nimport { AiSettingsPanelComponent, AiSettingsPanelData } from '../../shared/ai-settings-panel/ai-settings-panel.component';\r\n\r\ntype ViewMode = 'carousel' | 'list';\r\n\r\ninterface SummarySection {\r\n  id: string;\r\n  title: string;\r\n  icon: string;\r\n}\r\n\r\n@Component({\r\n  selector: 'uc-loan-summary',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    FormsModule,\r\n    MatButtonModule,\r\n    MatIconModule,\r\n    MatTabsModule,\r\n    MatCardModule,\r\n    MatChipsModule,\r\n    MatTableModule,\r\n    MatTooltipModule,\r\n    MatDividerModule,\r\n    MatButtonToggleModule,\r\n    MatSidenavModule,\r\n    MatFormFieldModule,\r\n    MatSelectModule,\r\n    MatInputModule,\r\n    MatSliderModule,\r\n    MarkdownModule,\r\n    DecimalPipe,\r\n    DatePipe,\r\n    // Section Components\r\n    GoNoGoDecisionComponent,\r\n    BorrowerInfoComponent,\r\n    RiskRatingComponent,\r\n    DirectorInfoComponent,\r\n    LoanFacilityComponent,\r\n    CreditBureauComponent,\r\n    CreditAssessmentComponent,\r\n    GstSummaryComponent,\r\n    BalanceSheetComponent,\r\n    RiskAssessmentComponent,\r\n    EwsDashboardComponent,\r\n    AiSettingsPanelComponent,\r\n  ],\r\n  templateUrl: './loan-summary.component.html',\r\n  styleUrl: './loan-summary.component.scss',\r\n})\r\nexport class LoanSummaryComponent implements OnInit, OnChanges, AfterViewInit, OnDestroy {\r\n  @Input() loanSummary!: LoanSummaryDetails;\r\n  @Input() goNoGoDecision!: GoNoGoDecision;\r\n  @Input() selectedServices: SummaryService[] = [];\r\n  @Input() proposalNo: string = 'LA-2026-00342';\r\n  @Input() aiGeneratedResponse: string = ''; // AI generated markdown response for GST detailed analysis\r\n  @Input() aiGeneratedBureauResponse: string = ''; // AI generated markdown response for Bureau detailed analysis\r\n  @Input() aiGeneratedFinancialResponse: string = ''; // AI generated markdown response for Financial Statement analysis\r\n  @Input() aiGeneratedGoNoGoResponse: string = ''; // AI generated markdown response for GO/NO-GO decision\r\n  @Input() hasGstDocument: boolean = true;\r\n  @Input() hasBureauDocument: boolean = true;\r\n  @Input() hasFinancialDocument: boolean = true;\r\n  @Input() documents: ProposalDocument[] = [];\r\n  @Input() isAiSettingsConfigurable: boolean = true;\r\n  \r\n  // Quick Summary inputs from backend API\r\n  @Input() gstQuickSummary: GstQuickSummary | null = null;\r\n  @Input() bureauQuickSummary: BureauQuickSummary | null = null;\r\n  @Input() financialQuickSummary: FinancialQuickSummary | null = null;\r\n  \r\n  // Proposal-based dynamic data inputs\r\n  @Input() proposalBorrowerInfo: import('../../../models/loan-summary.model').ProposalBorrowerInfo | null = null;\r\n  @Input() proposalDirectorInfo: import('../../../models/loan-summary.model').ProposalDirectorInfo[] = [];\r\n  @Input() proposalFacilityInfo: import('../../../models/loan-summary.model').ProposalFacilityInfo[] = [];\r\n  \r\n  @Output() backToSelection = new EventEmitter<void>();\r\n  @Output() exportReport = new EventEmitter<void>();\r\n  @Output() submitDecision = new EventEmitter<void>();\r\n  @Output() goNoGoScrolled = new EventEmitter<boolean>();\r\n  @Output() regenerateSummary = new EventEmitter<void>();\r\n\r\n  @ViewChild('listContainer') listContainer!: ElementRef<HTMLElement>;\r\n  @ViewChild(AiSettingsPanelComponent) aiSettingsPanel!: AiSettingsPanelComponent;\r\n  private scrollListener: (() => void) | null = null;\r\n\r\n  viewMode: ViewMode = 'list';\r\n  currentSlideIndex = 0;\r\n\r\n  // Section indicator state\r\n  currentSection: SummarySection | null = null;\r\n  currentSectionIndex = 0;\r\n  showSectionIndicator = false;\r\n  private indicatorTimeout: any = null;\r\n\r\n  sections: SummarySection[] = [\r\n    { id: 'go-nogo', title: 'Go/No-Go Decision', icon: 'verified' },\r\n    { id: 'borrower-info', title: 'Borrower Information', icon: 'business' },\r\n    { id: 'risk-rating', title: 'Risk Rating & Analysis', icon: 'analytics' },\r\n    { id: 'director-info', title: 'Director Information', icon: 'groups' },\r\n    { id: 'loan-facility', title: 'Loan Facility', icon: 'payments' },\r\n    {\r\n      id: 'credit-bureau',\r\n      title: 'Credit Bureau Details',\r\n      icon: 'credit_score',\r\n    },\r\n    { id: 'credit-assessment', title: 'Credit Assessment', icon: 'assessment' },\r\n    { id: 'gst-summary', title: 'GST Summary', icon: 'receipt_long' },\r\n    { id: 'balance-sheet', title: 'Balance Sheet', icon: 'account_balance' },\r\n    { id: 'risk-assessment', title: 'Risk Assessment', icon: 'warning' },\r\n    {\r\n      id: 'ews-dashboard',\r\n      title: 'EWS Dashboard',\r\n      icon: 'notifications_active',\r\n    },\r\n  ];\r\n\r\n  directorColumns: string[] = [\r\n    'name',\r\n    'din',\r\n    'pan',\r\n    'panStatus',\r\n    'phoneNumber',\r\n    'emailId',\r\n  ];\r\n  facilityColumns: string[] = [\r\n    'facility',\r\n    'natureOfLimit',\r\n    'amountRequested',\r\n    'tenure',\r\n  ];\r\n\r\n  // Pagination state for GST tables\r\n  monthlyReturnsPageIndex = 0;\r\n  filingHistoryPageIndex = 0;\r\n  readonly itemsPerPage = 5;\r\n\r\n  // GST Summary view mode\r\n  gstViewMode: 'overview' | 'detailed' = 'overview';\r\n  gstDetailedMarkdown: string = '';\r\n  isLoadingGstDetails = false;\r\n\r\n  // Go/No-Go summary markdown\r\n  goNoGoSummaryMarkdown: string = '';\r\n  \r\n  // Error toast state\r\n  showErrorToast = false;\r\n  errorToastMessage = '';\r\n  private errorToastTimeout: any = null;\r\n\r\n  documentTypes = [\r\n    { id: 'kyc', name: 'KYC Images', icon: 'badge' },\r\n    { id: 'bureau', name: 'Bureau Report', icon: 'description' },\r\n    { id: 'income', name: 'Income Proof', icon: 'account_balance_wallet' },\r\n    { id: 'address', name: 'Address Proof', icon: 'home' },\r\n    { id: 'process-note', name: 'Process Note', icon: 'article' },\r\n    { id: 'bank', name: 'Bank Statement', icon: 'account_balance' },\r\n  ];\r\n\r\n  // Settings Panel State\r\n  isSettingsPanelOpen = false;\r\n  availableModels: string[] = [\r\n    'llama3.2:3b',\r\n    'mistral:7b',\r\n    'qwen3.5:latest',\r\n    'gemma4:latest',\r\n    'deepseek-r1:latest'\r\n  ];\r\n  selectedModel = 'gemma4:latest';\r\n  promptTemplate = '';\r\n  isEditingPrompt = false;\r\n  isSavingSettings = false;\r\n  savingProgress = 0;\r\n  private savingProgressInterval: any = null;\r\n  showPromptHistory = true;\r\n  promptHistory: Array<{ template: string; timestamp: string; source: 'typed' | 'uploaded' }> = [];\r\n  readonly defaultPromptTemplate = `\r\nCredit underwriter summary for \r\n1. Detailed profile and GST report analysis\r\n2. ITC Utilization pattern\r\n3. Customer and supplier risk assessment\r\n4. Fraud & Compliance risk assessment\r\n5. Concentration Risk Assessment\r\n6. Financial Health indicators\r\n7. Underwriter Recommendation\r\n8. Final Recommendation\r\nNote: Don't include the document number in the response\r\n`;\r\n  private readonly settingsStorageKey = 'app.aiSettings.v1';\r\n  private readonly historyStorageKey = 'app.aiSettings.promptHistory';\r\n  \r\n  // RAG Configuration State\r\n  chunkSize = 1000;\r\n  chunkOverlap = 150;\r\n  topK = 15;\r\n  chunkOverlapOptions: number[] = [50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 600, 700, 800, 900, 1000];\r\n  \r\n  availableEmbeddingModels: string[] = [\r\n    'embeddinggemma:300m',\r\n    'all-minilm'\r\n  ];\r\n  selectedEmbeddingModel = 'embeddinggemma:300m';\r\n  \r\n  availableSearchTypes: Array<{ value: string; label: string }> = [\r\n    { value: 'similarity', label: 'Similarity Search' },\r\n    { value: 'mmr', label: 'Max Marginal Relevance' },\r\n    { value: 'hybrid', label: 'Hybrid Search - Similarity + BM25' }\r\n  ];\r\n  selectedSearchType = 'hybrid';\r\n  \r\n  availableVectorStores: Array<{ value: string; label: string }> = [\r\n    { value: 'pgvector', label: 'PG Vector' },\r\n    { value: 'inmemory', label: 'InMemoryVector' },\r\n  ];\r\n  selectedVectorStore = 'pgvector';\r\n  \r\n  // Backup state for restoring on cancel/close\r\n  private backupSelectedModel = 'gemma4:latest';\r\n  private backupPromptTemplate = '';\r\n  private backupChunkSize = 1000;\r\n  private backupChunkOverlap = 150;\r\n  private backupTopK = 15;\r\n  private backupEmbeddingModel = 'embeddinggemma:300m';\r\n  private backupSearchType = 'hybrid';\r\n  private backupVectorStore = 'pgvector';\r\n  private backupSelectedGst = true;\r\n  private backupSelectedBureau = false;\r\n  private backupSelectedFinancial = false;\r\n  private backupGstPromptTemplate = '';\r\n  private backupBureauPromptTemplate = '';\r\n  private backupFinancialPromptTemplate = '';\r\n\r\n  @ViewChild('promptFileInput') promptFileInput!: ElementRef<HTMLInputElement>;\r\n  @ViewChild('gstPromptFileInput') gstPromptFileInput!: ElementRef<HTMLInputElement>;\r\n  @ViewChild('bureauPromptFileInput') bureauPromptFileInput!: ElementRef<HTMLInputElement>;\r\n  @ViewChild('financialPromptFileInput') financialPromptFileInput!: ElementRef<HTMLInputElement>;\r\n  \r\n  // Document type selection: GST, Bureau, and/or Financial (checkboxes, at least one required)\r\n  selectedGst = true;\r\n  selectedBureau = false;\r\n  selectedFinancial = false;\r\n  \r\n  // Separate prompt templates for GST, Bureau, and Financial\r\n  gstPromptTemplate = '';\r\n  bureauPromptTemplate = '';\r\n  financialPromptTemplate = '';\r\n  \r\n  // Separate prompt history for GST, Bureau, and Financial\r\n  gstPromptHistory: Array<{ template: string; timestamp: string; source: 'typed' | 'uploaded' }> = [];\r\n  bureauPromptHistory: Array<{ template: string; timestamp: string; source: 'typed' | 'uploaded' }> = [];\r\n  financialPromptHistory: Array<{ template: string; timestamp: string; source: 'typed' | 'uploaded' }> = [];\r\n  showGstPromptHistory = false;\r\n  showBureauPromptHistory = false;\r\n  showFinancialPromptHistory = false;\r\n  private readonly gstHistoryStorageKey = 'app.aiSettings.gstPromptHistory';\r\n  private readonly bureauHistoryStorageKey = 'app.aiSettings.bureauPromptHistory';\r\n  private readonly financialHistoryStorageKey = 'app.aiSettings.financialPromptHistory';\r\n  \r\n  // Default prompt templates\r\n  readonly defaultGstPromptTemplate = `\r\nCredit underwriter summary for \r\n1. Detailed profile and GST report analysis\r\n2. ITC Utilization pattern\r\n3. Customer and supplier risk assessment\r\n4. Fraud & Compliance risk assessment\r\n5. Concentration Risk Assessment\r\n6. Financial Health indicators\r\n7. Underwriter Recommendation\r\n8. Final Recommendation\r\nNote: Don't include the document number in the response\r\n`;\r\n\r\n  readonly defaultBureauPromptTemplate = `Generate in detailed CIBIL summary along with the profile`;\r\n\r\n  readonly defaultFinancialPromptTemplate = `Generate a comprehensive Financial Statement analysis covering:\r\n1. Balance Sheet Analysis - Assets, Liabilities, and Equity breakdown\r\n2. Income Statement Review - Revenue, Expenses, and Profitability trends\r\n3. Cash Flow Analysis - Operating, Investing, and Financing activities\r\n4. Key Financial Ratios - Liquidity, Solvency, Profitability, and Efficiency ratios\r\n5. Working Capital Assessment\r\n6. Debt Analysis and Coverage Ratios\r\n7. Year-over-Year Comparison and Trends\r\n8. Financial Health Indicators and Risk Flags\r\n9. Recommendations for Credit Assessment\r\nNote: Focus on data-driven insights relevant for credit underwriting decisions.`;\r\n  \r\n  // Bureau view mode (similar to GST)\r\n  bureauViewMode: 'overview' | 'detailed' = 'overview';\r\n  bureauDetailedMarkdown: string = '';\r\n  isLoadingBureauDetails = false;\r\n  \r\n  // Bureau data from package-test API (can be passed as Input or set via API call)\r\n  @Input() bureauData: BureauData | null = null;\r\n  \r\n  // Financial Statement view mode (similar to GST and Bureau)\r\n  financialViewMode: 'overview' | 'detailed' = 'overview';\r\n  financialDetailedMarkdown: string = '';\r\n  isLoadingFinancialDetails = false;\r\n\r\n  private goNoGoScrolledPast = false;\r\n\r\n  constructor(\r\n    public loanSummaryService: LoanSummaryService,\r\n    private ngZone: NgZone,\r\n    public elementRef: ElementRef,\r\n    private http: HttpClient\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    // Load cached settings on initialization\r\n    this.loadAiSettingsFromCache();\r\n    \r\n    // If AI-generated GST response is available, set it as GST detailed markdown\r\n    if (this.aiGeneratedResponse && this.aiGeneratedResponse.trim() !== '') {\r\n      this.gstDetailedMarkdown = this.aiGeneratedResponse;\r\n    }\r\n    \r\n    // If AI-generated Bureau response is available, set it as Bureau detailed markdown\r\n    if (this.aiGeneratedBureauResponse && this.aiGeneratedBureauResponse.trim() !== '') {\r\n      this.bureauDetailedMarkdown = this.aiGeneratedBureauResponse;\r\n    }\r\n    \r\n    // If AI-generated Financial response is available, set it as Financial detailed markdown\r\n    if (this.aiGeneratedFinancialResponse && this.aiGeneratedFinancialResponse.trim() !== '') {\r\n      this.financialDetailedMarkdown = this.aiGeneratedFinancialResponse;\r\n    }\r\n    \r\n    // If AI-generated GO/NO-GO response is available, set it as GO/NO-GO summary markdown\r\n    if (this.aiGeneratedGoNoGoResponse && this.aiGeneratedGoNoGoResponse.trim() !== '') {\r\n      this.goNoGoSummaryMarkdown = this.aiGeneratedGoNoGoResponse;\r\n    }\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    // Update GO/NO-GO summary markdown when input changes\r\n    if (changes['aiGeneratedGoNoGoResponse'] && changes['aiGeneratedGoNoGoResponse'].currentValue) {\r\n      const newValue = changes['aiGeneratedGoNoGoResponse'].currentValue;\r\n      if (newValue && newValue.trim() !== '') {\r\n        this.goNoGoSummaryMarkdown = newValue;\r\n        console.log('GO/NO-GO summary updated from input change');\r\n      }\r\n    }\r\n    \r\n    // Update GST markdown when input changes\r\n    if (changes['aiGeneratedResponse'] && changes['aiGeneratedResponse'].currentValue) {\r\n      const newValue = changes['aiGeneratedResponse'].currentValue;\r\n      if (newValue && newValue.trim() !== '') {\r\n        this.gstDetailedMarkdown = newValue;\r\n      }\r\n    }\r\n    \r\n    // Update Bureau markdown when input changes\r\n    if (changes['aiGeneratedBureauResponse'] && changes['aiGeneratedBureauResponse'].currentValue) {\r\n      const newValue = changes['aiGeneratedBureauResponse'].currentValue;\r\n      if (newValue && newValue.trim() !== '') {\r\n        this.bureauDetailedMarkdown = newValue;\r\n      }\r\n    }\r\n    \r\n    // Update Financial markdown when input changes\r\n    if (changes['aiGeneratedFinancialResponse'] && changes['aiGeneratedFinancialResponse'].currentValue) {\r\n      const newValue = changes['aiGeneratedFinancialResponse'].currentValue;\r\n      if (newValue && newValue.trim() !== '') {\r\n        this.financialDetailedMarkdown = newValue;\r\n      }\r\n    }\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    // Set up scroll listener after view is ready\r\n    setTimeout(() => {\r\n      this.setupScrollListener();\r\n      // Initialize current section\r\n      if (this.visibleSections.length > 0) {\r\n        this.currentSection = this.visibleSections[0];\r\n        this.currentSectionIndex = 0;\r\n      }\r\n    }, 200);\r\n    \r\n    // Load Go/No-Go summary markdown only if not already set from AI response\r\n    if (!this.goNoGoSummaryMarkdown || this.goNoGoSummaryMarkdown.trim() === '') {\r\n      this.loadGoNoGoSummary();\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.removeScrollListener();\r\n  }\r\n\r\n  private setupScrollListener(): void {\r\n    // Find the scrollable container - could be list-container or a parent\r\n    const listEl = this.elementRef.nativeElement.querySelector('.list-container');\r\n    const dialogContent = document.querySelector('.dialog-content');\r\n    \r\n    // Try list container first, then dialog content\r\n    const scrollContainer = listEl || dialogContent;\r\n    \r\n    if (scrollContainer) {\r\n      console.log('Scroll listener attached to:', scrollContainer.className);\r\n      this.scrollListener = () => this.onListScroll(scrollContainer as HTMLElement);\r\n      scrollContainer.addEventListener('scroll', this.scrollListener, { passive: true });\r\n      \r\n      // Also listen to window scroll as fallback\r\n      window.addEventListener('scroll', this.scrollListener, { passive: true });\r\n    }\r\n  }\r\n\r\n  private removeScrollListener(): void {\r\n    if (this.scrollListener) {\r\n      const listEl = this.elementRef.nativeElement.querySelector('.list-container');\r\n      const dialogContent = document.querySelector('.dialog-content');\r\n      \r\n      if (listEl) {\r\n        listEl.removeEventListener('scroll', this.scrollListener);\r\n      }\r\n      if (dialogContent) {\r\n        dialogContent.removeEventListener('scroll', this.scrollListener);\r\n      }\r\n      window.removeEventListener('scroll', this.scrollListener);\r\n      this.scrollListener = null;\r\n    }\r\n  }\r\n\r\n  private onListScroll(container: HTMLElement): void {\r\n    // Find the decision card\r\n    const goNoGoSection = document.querySelector('.decision-card');\r\n    if (goNoGoSection) {\r\n      const rect = goNoGoSection.getBoundingClientRect();\r\n      \r\n      // Get the Quick Documents bar position (sticky element)\r\n      const quickDocsBar = document.querySelector('.document-links-sticky');\r\n      const quickDocsBottom = quickDocsBar ? quickDocsBar.getBoundingClientRect().bottom : 100;\r\n      \r\n      // Check if the Go/No-Go card has scrolled past (its bottom is above quick docs)\r\n      const scrolledPast = rect.bottom < quickDocsBottom + 20;\r\n      \r\n      if (scrolledPast !== this.goNoGoScrolledPast) {\r\n        this.goNoGoScrolledPast = scrolledPast;\r\n        console.log('Go/No-Go scrolled past:', scrolledPast);\r\n        this.ngZone.run(() => {\r\n          this.goNoGoScrolled.emit(scrolledPast);\r\n        });\r\n      }\r\n    }\r\n  }\r\n\r\n  // Direct scroll handler from template\r\n  onScroll(event: Event): void {\r\n    const container = event.target as HTMLElement;\r\n    this.checkGoNoGoScroll(container);\r\n    this.updateCurrentSection(container);\r\n  }\r\n\r\n  // Handler for scroll events from parent dialog\r\n  onParentScroll(event: Event): void {\r\n    if (this.viewMode !== 'list') return;\r\n    const container = event.target as HTMLElement;\r\n    this.checkGoNoGoScroll(container);\r\n    this.updateCurrentSectionFromParent(container);\r\n  }\r\n\r\n  private checkGoNoGoScroll(container: HTMLElement): void {\r\n    const goNoGoSection = container.querySelector('.decision-card');\r\n    if (goNoGoSection) {\r\n      const rect = goNoGoSection.getBoundingClientRect();\r\n      const containerRect = container.getBoundingClientRect();\r\n      \r\n      // Card is scrolled past when its bottom goes above the container's visible area\r\n      const scrolledPast = rect.bottom < containerRect.top + 80;\r\n      \r\n      if (scrolledPast !== this.goNoGoScrolledPast) {\r\n        this.goNoGoScrolledPast = scrolledPast;\r\n        this.goNoGoScrolled.emit(scrolledPast);\r\n      }\r\n    }\r\n  }\r\n\r\n  private updateCurrentSection(container: HTMLElement): void {\r\n    const listItems = container.querySelectorAll('.list-item[data-section-id]');\r\n    const containerRect = container.getBoundingClientRect();\r\n    const threshold = containerRect.top + 120;\r\n    \r\n    let foundIndex = 0;\r\n    \r\n    listItems.forEach((item, index) => {\r\n      const rect = item.getBoundingClientRect();\r\n      if (rect.top <= threshold) {\r\n        foundIndex = index;\r\n      }\r\n    });\r\n    \r\n    const sections = this.visibleSections;\r\n    if (foundIndex >= 0 && foundIndex < sections.length) {\r\n      this.currentSection = sections[foundIndex];\r\n      this.currentSectionIndex = foundIndex;\r\n      \r\n      // Always show indicator when scrolled in list view\r\n      this.showSectionIndicator = true;\r\n    }\r\n  }\r\n\r\n  // Updated method to find sections when parent (dialog-content) is scrolling\r\n  private updateCurrentSectionFromParent(container: HTMLElement): void {\r\n    // Find list items within this component (they're inside dialog-content)\r\n    const listItems = this.elementRef.nativeElement.querySelectorAll('.list-item[data-section-id]');\r\n    const containerRect = container.getBoundingClientRect();\r\n    const threshold = containerRect.top + 150; // Offset for sticky headers\r\n    \r\n    let foundIndex = 0;\r\n    \r\n    listItems.forEach((item: Element, index: number) => {\r\n      const rect = item.getBoundingClientRect();\r\n      if (rect.top <= threshold) {\r\n        foundIndex = index;\r\n      }\r\n    });\r\n    \r\n    const sections = this.visibleSections;\r\n    if (foundIndex >= 0 && foundIndex < sections.length) {\r\n      if (this.currentSectionIndex !== foundIndex) {\r\n        this.currentSection = sections[foundIndex];\r\n        this.currentSectionIndex = foundIndex;\r\n      }\r\n      // Always show indicator when scrolled in list view\r\n      this.showSectionIndicator = true;\r\n    }\r\n  }\r\n\r\n  get nextSection(): SummarySection | null {\r\n    const sections = this.visibleSections;\r\n    if (this.currentSectionIndex < sections.length - 1) {\r\n      return sections[this.currentSectionIndex + 1];\r\n    }\r\n    return null;\r\n  }\r\n\r\n  getSectionProgress(): number {\r\n    const sections = this.visibleSections;\r\n    if (sections.length === 0) return 0;\r\n    return ((this.currentSectionIndex + 1) / sections.length) * 100;\r\n  }\r\n\r\n  get visibleSections(): SummarySection[] {\r\n    return this.sections.filter(\r\n      (section) =>\r\n        section.id === 'go-nogo' ||\r\n        this.selectedServices.some(\r\n          (s) =>\r\n            s.id === section.id ||\r\n            this.mapServiceToSection(s.id) === section.id,\r\n        ),\r\n    );\r\n  }\r\n\r\n  private mapServiceToSection(serviceId: string): string {\r\n    const mapping: { [key: string]: string } = {\r\n      'borrower-info': 'borrower-info',\r\n      'risk-rating': 'risk-rating',\r\n      'director-info': 'director-info',\r\n      'loan-facility': 'loan-facility',\r\n      'credit-bureau': 'credit-bureau',\r\n      'credit-assessment': 'credit-assessment',\r\n      'gst-summary': 'gst-summary',\r\n      'balance-sheet': 'balance-sheet',\r\n      'risk-assessment': 'risk-assessment',\r\n      corpository: 'risk-assessment',\r\n      'ews-dashboard': 'ews-dashboard',\r\n    };\r\n    return mapping[serviceId] || serviceId;\r\n  }\r\n\r\n  onViewModeChange(mode: ViewMode): void {\r\n    this.viewMode = mode;\r\n    this.currentSlideIndex = 0;\r\n    \r\n    // Initialize section indicator when switching to list view\r\n    if (mode === 'list') {\r\n      if (this.visibleSections.length > 0) {\r\n        this.currentSection = this.visibleSections[0];\r\n        this.currentSectionIndex = 0;\r\n        this.showSectionIndicator = true;\r\n      }\r\n    } else {\r\n      this.showSectionIndicator = false;\r\n    }\r\n  }\r\n\r\n  onGstViewModeChange(mode: 'overview' | 'detailed'): void {\r\n    this.gstViewMode = mode;\r\n    \r\n    if (mode === 'detailed' && !this.gstDetailedMarkdown) {\r\n      this.loadGstDetailedAnalysis();\r\n    }\r\n  }\r\n\r\n  private loadGstDetailedAnalysis(): void {\r\n    // If AI-generated response is available, use it\r\n    if (this.aiGeneratedResponse && this.aiGeneratedResponse.trim() !== '') {\r\n      this.gstDetailedMarkdown = this.aiGeneratedResponse;\r\n      this.isLoadingGstDetails = false;\r\n      return;\r\n    }\r\n    \r\n    // No AI response available - show placeholder message\r\n    this.gstDetailedMarkdown = '## GST Analysis\\n\\nNo AI-generated GST analysis available. Please generate a summary first.';\r\n    this.isLoadingGstDetails = false;\r\n  }\r\n\r\n  private loadGoNoGoSummary(): void {\r\n    // Go/No-Go summary is calculated from data, not loaded from file\r\n    this.goNoGoSummaryMarkdown = '## Decision Summary\\n\\nDecision summary is calculated based on the loan analysis data.';\r\n  }\r\n\r\n  previousSlide(): void {\r\n    if (this.currentSlideIndex > 0) {\r\n      this.currentSlideIndex--;\r\n    }\r\n  }\r\n\r\n  nextSlide(): void {\r\n    if (this.currentSlideIndex < this.visibleSections.length - 1) {\r\n      this.currentSlideIndex++;\r\n    }\r\n  }\r\n\r\n  goToSlide(index: number): void {\r\n    this.currentSlideIndex = index;\r\n  }\r\n\r\n  onBack(): void {\r\n    this.backToSelection.emit();\r\n  }\r\n\r\n  // New header action methods\r\n  getTotalLoanAmount(): number {\r\n    if (!this.loanSummary?.loanFacilityInformation) return 0;\r\n    return this.loanSummary.loanFacilityInformation.reduce(\r\n      (total, facility) => total + facility.amountRequested,\r\n      0\r\n    );\r\n  }\r\n\r\n  onExportReport(): void {\r\n    this.exportReport.emit();\r\n    console.log('Exporting report...');\r\n    // Placeholder - would trigger report export\r\n  }\r\n\r\n  onSubmitDecision(): void {\r\n    this.submitDecision.emit();\r\n    console.log('Submitting decision...');\r\n    // Placeholder - would open decision submission dialog\r\n  }\r\n\r\n  openDocument(docType: string): void {\r\n    console.log('Opening document:', docType);\r\n    \r\n    if (docType === 'process-note') {\r\n      // Process note functionality - placeholder for actual implementation\r\n      console.log('Process note requested - implement document viewer');\r\n      alert('Process Note document viewer - Coming soon!');\r\n      return;\r\n    }\r\n    \r\n    // Placeholder - would open document viewer for other document types\r\n    alert(`Document viewer for ${docType} - Coming soon!`);\r\n  }\r\n\r\n  getDecisionClass(): string {\r\n    switch (this.goNoGoDecision.decision) {\r\n      case 'GO':\r\n        return 'decision-go';\r\n      case 'NO-GO':\r\n        return 'decision-nogo';\r\n      default:\r\n        return 'decision-review';\r\n    }\r\n  }\r\n\r\n  getFactorStatusClass(status: string): string {\r\n    switch (status) {\r\n      case 'pass':\r\n        return 'status-green';\r\n      case 'fail':\r\n        return 'status-red';\r\n      default:\r\n        return 'status-yellow';\r\n    }\r\n  }\r\n\r\n  getCreditScoreClass(score: number): string {\r\n    if (score >= 750) return 'status-green';\r\n    if (score >= 650) return 'status-yellow';\r\n    return 'status-red';\r\n  }\r\n\r\n  getCreditScoreLabel(score: number): string {\r\n    if (score >= 800) return 'Excellent';\r\n    if (score >= 750) return 'Good';\r\n    if (score >= 700) return 'Fair';\r\n    if (score >= 650) return 'Average';\r\n    if (score >= 600) return 'Poor';\r\n    return 'Very Poor';\r\n  }\r\n\r\n  // Credit Score color class per UI Design\r\n  getCreditScoreColorClass(score: number): string {\r\n    if (score >= 800) return 'score-excellent';\r\n    if (score >= 750) return 'score-good';\r\n    if (score >= 700) return 'score-fair';\r\n    if (score >= 650) return 'score-average';\r\n    if (score >= 600) return 'score-poor';\r\n    return 'score-very-poor';\r\n  }\r\n\r\n  getCreditScoreBadgeClass(score: number): string {\r\n    if (score >= 800) return 'badge-excellent';\r\n    if (score >= 750) return 'badge-good';\r\n    if (score >= 700) return 'badge-fair';\r\n    if (score >= 650) return 'badge-average';\r\n    if (score >= 600) return 'badge-poor';\r\n    return 'badge-very-poor';\r\n  }\r\n\r\n  getLoanStatusClass(status: string): string {\r\n    switch (status) {\r\n      case 'Active':\r\n        return 'loan-status-active';\r\n      case 'Closed':\r\n        return 'loan-status-closed';\r\n      case 'Delayed':\r\n        return 'loan-status-delayed';\r\n      default:\r\n        return '';\r\n    }\r\n  }\r\n\r\n  // Director card helper methods\r\n  getDirectorInitials(name: string): string {\r\n    if (!name) return '';\r\n    const parts = name.trim().split(/\\\\s+/);\r\n    if (parts.length === 1) return parts[0].charAt(0).toUpperCase();\r\n    return (parts[0].charAt(0) + parts[parts.length - 1].charAt(0)).toUpperCase();\r\n  }\r\n\r\n  // Risk Rating & Analysis helper methods\r\n  getRiskLevelClass(riskLevel: string): string {\r\n    switch (riskLevel) {\r\n      case 'Low Risk':\r\n        return 'risk-low';\r\n      case 'Medium Risk':\r\n        return 'risk-medium';\r\n      case 'High Risk':\r\n        return 'risk-high';\r\n      default:\r\n        return 'risk-medium';\r\n    }\r\n  }\r\n\r\n  getRiskScoreBarColor(score: number): string {\r\n    if (score >= 75) return 'bar-green';\r\n    if (score >= 60) return 'bar-amber';\r\n    return 'bar-red';\r\n  }\r\n\r\n  getMetricStatusClass(status: string): string {\r\n    switch (status) {\r\n      case 'Strong':\r\n        return 'status-strong';\r\n      case 'Good':\r\n        return 'status-good';\r\n      case 'Adequate':\r\n        return 'status-adequate';\r\n      case 'Weak':\r\n        return 'status-weak';\r\n      default:\r\n        return '';\r\n    }\r\n  }\r\n\r\n  calculateWeightedScore(factors: any[]): number {\r\n    if (!factors || factors.length === 0) return 0;\r\n    const totalWeight = factors.reduce((sum, f) => sum + f.weight, 0);\r\n    const weightedSum = factors.reduce((sum, f) => sum + (f.score * f.weight), 0);\r\n    return Math.round(weightedSum / totalWeight);\r\n  }\r\n\r\n  getGrowthClass(value: number): string {\r\n    return value >= 0 ? 'growth-positive' : 'growth-negative';\r\n  }\r\n\r\n  formatCurrency(amount: number): string {\r\n    return this.loanSummaryService.formatCurrency(amount);\r\n  }\r\n\r\n  formatNumber(num: number): string {\r\n    return this.loanSummaryService.formatNumber(num);\r\n  }\r\n\r\n  // GST Summary helper methods\r\n  formatLakhs(amount: number): string {\r\n    const lakhs = amount / 100000;\r\n    return `₹${lakhs.toFixed(2)}L`;\r\n  }\r\n\r\n  getBarHeight(turnover: number): number {\r\n    // Calculate bar height as percentage based on max turnover in trend\r\n    const maxTurnover = Math.max(\r\n      ...this.loanSummary.gstSummary.turnoverTrend.map((t) => t.turnover)\r\n    );\r\n    return maxTurnover > 0 ? (turnover / maxTurnover) * 100 : 0;\r\n  }\r\n\r\n  getFilingStatusClass(status: string): string {\r\n    switch (status) {\r\n      case 'Filed':\r\n        return 'status-filed';\r\n      case 'Pending':\r\n        return 'status-pending';\r\n      case 'Delayed':\r\n        return 'status-delayed';\r\n      default:\r\n        return '';\r\n    }\r\n  }\r\n\r\n  // Combined data from turnoverTrend for Monthly Returns table\r\n  getCombinedMonthlyReturnsData(): Array<{\r\n    month: string;\r\n    turnover: number;\r\n    totalSales: number;\r\n    totalPurchases: number;\r\n    totalTaxPaid: number;\r\n  }> {\r\n    const turnoverTrend = this.loanSummary.gstSummary.turnoverTrend || [];\r\n    const monthlyReturns = this.loanSummary.gstSummary.monthlyReturns || [];\r\n\r\n    // Create a map for quick lookup of monthly returns by month\r\n    const returnsMap = new Map(\r\n      monthlyReturns.map((r) => [r.month, r])\r\n    );\r\n\r\n    // Map turnover trend data and merge with monthly returns if available\r\n    return turnoverTrend.map((trend) => {\r\n      const returns = returnsMap.get(trend.month);\r\n      return {\r\n        month: trend.month,\r\n        turnover: trend.turnover,\r\n        totalSales: returns?.totalSales || trend.turnover * 0.9,\r\n        totalPurchases: returns?.totalPurchases || trend.turnover * 0.65,\r\n        totalTaxPaid: returns?.totalTaxPaid || trend.turnover * 0.05,\r\n      };\r\n    });\r\n  }\r\n\r\n  // Filing history from turnover trend data\r\n  getCombinedFilingHistoryData(): Array<{\r\n    period: string;\r\n    returnType: string;\r\n    filedDate: string;\r\n    status: 'Filed' | 'Pending' | 'Delayed';\r\n  }> {\r\n    const turnoverTrend = this.loanSummary.gstSummary.turnoverTrend || [];\r\n    const filingHistory = this.loanSummary.gstSummary.filingHistory || [];\r\n\r\n    // Create a map for quick lookup of filing history by period\r\n    const historyMap = new Map(\r\n      filingHistory.map((h) => [h.period, h])\r\n    );\r\n\r\n    // Map turnover trend data to filing history format\r\n    return turnoverTrend.map((trend, index) => {\r\n      const existing = historyMap.get(trend.month);\r\n      if (existing) {\r\n        return existing;\r\n      }\r\n      // Generate filing data from turnover trend\r\n      return {\r\n        period: trend.month,\r\n        returnType: 'GSTR-3B',\r\n        filedDate: this.generateFilingDate(trend.month),\r\n        status: this.getRandomFilingStatus(index) as 'Filed' | 'Pending' | 'Delayed',\r\n      };\r\n    });\r\n  }\r\n\r\n  private generateFilingDate(month: string): string {\r\n    // Parse month like \"Jan-25\" and create a filing date\r\n    const parts = month.split('-');\r\n    if (parts.length === 2) {\r\n      const monthNames: { [key: string]: number } = {\r\n        'Jan': 0, 'Feb': 1, 'Mar': 2, 'Apr': 3, 'May': 4, 'Jun': 5,\r\n        'Jul': 6, 'Aug': 7, 'Sep': 8, 'Oct': 9, 'Nov': 10, 'Dec': 11\r\n      };\r\n      const monthNum = monthNames[parts[0]];\r\n      const year = 2000 + parseInt(parts[1], 10);\r\n      // Filing date is typically 20th of next month\r\n      const filingDate = new Date(year, monthNum + 1, 20);\r\n      return filingDate.toISOString().split('T')[0];\r\n    }\r\n    return new Date().toISOString().split('T')[0];\r\n  }\r\n\r\n  private getRandomFilingStatus(index: number): string {\r\n    // Most should be Filed, occasional Delayed\r\n    if (index % 7 === 3) return 'Delayed';\r\n    return 'Filed';\r\n  }\r\n\r\n  // Pagination methods for Monthly Returns\r\n  getPaginatedMonthlyReturns(): Array<{\r\n    month: string;\r\n    turnover: number;\r\n    totalSales: number;\r\n    totalPurchases: number;\r\n    totalTaxPaid: number;\r\n  }> {\r\n    const data = this.getCombinedMonthlyReturnsData();\r\n    const start = this.monthlyReturnsPageIndex * this.itemsPerPage;\r\n    return data.slice(start, start + this.itemsPerPage);\r\n  }\r\n\r\n  canGoPrevMonthlyReturns(): boolean {\r\n    return this.monthlyReturnsPageIndex > 0;\r\n  }\r\n\r\n  canGoNextMonthlyReturns(): boolean {\r\n    const data = this.getCombinedMonthlyReturnsData();\r\n    return (this.monthlyReturnsPageIndex + 1) * this.itemsPerPage < data.length;\r\n  }\r\n\r\n  prevMonthlyReturnsPage(): void {\r\n    if (this.canGoPrevMonthlyReturns()) {\r\n      this.monthlyReturnsPageIndex--;\r\n    }\r\n  }\r\n\r\n  nextMonthlyReturnsPage(): void {\r\n    if (this.canGoNextMonthlyReturns()) {\r\n      this.monthlyReturnsPageIndex++;\r\n    }\r\n  }\r\n\r\n  getMonthlyReturnsPaginationInfo(): string {\r\n    const data = this.getCombinedMonthlyReturnsData();\r\n    const start = this.monthlyReturnsPageIndex * this.itemsPerPage + 1;\r\n    const end = Math.min((this.monthlyReturnsPageIndex + 1) * this.itemsPerPage, data.length);\r\n    return `${start}-${end} of ${data.length}`;\r\n  }\r\n\r\n  // Pagination methods for Filing History\r\n  getPaginatedFilingHistory(): Array<{\r\n    period: string;\r\n    returnType: string;\r\n    filedDate: string;\r\n    status: 'Filed' | 'Pending' | 'Delayed';\r\n  }> {\r\n    const data = this.getCombinedFilingHistoryData();\r\n    const start = this.filingHistoryPageIndex * this.itemsPerPage;\r\n    return data.slice(start, start + this.itemsPerPage);\r\n  }\r\n\r\n  canGoPrevFilingHistory(): boolean {\r\n    return this.filingHistoryPageIndex > 0;\r\n  }\r\n\r\n  canGoNextFilingHistory(): boolean {\r\n    const data = this.getCombinedFilingHistoryData();\r\n    return (this.filingHistoryPageIndex + 1) * this.itemsPerPage < data.length;\r\n  }\r\n\r\n  prevFilingHistoryPage(): void {\r\n    if (this.canGoPrevFilingHistory()) {\r\n      this.filingHistoryPageIndex--;\r\n    }\r\n  }\r\n\r\n  nextFilingHistoryPage(): void {\r\n    if (this.canGoNextFilingHistory()) {\r\n      this.filingHistoryPageIndex++;\r\n    }\r\n  }\r\n\r\n  getFilingHistoryPaginationInfo(): string {\r\n    const data = this.getCombinedFilingHistoryData();\r\n    const start = this.filingHistoryPageIndex * this.itemsPerPage + 1;\r\n    const end = Math.min((this.filingHistoryPageIndex + 1) * this.itemsPerPage, data.length);\r\n    return `${start}-${end} of ${data.length}`;\r\n  }\r\n\r\n  // ========== Settings Panel Methods ==========\r\n\r\n  openSettingsPanel(): void {\r\n    // Sync ALL settings FROM the service (in case another component updated them)\r\n    this.selectedModel = this.loanSummaryService.selectedModel;\r\n    this.chunkSize = this.loanSummaryService.chunk_size;\r\n    this.chunkOverlap = this.loanSummaryService.chunk_overlap;\r\n    this.topK = this.loanSummaryService.top_k;\r\n    this.selectedEmbeddingModel = this.loanSummaryService.embedding_model;\r\n    this.selectedSearchType = this.loanSummaryService.search_type;\r\n    this.selectedVectorStore = this.loanSummaryService.storage_type;\r\n    // Sync document type selections from service\r\n    this.selectedGst = this.loanSummaryService.selectedGst;\r\n    this.selectedBureau = this.loanSummaryService.selectedBureau;\r\n    this.selectedFinancial = this.loanSummaryService.selectedFinancial;\r\n    // Sync prompt templates from service\r\n    this.gstPromptTemplate = this.loanSummaryService.gstPromptTemplate || this.gstPromptTemplate;\r\n    this.bureauPromptTemplate = this.loanSummaryService.bureauPromptTemplate || this.bureauPromptTemplate;\r\n    this.financialPromptTemplate = this.loanSummaryService.financialPromptTemplate || this.financialPromptTemplate;\r\n    \r\n    // Backup current values before opening\r\n    this.backupSelectedModel = this.selectedModel;\r\n    this.backupPromptTemplate = this.promptTemplate;\r\n    this.backupChunkSize = this.chunkSize;\r\n    this.backupChunkOverlap = this.chunkOverlap;\r\n    this.backupTopK = this.topK;\r\n    this.backupEmbeddingModel = this.selectedEmbeddingModel;\r\n    this.backupSearchType = this.selectedSearchType;\r\n    this.backupVectorStore = this.selectedVectorStore;\r\n    this.backupSelectedGst = this.selectedGst;\r\n    this.backupSelectedBureau = this.selectedBureau;\r\n    this.backupSelectedFinancial = this.selectedFinancial;\r\n    this.backupGstPromptTemplate = this.gstPromptTemplate;\r\n    this.backupBureauPromptTemplate = this.bureauPromptTemplate;\r\n    this.backupFinancialPromptTemplate = this.financialPromptTemplate;\r\n    this.isSettingsPanelOpen = true;\r\n    \r\n    // Initialize the panel component with current settings\r\n    if (this.aiSettingsPanel) {\r\n      this.aiSettingsPanel.initializeSettings();\r\n    }\r\n  }\r\n\r\n  closeSettingsPanel(): void {\r\n    // Restore backup values when closing without save\r\n    this.selectedModel = this.backupSelectedModel;\r\n    this.promptTemplate = this.backupPromptTemplate;\r\n    this.chunkSize = this.backupChunkSize;\r\n    this.chunkOverlap = this.backupChunkOverlap;\r\n    this.topK = this.backupTopK;\r\n    this.selectedEmbeddingModel = this.backupEmbeddingModel;\r\n    this.selectedSearchType = this.backupSearchType;\r\n    this.selectedVectorStore = this.backupVectorStore;\r\n    this.selectedGst = this.backupSelectedGst;\r\n    this.selectedBureau = this.backupSelectedBureau;\r\n    this.selectedFinancial = this.backupSelectedFinancial;\r\n    this.gstPromptTemplate = this.backupGstPromptTemplate;\r\n    this.bureauPromptTemplate = this.backupBureauPromptTemplate;\r\n    this.financialPromptTemplate = this.backupFinancialPromptTemplate;\r\n    this.isSettingsPanelOpen = false;\r\n    this.isEditingPrompt = false;\r\n  }\r\n\r\n  onSettingsPanelClose(): void {\r\n    this.isSettingsPanelOpen = false;\r\n  }\r\n\r\n  onSettingsPanelSaved(settings: AiSettingsPanelData): void {\r\n    // Sync settings from the panel to local state\r\n    this.selectedModel = settings.selectedModel;\r\n    this.chunkSize = settings.chunkSize;\r\n    this.chunkOverlap = settings.chunkOverlap;\r\n    this.topK = settings.topK;\r\n    this.selectedEmbeddingModel = settings.embeddingModel;\r\n    this.selectedSearchType = settings.searchType;\r\n    this.selectedVectorStore = settings.vectorStore;\r\n    this.selectedGst = settings.selectedGst;\r\n    this.selectedBureau = settings.selectedBureau;\r\n    this.selectedFinancial = settings.selectedFinancial;\r\n    this.gstPromptTemplate = settings.gstPromptTemplate;\r\n    this.bureauPromptTemplate = settings.bureauPromptTemplate;\r\n    this.financialPromptTemplate = settings.financialPromptTemplate;\r\n    \r\n    // Close the panel first\r\n    this.isSettingsPanelOpen = false;\r\n    \r\n    // Call the existing saveAiSettings logic (which handles API calls)\r\n    this.saveAiSettings();\r\n  }\r\n\r\n  toggleEditPrompt(): void {\r\n    this.isEditingPrompt = !this.isEditingPrompt;\r\n  }\r\n\r\n  loadDefaultPromptTemplate(): void {\r\n    this.promptTemplate = this.defaultPromptTemplate;\r\n    this.isEditingPrompt = true;\r\n  }\r\n\r\n  saveAiSettings(): void {\r\n    // Validate that at least one document type has a prompt\r\n    const hasGstPrompt = this.selectedGst && this.gstPromptTemplate?.trim();\r\n    const hasBureauPrompt = this.selectedBureau && this.bureauPromptTemplate?.trim();\r\n    const hasFinancialPrompt = this.selectedFinancial && this.financialPromptTemplate?.trim();\r\n    \r\n    if (this.selectedGst && !this.gstPromptTemplate?.trim()) {\r\n      alert('GST prompt template cannot be empty when GST is selected.');\r\n      return;\r\n    }\r\n    if (this.selectedBureau && !this.bureauPromptTemplate?.trim()) {\r\n      alert('Bureau prompt template cannot be empty when Bureau is selected.');\r\n      return;\r\n    }\r\n    if (this.selectedFinancial && !this.financialPromptTemplate?.trim()) {\r\n      alert('Financial prompt template cannot be empty when Financial Statement is selected.');\r\n      return;\r\n    }\r\n\r\n    const settings = {\r\n      selectedModel: this.selectedModel,\r\n      promptTemplate: this.promptTemplate,\r\n      chunkSize: this.chunkSize,\r\n      chunkOverlap: this.chunkOverlap,\r\n      topK: this.topK,\r\n      embeddingModel: this.selectedEmbeddingModel,\r\n      searchType: this.selectedSearchType,\r\n      vectorStore: this.selectedVectorStore,\r\n      selectedGst: this.selectedGst,\r\n      selectedBureau: this.selectedBureau,\r\n      selectedFinancial: this.selectedFinancial,\r\n      gstPromptTemplate: this.gstPromptTemplate,\r\n      bureauPromptTemplate: this.bureauPromptTemplate,\r\n      financialPromptTemplate: this.financialPromptTemplate\r\n    };\r\n\r\n    try {\r\n      localStorage.setItem(this.settingsStorageKey, JSON.stringify(settings));\r\n      \r\n      // Save GST prompt to history if changed and not empty\r\n      if (this.selectedGst && this.gstPromptTemplate?.trim()) {\r\n        this.addToGstPromptHistory(this.gstPromptTemplate, 'typed');\r\n      }\r\n      \r\n      // Save Bureau prompt to history if changed and not empty\r\n      if (this.selectedBureau && this.bureauPromptTemplate?.trim()) {\r\n        this.addToBureauPromptHistory(this.bureauPromptTemplate, 'typed');\r\n      }\r\n\r\n      // Save Financial prompt to history if changed and not empty\r\n      if (this.selectedFinancial && this.financialPromptTemplate?.trim()) {\r\n        this.addToFinancialPromptHistory(this.financialPromptTemplate, 'typed');\r\n      }\r\n      \r\n      // Update backup to match saved values\r\n      this.backupSelectedModel = this.selectedModel;\r\n      this.backupPromptTemplate = this.promptTemplate;\r\n      this.backupChunkSize = this.chunkSize;\r\n      this.backupChunkOverlap = this.chunkOverlap;\r\n      this.backupTopK = this.topK;\r\n      this.backupEmbeddingModel = this.selectedEmbeddingModel;\r\n      this.backupSearchType = this.selectedSearchType;\r\n      this.backupVectorStore = this.selectedVectorStore;\r\n      this.backupSelectedGst = this.selectedGst;\r\n      this.backupSelectedBureau = this.selectedBureau;\r\n      this.backupSelectedFinancial = this.selectedFinancial;\r\n      this.backupGstPromptTemplate = this.gstPromptTemplate;\r\n      this.backupBureauPromptTemplate = this.bureauPromptTemplate;\r\n      this.backupFinancialPromptTemplate = this.financialPromptTemplate;\r\n      this.isEditingPrompt = false;\r\n      \r\n      // Sync ALL settings to the shared service so other components stay in sync\r\n      this.loanSummaryService.selectedModel = this.selectedModel;\r\n      this.loanSummaryService.chunk_size = this.chunkSize;\r\n      this.loanSummaryService.chunk_overlap = this.chunkOverlap;\r\n      this.loanSummaryService.top_k = this.topK;\r\n      this.loanSummaryService.embedding_model = this.selectedEmbeddingModel;\r\n      this.loanSummaryService.search_type = this.selectedSearchType;\r\n      this.loanSummaryService.storage_type = this.selectedVectorStore;\r\n      // Sync document type selections to service\r\n      this.loanSummaryService.selectedGst = this.selectedGst;\r\n      this.loanSummaryService.selectedBureau = this.selectedBureau;\r\n      this.loanSummaryService.selectedFinancial = this.selectedFinancial;\r\n      // Sync prompt templates to service\r\n      this.loanSummaryService.gstPromptTemplate = this.gstPromptTemplate;\r\n      this.loanSummaryService.bureauPromptTemplate = this.bureauPromptTemplate;\r\n      this.loanSummaryService.financialPromptTemplate = this.financialPromptTemplate;\r\n      \r\n      // Close the side panel\r\n      this.isSettingsPanelOpen = false;\r\n      \r\n      // Always show saving modal and call API when Save is clicked\r\n      this.isSavingSettings = true;\r\n      this.savingProgress = 0;\r\n      this.startSavingProgress();\r\n      \r\n      if (this.loanSummaryService.isAI) {\r\n        // Log proposalNo for debugging\r\n        console.log('🔍 [PROPOSAL_NO] proposalNo being sent:', this.proposalNo);\r\n        \r\n        // Use multi-model inference based on checkbox selection\r\n        if (this.isMultipleSelected()) {\r\n          // Multiple selected - call multi-model inference\r\n          const prompts: { gst?: string; bureau?: string; financial?: string } = {};\r\n          \r\n          if (this.selectedGst) {\r\n            prompts.gst = this.gstPromptTemplate || this.defaultGstPromptTemplate;\r\n          }\r\n          if (this.selectedBureau) {\r\n            prompts.bureau = this.bureauPromptTemplate || this.defaultBureauPromptTemplate;\r\n          }\r\n          if (this.selectedFinancial) {\r\n            prompts.financial = this.financialPromptTemplate || this.defaultFinancialPromptTemplate;\r\n          }\r\n          \r\n          // Call multi-model inference API (no separate quick summary call)\r\n          this.loanSummaryService.callMultiModelInference(\r\n            prompts,\r\n            this.selectedModel,\r\n            this.proposalNo,\r\n            this.documents\r\n          ).subscribe({\r\n            next: (response) => {\r\n              console.log('Multi-model inference response received:', response);\r\n              \r\n              if (response.status === 'success') {\r\n                if (response.responses.gst?.status === 'success') {\r\n                  this.gstDetailedMarkdown = response.responses.gst.response;\r\n                }\r\n                if (response.responses.bureau?.status === 'success') {\r\n                  this.bureauDetailedMarkdown = response.responses.bureau.response;\r\n                }\r\n                if (response.responses.financial?.status === 'success') {\r\n                  this.financialDetailedMarkdown = response.responses.financial.response;\r\n                }\r\n                if (response.responses.go_nogo?.status === 'success') {\r\n                  this.goNoGoSummaryMarkdown = response.responses.go_nogo.response;\r\n                  console.log('GO/NO-GO decision received:', response.responses.go_nogo.response.substring(0, 200));\r\n                }\r\n                \r\n                // Extract quick_summary from response if available\r\n                if (response.quick_summary) {\r\n                  if (response.quick_summary.gst) {\r\n                    this.gstQuickSummary = response.quick_summary.gst;\r\n                  }\r\n                  if (response.quick_summary.bureau) {\r\n                    this.bureauQuickSummary = response.quick_summary.bureau;\r\n                  }\r\n                  if (response.quick_summary.financial) {\r\n                    this.financialQuickSummary = response.quick_summary.financial;\r\n                  }\r\n                  console.log('📊 [QUICK_SUMMARY] Extracted from multi-model response:', response.quick_summary);\r\n                }\r\n              }\r\n              \r\n              this.completeSavingProgress();\r\n              this.refreshViews();\r\n            },\r\n            error: (error) => {\r\n              console.error('Multi-model inference API error:', error);\r\n              this.completeSavingProgress();\r\n              this.showErrorToastNotification(this.extractErrorMessage(error));\r\n              this.loadFallbackFiles();\r\n            }\r\n          });\r\n        } else {\r\n          // Single document mode\r\n          const documentType = this.selectedGst ? 'gst' : (this.selectedBureau ? 'bureau' : 'financial');\r\n          const prompt = this.selectedGst\r\n            ? (this.gstPromptTemplate || this.defaultGstPromptTemplate)\r\n            : (this.selectedBureau \r\n                ? (this.bureauPromptTemplate || this.defaultBureauPromptTemplate)\r\n                : (this.financialPromptTemplate || this.defaultFinancialPromptTemplate));\r\n          \r\n          // Call single model inference API (no separate quick summary call)\r\n          this.loanSummaryService.callSingleModelInference(prompt, documentType, this.selectedModel, this.proposalNo, this.documents)\r\n            .subscribe({\r\n              next: (response) => {\r\n                console.log('Single model inference response received:', response);\r\n                \r\n                if (response.status === 'success') {\r\n                  if (documentType === 'gst' && response.responses.gst?.status === 'success') {\r\n                    this.gstDetailedMarkdown = response.responses.gst.response;\r\n                  } else if (documentType === 'bureau' && response.responses.bureau?.status === 'success') {\r\n                    this.bureauDetailedMarkdown = response.responses.bureau.response;\r\n                  } else if (documentType === 'financial' && response.responses.financial?.status === 'success') {\r\n                    this.financialDetailedMarkdown = response.responses.financial.response;\r\n                  }\r\n                  \r\n                  // Extract quick_summary from response if available\r\n                  if (response.quick_summary) {\r\n                    if (documentType === 'gst' && response.quick_summary.gst) {\r\n                      this.gstQuickSummary = response.quick_summary.gst;\r\n                    } else if (documentType === 'bureau' && response.quick_summary.bureau) {\r\n                      this.bureauQuickSummary = response.quick_summary.bureau;\r\n                    } else if (documentType === 'financial' && response.quick_summary.financial) {\r\n                      this.financialQuickSummary = response.quick_summary.financial;\r\n                    }\r\n                    console.log('📊 [QUICK_SUMMARY] Extracted from single-model response:', response.quick_summary);\r\n                  }\r\n                }\r\n                \r\n                this.completeSavingProgress();\r\n                this.refreshViews();\r\n              },\r\n              error: (error) => {\r\n                console.error('Single model inference API error:', error);\r\n                this.completeSavingProgress();\r\n                this.showErrorToastNotification(this.extractErrorMessage(error));\r\n                this.loadFallbackFiles();\r\n              }\r\n            });\r\n        }\r\n      } else {\r\n        // Load from local MD files when isAI is false\r\n        console.log('isAI is false - Loading from local MD files');\r\n        this.loadFallbackFiles();\r\n      }\r\n      \r\n      console.log('AI settings saved to cache.');\r\n    } catch (e) {\r\n      console.error('Failed to save settings to localStorage:', e);\r\n      alert('Failed to save settings. Please try again.');\r\n    }\r\n  }\r\n  \r\n  private refreshViews(): void {\r\n    // Refresh GST view if showing detailed\r\n    if (this.selectedGst && this.gstViewMode === 'detailed') {\r\n      this.gstViewMode = 'overview';\r\n      setTimeout(() => {\r\n        this.gstViewMode = 'detailed';\r\n      }, 0);\r\n    }\r\n    // Refresh Bureau view if showing detailed\r\n    if (this.selectedBureau && this.bureauViewMode === 'detailed') {\r\n      this.bureauViewMode = 'overview';\r\n      setTimeout(() => {\r\n        this.bureauViewMode = 'detailed';\r\n      }, 0);\r\n    }\r\n    // Refresh Financial view if showing detailed\r\n    if (this.selectedFinancial && this.financialViewMode === 'detailed') {\r\n      this.financialViewMode = 'overview';\r\n      setTimeout(() => {\r\n        this.financialViewMode = 'detailed';\r\n      }, 0);\r\n    }\r\n  }\r\n  \r\n  private loadFallbackFiles(): void {\r\n    let pendingLoads = 0;\r\n    if (this.selectedGst) pendingLoads++;\r\n    if (this.selectedBureau) pendingLoads++;\r\n    if (this.selectedFinancial) pendingLoads++;\r\n    \r\n    let completedLoads = 0;\r\n    \r\n    const checkComplete = () => {\r\n      completedLoads++;\r\n      if (completedLoads >= pendingLoads) {\r\n        this.completeSavingProgress();\r\n      }\r\n    };\r\n    \r\n    if (pendingLoads === 0) {\r\n      this.completeSavingProgress();\r\n      return;\r\n    }\r\n    \r\n    // Use placeholder content instead of loading from assets\r\n    if (this.selectedGst) {\r\n      this.gstDetailedMarkdown = '## GST Analysis\\n\\nNo AI-generated GST analysis available. Please generate a summary first.';\r\n      checkComplete();\r\n    }\r\n    \r\n    if (this.selectedBureau) {\r\n      this.bureauDetailedMarkdown = '## Bureau Analysis\\n\\nNo AI-generated Bureau analysis available. Please generate a summary first.';\r\n      checkComplete();\r\n    }\r\n    \r\n    if (this.selectedFinancial) {\r\n      this.financialDetailedMarkdown = '## Financial Analysis\\n\\nNo AI-generated Financial analysis available. Please generate a summary first.';\r\n      checkComplete();\r\n    }\r\n  }\r\n\r\n  loadAiSettingsFromCache(): void {\r\n    try {\r\n      const cached = localStorage.getItem(this.settingsStorageKey);\r\n      if (cached) {\r\n        const settings = JSON.parse(cached);\r\n        this.selectedModel = settings.selectedModel || 'llama3.2:3b';\r\n        this.promptTemplate = settings.promptTemplate || this.defaultPromptTemplate;\r\n        this.chunkSize = settings.chunkSize || 500;\r\n        this.chunkOverlap = settings.chunkOverlap || 100;\r\n        this.topK = settings.topK || 10;\r\n        this.selectedEmbeddingModel = settings.embeddingModel || 'embeddinggemma:300m';\r\n        this.selectedSearchType = settings.searchType || 'similarity';\r\n        this.selectedVectorStore = settings.vectorStore || 'pgvector';\r\n        // Load GST/Bureau/Financial selection and prompts\r\n        this.selectedGst = settings.selectedGst ?? true;\r\n        this.selectedBureau = settings.selectedBureau ?? false;\r\n        this.selectedFinancial = settings.selectedFinancial ?? false;\r\n        this.gstPromptTemplate = settings.gstPromptTemplate || this.defaultGstPromptTemplate;\r\n        this.bureauPromptTemplate = settings.bureauPromptTemplate || this.defaultBureauPromptTemplate;\r\n        this.financialPromptTemplate = settings.financialPromptTemplate || this.defaultFinancialPromptTemplate;\r\n      } else {\r\n        // No cached settings, use defaults\r\n        this.promptTemplate = this.defaultPromptTemplate;\r\n        this.gstPromptTemplate = this.defaultGstPromptTemplate;\r\n        this.bureauPromptTemplate = this.defaultBureauPromptTemplate;\r\n        this.financialPromptTemplate = this.defaultFinancialPromptTemplate;\r\n      }\r\n      // Initialize backup with loaded values\r\n      this.backupSelectedModel = this.selectedModel;\r\n      this.backupPromptTemplate = this.promptTemplate;\r\n      this.backupChunkSize = this.chunkSize;\r\n      this.backupChunkOverlap = this.chunkOverlap;\r\n      this.backupTopK = this.topK;\r\n      this.backupEmbeddingModel = this.selectedEmbeddingModel;\r\n      this.backupSearchType = this.selectedSearchType;\r\n      this.backupVectorStore = this.selectedVectorStore;\r\n      \r\n      // Sync ALL settings TO the service so other components can access them\r\n      this.loanSummaryService.selectedModel = this.selectedModel;\r\n      this.loanSummaryService.chunk_size = this.chunkSize;\r\n      this.loanSummaryService.chunk_overlap = this.chunkOverlap;\r\n      this.loanSummaryService.top_k = this.topK;\r\n      this.loanSummaryService.embedding_model = this.selectedEmbeddingModel;\r\n      this.loanSummaryService.search_type = this.selectedSearchType;\r\n      this.loanSummaryService.storage_type = this.selectedVectorStore;\r\n      // Sync document type selections to service\r\n      this.loanSummaryService.selectedGst = this.selectedGst;\r\n      this.loanSummaryService.selectedBureau = this.selectedBureau;\r\n      this.loanSummaryService.selectedFinancial = this.selectedFinancial;\r\n      // Sync prompt templates to service\r\n      this.loanSummaryService.gstPromptTemplate = this.gstPromptTemplate;\r\n      this.loanSummaryService.bureauPromptTemplate = this.bureauPromptTemplate;\r\n      this.loanSummaryService.financialPromptTemplate = this.financialPromptTemplate;\r\n      \r\n      // Load prompt history\r\n      this.loadPromptHistory();\r\n      // Load separate GST, Bureau, and Financial prompt histories\r\n      this.loadGstPromptHistory();\r\n      this.loadBureauPromptHistory();\r\n      this.loadFinancialPromptHistory();\r\n    } catch (e) {\r\n      console.error('Failed to load settings from localStorage:', e);\r\n      this.promptTemplate = this.defaultPromptTemplate;\r\n      this.backupSelectedModel = this.selectedModel;\r\n      this.backupPromptTemplate = this.promptTemplate;\r\n    }\r\n  }\r\n\r\n  resetAiSettings(): void {\r\n    this.selectedModel = 'llama3.2:3b';\r\n    this.promptTemplate = this.defaultPromptTemplate;\r\n    this.chunkSize = 500;\r\n    this.chunkOverlap = 100;\r\n    this.topK = 10;\r\n    this.selectedEmbeddingModel = 'embeddinggemma:300m';\r\n    this.selectedSearchType = 'similarity';\r\n    this.selectedVectorStore = 'inmemory';\r\n    this.isEditingPrompt = false;\r\n    \r\n    // Update backup to match reset values\r\n    this.backupSelectedModel = this.selectedModel;\r\n    this.backupPromptTemplate = this.promptTemplate;\r\n    this.backupChunkSize = this.chunkSize;\r\n    this.backupChunkOverlap = this.chunkOverlap;\r\n    this.backupTopK = this.topK;\r\n    this.backupEmbeddingModel = this.selectedEmbeddingModel;\r\n    this.backupSearchType = this.selectedSearchType;\r\n    this.backupVectorStore = this.selectedVectorStore;\r\n    \r\n    // Also clear from localStorage\r\n    try {\r\n      localStorage.removeItem(this.settingsStorageKey);\r\n      console.log('AI settings reset to defaults.');\r\n    } catch (e) {\r\n      console.error('Failed to clear settings from localStorage:', e);\r\n    }\r\n  }\r\n\r\n  // Slider label formatter for chunk overlap\r\n  formatSliderLabel(value: number): string {\r\n    return `${value}`;\r\n  }\r\n\r\n  // Progress bar control for saving settings\r\n  private startSavingProgress(): void {\r\n    this.savingProgress = 0;\r\n    this.savingProgressInterval = setInterval(() => {\r\n      if (this.savingProgress < 85) {\r\n        // Slower as we approach 85%\r\n        const increment = this.savingProgress < 50 ? 3 : this.savingProgress < 70 ? 2 : 1;\r\n        this.savingProgress = Math.min(this.savingProgress + increment, 85);\r\n      }\r\n    }, 150);\r\n  }\r\n\r\n  private completeSavingProgress(): void {\r\n    // Clear the slow progress interval\r\n    if (this.savingProgressInterval) {\r\n      clearInterval(this.savingProgressInterval);\r\n      this.savingProgressInterval = null;\r\n    }\r\n    \r\n    // Quickly complete to 100%\r\n    const completeInterval = setInterval(() => {\r\n      if (this.savingProgress < 100) {\r\n        this.savingProgress = Math.min(this.savingProgress + 5, 100);\r\n      } else {\r\n        clearInterval(completeInterval);\r\n        // Hide the modal after a brief delay\r\n        setTimeout(() => {\r\n          this.isSavingSettings = false;\r\n          this.savingProgress = 0;\r\n        }, 300);\r\n      }\r\n    }, 50);\r\n  }\r\n\r\n  triggerFileUpload(): void {\r\n    this.promptFileInput?.nativeElement?.click();\r\n  }\r\n\r\n  onPromptFileUpload(event: Event): void {\r\n    const input = event.target as HTMLInputElement;\r\n    const file = input.files?.[0];\r\n\r\n    if (!file) return;\r\n\r\n    // Validate file type\r\n    if (!file.name.toLowerCase().endsWith('.txt')) {\r\n      alert('Please upload a .txt file.');\r\n      input.value = '';\r\n      return;\r\n    }\r\n\r\n    // Validate file size (max 1 MB)\r\n    const maxSizeBytes = 1 * 1024 * 1024;\r\n    if (file.size > maxSizeBytes) {\r\n      alert('File size exceeds 1 MB limit.');\r\n      input.value = '';\r\n      return;\r\n    }\r\n\r\n    const reader = new FileReader();\r\n    reader.onload = () => {\r\n      const content = reader.result as string;\r\n      if (content && content.trim()) {\r\n        this.promptTemplate = content.trim();\r\n        this.isEditingPrompt = true;\r\n        console.log('Prompt template loaded from file.');\r\n      } else {\r\n        alert('The uploaded file is empty.');\r\n      }\r\n    };\r\n    reader.onerror = () => {\r\n      alert('Failed to read file.');\r\n    };\r\n    reader.readAsText(file);\r\n\r\n    // Reset input to allow re-uploading same file\r\n    input.value = '';\r\n  }\r\n\r\n  // ========== Document Type Checkbox Methods ==========\r\n  \r\n  toggleGstSelection(): void {\r\n    // Prevent deselecting if it's the only selected option\r\n    if (this.selectedGst && !this.selectedBureau && !this.selectedFinancial) {\r\n      return; // Cannot deselect the only selected option\r\n    }\r\n    this.selectedGst = !this.selectedGst;\r\n  }\r\n  \r\n  toggleBureauSelection(): void {\r\n    // Prevent deselecting if it's the only selected option\r\n    if (this.selectedBureau && !this.selectedGst && !this.selectedFinancial) {\r\n      return; // Cannot deselect the only selected option\r\n    }\r\n    this.selectedBureau = !this.selectedBureau;\r\n  }\r\n\r\n  toggleFinancialSelection(): void {\r\n    // Prevent deselecting if it's the only selected option\r\n    if (this.selectedFinancial && !this.selectedGst && !this.selectedBureau) {\r\n      return; // Cannot deselect the only selected option\r\n    }\r\n    this.selectedFinancial = !this.selectedFinancial;\r\n    \r\n    // Load default prompt if Financial is selected and prompt is empty\r\n    if (this.selectedFinancial && !this.financialPromptTemplate?.trim()) {\r\n      this.financialPromptTemplate = this.defaultFinancialPromptTemplate;\r\n    }\r\n  }\r\n  \r\n  isBothSelected(): boolean {\r\n    return this.selectedGst && this.selectedBureau;\r\n  }\r\n\r\n  isMultipleSelected(): boolean {\r\n    const count = (this.selectedGst ? 1 : 0) + (this.selectedBureau ? 1 : 0) + (this.selectedFinancial ? 1 : 0);\r\n    return count >= 2;\r\n  }\r\n  \r\n  isOnlyGstSelected(): boolean {\r\n    return this.selectedGst && !this.selectedBureau && !this.selectedFinancial;\r\n  }\r\n  \r\n  isOnlyBureauSelected(): boolean {\r\n    return !this.selectedGst && this.selectedBureau && !this.selectedFinancial;\r\n  }\r\n\r\n  isOnlyFinancialSelected(): boolean {\r\n    return !this.selectedGst && !this.selectedBureau && this.selectedFinancial;\r\n  }\r\n  \r\n  loadDefaultGstPromptTemplate(): void {\r\n    this.gstPromptTemplate = this.defaultGstPromptTemplate;\r\n  }\r\n  \r\n  loadDefaultBureauPromptTemplate(): void {\r\n    this.bureauPromptTemplate = this.defaultBureauPromptTemplate;\r\n  }\r\n\r\n  loadDefaultFinancialPromptTemplate(): void {\r\n    this.financialPromptTemplate = this.defaultFinancialPromptTemplate;\r\n  }\r\n\r\n  // ========== GST Prompt File Upload Methods ==========\r\n\r\n  triggerGstPromptFileUpload(): void {\r\n    this.gstPromptFileInput?.nativeElement?.click();\r\n  }\r\n\r\n  onGstPromptFileUpload(event: Event): void {\r\n    const input = event.target as HTMLInputElement;\r\n    const file = input.files?.[0];\r\n\r\n    if (!file) return;\r\n\r\n    if (!file.name.toLowerCase().endsWith('.txt')) {\r\n      alert('Please upload a .txt file.');\r\n      input.value = '';\r\n      return;\r\n    }\r\n\r\n    const maxSizeBytes = 1 * 1024 * 1024;\r\n    if (file.size > maxSizeBytes) {\r\n      alert('File size exceeds 1 MB limit.');\r\n      input.value = '';\r\n      return;\r\n    }\r\n\r\n    const reader = new FileReader();\r\n    reader.onload = () => {\r\n      const content = reader.result as string;\r\n      if (content && content.trim()) {\r\n        this.gstPromptTemplate = content.trim();\r\n        this.addToGstPromptHistory(this.gstPromptTemplate, 'uploaded');\r\n        console.log('GST Prompt template loaded from file.');\r\n      } else {\r\n        alert('The uploaded file is empty.');\r\n      }\r\n    };\r\n    reader.onerror = () => {\r\n      alert('Failed to read file.');\r\n    };\r\n    reader.readAsText(file);\r\n    input.value = '';\r\n  }\r\n\r\n  // ========== Bureau Prompt File Upload Methods ==========\r\n\r\n  triggerBureauPromptFileUpload(): void {\r\n    this.bureauPromptFileInput?.nativeElement?.click();\r\n  }\r\n\r\n  onBureauPromptFileUpload(event: Event): void {\r\n    const input = event.target as HTMLInputElement;\r\n    const file = input.files?.[0];\r\n\r\n    if (!file) return;\r\n\r\n    if (!file.name.toLowerCase().endsWith('.txt')) {\r\n      alert('Please upload a .txt file.');\r\n      input.value = '';\r\n      return;\r\n    }\r\n\r\n    const maxSizeBytes = 1 * 1024 * 1024;\r\n    if (file.size > maxSizeBytes) {\r\n      alert('File size exceeds 1 MB limit.');\r\n      input.value = '';\r\n      return;\r\n    }\r\n\r\n    const reader = new FileReader();\r\n    reader.onload = () => {\r\n      const content = reader.result as string;\r\n      if (content && content.trim()) {\r\n        this.bureauPromptTemplate = content.trim();\r\n        this.addToBureauPromptHistory(this.bureauPromptTemplate, 'uploaded');\r\n        console.log('Bureau Prompt template loaded from file.');\r\n      } else {\r\n        alert('The uploaded file is empty.');\r\n      }\r\n    };\r\n    reader.onerror = () => {\r\n      alert('Failed to read file.');\r\n    };\r\n    reader.readAsText(file);\r\n    input.value = '';\r\n  }\r\n\r\n  // ========== GST Prompt History Methods ==========\r\n\r\n  toggleGstPromptHistory(): void {\r\n    this.showGstPromptHistory = !this.showGstPromptHistory;\r\n  }\r\n\r\n  loadGstPromptHistory(): void {\r\n    try {\r\n      const cached = localStorage.getItem(this.gstHistoryStorageKey);\r\n      if (cached) {\r\n        this.gstPromptHistory = JSON.parse(cached);\r\n      }\r\n    } catch (e) {\r\n      console.error('Failed to load GST prompt history:', e);\r\n      this.gstPromptHistory = [];\r\n    }\r\n  }\r\n\r\n  addToGstPromptHistory(template: string, source: 'typed' | 'uploaded'): void {\r\n    if (template === this.defaultGstPromptTemplate) return;\r\n    if (this.gstPromptHistory.length > 0 && this.gstPromptHistory[0].template === template) return;\r\n\r\n    const newEntry = {\r\n      template: template,\r\n      timestamp: new Date().toISOString(),\r\n      source: source\r\n    };\r\n\r\n    this.gstPromptHistory = [newEntry, ...this.gstPromptHistory.filter(h => h.template !== template)].slice(0, 10);\r\n\r\n    try {\r\n      localStorage.setItem(this.gstHistoryStorageKey, JSON.stringify(this.gstPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to save GST prompt history:', e);\r\n    }\r\n  }\r\n\r\n  selectGstFromHistory(historyItem: { template: string; timestamp: string; source: 'typed' | 'uploaded' }): void {\r\n    this.gstPromptTemplate = historyItem.template;\r\n    this.showGstPromptHistory = false;\r\n  }\r\n\r\n  deleteGstFromHistory(index: number, event: Event): void {\r\n    event.stopPropagation();\r\n    this.gstPromptHistory.splice(index, 1);\r\n    try {\r\n      localStorage.setItem(this.gstHistoryStorageKey, JSON.stringify(this.gstPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to update GST prompt history:', e);\r\n    }\r\n  }\r\n\r\n  // ========== Bureau Prompt History Methods ==========\r\n\r\n  toggleBureauPromptHistory(): void {\r\n    this.showBureauPromptHistory = !this.showBureauPromptHistory;\r\n  }\r\n\r\n  loadBureauPromptHistory(): void {\r\n    try {\r\n      const cached = localStorage.getItem(this.bureauHistoryStorageKey);\r\n      if (cached) {\r\n        this.bureauPromptHistory = JSON.parse(cached);\r\n      }\r\n    } catch (e) {\r\n      console.error('Failed to load Bureau prompt history:', e);\r\n      this.bureauPromptHistory = [];\r\n    }\r\n  }\r\n\r\n  addToBureauPromptHistory(template: string, source: 'typed' | 'uploaded'): void {\r\n    if (template === this.defaultBureauPromptTemplate) return;\r\n    if (this.bureauPromptHistory.length > 0 && this.bureauPromptHistory[0].template === template) return;\r\n\r\n    const newEntry = {\r\n      template: template,\r\n      timestamp: new Date().toISOString(),\r\n      source: source\r\n    };\r\n\r\n    this.bureauPromptHistory = [newEntry, ...this.bureauPromptHistory.filter(h => h.template !== template)].slice(0, 10);\r\n\r\n    try {\r\n      localStorage.setItem(this.bureauHistoryStorageKey, JSON.stringify(this.bureauPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to save Bureau prompt history:', e);\r\n    }\r\n  }\r\n\r\n  selectBureauFromHistory(historyItem: { template: string; timestamp: string; source: 'typed' | 'uploaded' }): void {\r\n    this.bureauPromptTemplate = historyItem.template;\r\n    this.showBureauPromptHistory = false;\r\n  }\r\n\r\n  deleteBureauFromHistory(index: number, event: Event): void {\r\n    event.stopPropagation();\r\n    this.bureauPromptHistory.splice(index, 1);\r\n    try {\r\n      localStorage.setItem(this.bureauHistoryStorageKey, JSON.stringify(this.bureauPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to update Bureau prompt history:', e);\r\n    }\r\n  }\r\n\r\n  // ========== Financial Prompt File Upload Methods ==========\r\n\r\n  triggerFinancialPromptFileUpload(): void {\r\n    this.financialPromptFileInput?.nativeElement?.click();\r\n  }\r\n\r\n  onFinancialPromptFileUpload(event: Event): void {\r\n    const input = event.target as HTMLInputElement;\r\n    const file = input.files?.[0];\r\n\r\n    if (!file) return;\r\n\r\n    if (!file.name.toLowerCase().endsWith('.txt')) {\r\n      alert('Please upload a .txt file.');\r\n      input.value = '';\r\n      return;\r\n    }\r\n\r\n    const maxSizeBytes = 1 * 1024 * 1024;\r\n    if (file.size > maxSizeBytes) {\r\n      alert('File size exceeds 1 MB limit.');\r\n      input.value = '';\r\n      return;\r\n    }\r\n\r\n    const reader = new FileReader();\r\n    reader.onload = () => {\r\n      const content = reader.result as string;\r\n      if (content && content.trim()) {\r\n        this.financialPromptTemplate = content.trim();\r\n        this.addToFinancialPromptHistory(this.financialPromptTemplate, 'uploaded');\r\n        console.log('Financial Prompt template loaded from file.');\r\n      } else {\r\n        alert('The uploaded file is empty.');\r\n      }\r\n    };\r\n    reader.onerror = () => {\r\n      alert('Failed to read file.');\r\n    };\r\n    reader.readAsText(file);\r\n    input.value = '';\r\n  }\r\n\r\n  // ========== Financial Prompt History Methods ==========\r\n\r\n  toggleFinancialPromptHistory(): void {\r\n    this.showFinancialPromptHistory = !this.showFinancialPromptHistory;\r\n  }\r\n\r\n  loadFinancialPromptHistory(): void {\r\n    try {\r\n      const cached = localStorage.getItem(this.financialHistoryStorageKey);\r\n      if (cached) {\r\n        this.financialPromptHistory = JSON.parse(cached);\r\n      }\r\n    } catch (e) {\r\n      console.error('Failed to load Financial prompt history:', e);\r\n      this.financialPromptHistory = [];\r\n    }\r\n  }\r\n\r\n  addToFinancialPromptHistory(template: string, source: 'typed' | 'uploaded'): void {\r\n    if (template === this.defaultFinancialPromptTemplate) return;\r\n    if (this.financialPromptHistory.length > 0 && this.financialPromptHistory[0].template === template) return;\r\n\r\n    const newEntry = {\r\n      template: template,\r\n      timestamp: new Date().toISOString(),\r\n      source: source\r\n    };\r\n\r\n    this.financialPromptHistory = [newEntry, ...this.financialPromptHistory.filter(h => h.template !== template)].slice(0, 10);\r\n\r\n    try {\r\n      localStorage.setItem(this.financialHistoryStorageKey, JSON.stringify(this.financialPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to save Financial prompt history:', e);\r\n    }\r\n  }\r\n\r\n  selectFinancialFromHistory(historyItem: { template: string; timestamp: string; source: 'typed' | 'uploaded' }): void {\r\n    this.financialPromptTemplate = historyItem.template;\r\n    this.showFinancialPromptHistory = false;\r\n  }\r\n\r\n  deleteFinancialFromHistory(index: number, event: Event): void {\r\n    event.stopPropagation();\r\n    this.financialPromptHistory.splice(index, 1);\r\n    try {\r\n      localStorage.setItem(this.financialHistoryStorageKey, JSON.stringify(this.financialPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to update Financial prompt history:', e);\r\n    }\r\n  }\r\n\r\n  // ========== Bureau View Methods ==========\r\n\r\n  onBureauViewModeChange(mode: 'overview' | 'detailed'): void {\r\n    this.bureauViewMode = mode;\r\n    \r\n    if (mode === 'detailed' && !this.bureauDetailedMarkdown) {\r\n      this.loadBureauDetailedAnalysis();\r\n    }\r\n  }\r\n\r\n  private loadBureauDetailedAnalysis(): void {\r\n    // If AI-generated Bureau response is available from Input, use it\r\n    if (this.aiGeneratedBureauResponse && this.aiGeneratedBureauResponse.trim() !== '') {\r\n      this.bureauDetailedMarkdown = this.aiGeneratedBureauResponse;\r\n      this.isLoadingBureauDetails = false;\r\n      return;\r\n    }\r\n    \r\n    // No AI response available - show placeholder message\r\n    this.bureauDetailedMarkdown = '## Bureau Analysis\\n\\nNo AI-generated Bureau analysis available. Please generate a summary first.';\r\n    this.isLoadingBureauDetails = false;\r\n  }\r\n\r\n  // ========== Financial Statement View Methods ==========\r\n\r\n  onFinancialViewModeChange(mode: 'overview' | 'detailed'): void {\r\n    this.financialViewMode = mode;\r\n    \r\n    if (mode === 'detailed' && !this.financialDetailedMarkdown) {\r\n      this.loadFinancialDetailedAnalysis();\r\n    }\r\n  }\r\n\r\n  private loadFinancialDetailedAnalysis(): void {\r\n    // If AI-generated Financial response is available from Input, use it\r\n    if (this.aiGeneratedFinancialResponse && this.aiGeneratedFinancialResponse.trim() !== '') {\r\n      this.financialDetailedMarkdown = this.aiGeneratedFinancialResponse;\r\n      this.isLoadingFinancialDetails = false;\r\n      return;\r\n    }\r\n    \r\n    // No AI response available - show placeholder message\r\n    this.financialDetailedMarkdown = '## Financial Analysis\\n\\nNo AI-generated Financial analysis available. Please generate a summary first.';\r\n    this.isLoadingFinancialDetails = false;\r\n  }\r\n\r\n  // ========== Prompt History Methods ==========\r\n\r\n  togglePromptHistory(): void {\r\n    this.showPromptHistory = !this.showPromptHistory;\r\n  }\r\n\r\n  loadPromptHistory(): void {\r\n    try {\r\n      const cached = localStorage.getItem(this.historyStorageKey);\r\n      if (cached) {\r\n        this.promptHistory = JSON.parse(cached);\r\n      }\r\n    } catch (e) {\r\n      console.error('Failed to load prompt history:', e);\r\n      this.promptHistory = [];\r\n    }\r\n  }\r\n\r\n  addToPromptHistory(template: string, source: 'typed' | 'uploaded'): void {\r\n    // Don't add if it's the default template or already exists as the most recent\r\n    if (template === this.defaultPromptTemplate) return;\r\n    if (this.promptHistory.length > 0 && this.promptHistory[0].template === template) return;\r\n\r\n    const newEntry = {\r\n      template: template,\r\n      timestamp: new Date().toISOString(),\r\n      source: source\r\n    };\r\n\r\n    // Add to beginning, keep max 10 entries\r\n    this.promptHistory = [newEntry, ...this.promptHistory.filter(h => h.template !== template)].slice(0, 10);\r\n\r\n    try {\r\n      localStorage.setItem(this.historyStorageKey, JSON.stringify(this.promptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to save prompt history:', e);\r\n    }\r\n  }\r\n\r\n  selectFromHistory(historyItem: { template: string; timestamp: string; source: 'typed' | 'uploaded' }): void {\r\n    this.promptTemplate = historyItem.template;\r\n    this.showPromptHistory = false;\r\n    this.isEditingPrompt = false;\r\n  }\r\n\r\n  deleteFromHistory(index: number, event: Event): void {\r\n    event.stopPropagation();\r\n    this.promptHistory.splice(index, 1);\r\n    try {\r\n      localStorage.setItem(this.historyStorageKey, JSON.stringify(this.promptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to update prompt history:', e);\r\n    }\r\n  }\r\n\r\n  formatHistoryDate(timestamp: string): string {\r\n    const date = new Date(timestamp);\r\n    return date.toLocaleDateString('en-US', {\r\n      month: 'short',\r\n      day: 'numeric',\r\n      year: 'numeric',\r\n      hour: '2-digit',\r\n      minute: '2-digit'\r\n    });\r\n  }\r\n\r\n  getPromptPreview(template: string): string {\r\n    return template.length > 80 ? template.substring(0, 80) + '...' : template;\r\n  }\r\n\r\n  // ========== Toast Notification Methods ==========\r\n\r\n  /**\r\n   * Extract error message from various API error response formats.\r\n   * Backend sends: { error: { code: \"...\", message: \"...\", details: {...} } }\r\n   * HttpClient wraps it in HttpErrorResponse: error.error contains the backend response\r\n   */\r\n  private extractErrorMessage(error: any): string {\r\n    console.log('Extracting error message from:', error);\r\n    \r\n    // Try FastAPI HTTPException format with detail wrapper: error.error.detail.error.message\r\n    if (error?.error?.detail?.error?.message) {\r\n      return `Error: ${error.error.detail.error.message}`;\r\n    }\r\n    // Try FastAPI HTTPException format: error.error.error.message\r\n    if (error?.error?.error?.message) {\r\n      return `Error: ${error.error.error.message}`;\r\n    }\r\n    // Try FastAPI validation error format: error.error.detail\r\n    if (error?.error?.detail) {\r\n      if (typeof error.error.detail === 'string') {\r\n        return `Error: ${error.error.detail}`;\r\n      }\r\n      // Pydantic validation errors\r\n      if (Array.isArray(error.error.detail)) {\r\n        return `Validation Error: ${error.error.detail.map((d: any) => d.msg).join(', ')}`;\r\n      }\r\n      // Detail is an object with error inside\r\n      if (error.error.detail?.error?.message) {\r\n        return `Error: ${error.error.detail.error.message}`;\r\n      }\r\n    }\r\n    // Try simple error object: error.error (string) or error.message\r\n    if (typeof error?.error === 'string') {\r\n      return `Error: ${error.error}`;\r\n    }\r\n    if(error?.error_message){\r\n      return `Error: ${error.error_message}`;\r\n    }\r\n    if (error?.message) {\r\n      return `Error: ${error.message}`;\r\n    }\r\n    // Fallback\r\n    return 'AI service unavailable. Please try again later.';\r\n  }\r\n\r\n  showErrorToastNotification(message: string): void {\r\n    // Clear any existing timeout\r\n    if (this.errorToastTimeout) {\r\n      clearTimeout(this.errorToastTimeout);\r\n    }\r\n    \r\n    this.errorToastMessage = message;\r\n    this.showErrorToast = true;\r\n    \r\n    // Auto-hide after 20 seconds\r\n    this.errorToastTimeout = setTimeout(() => {\r\n      this.hideErrorToast();\r\n    }, 20000);\r\n  }\r\n\r\n  hideErrorToast(): void {\r\n    this.showErrorToast = false;\r\n    this.errorToastMessage = '';\r\n    if (this.errorToastTimeout) {\r\n      clearTimeout(this.errorToastTimeout);\r\n      this.errorToastTimeout = null;\r\n    }\r\n  }\r\n}\r\n","<mat-sidenav-container class=\"loan-summary-sidenav-container\">\r\n  @if (isAiSettingsConfigurable) {\r\n    <mat-sidenav\r\n      #settingsSidenav\r\n      mode=\"over\"\r\n      position=\"end\"\r\n      [opened]=\"isSettingsPanelOpen\"\r\n      (closed)=\"onSettingsPanelClose()\"\r\n      class=\"settings-sidenav\"\r\n    >\r\n      <!-- Settings Panel Component -->\r\n      <uc-ai-settings-panel\r\n        [hasGstDocument]=\"hasGstDocument\"\r\n        [hasBureauDocument]=\"hasBureauDocument\"\r\n        [hasFinancialDocument]=\"hasFinancialDocument\"\r\n        (closePanel)=\"onSettingsPanelClose()\"\r\n        (settingsSaved)=\"onSettingsPanelSaved($event)\"\r\n        (settingsReset)=\"resetAiSettings()\"\r\n      ></uc-ai-settings-panel>\r\n    </mat-sidenav>\r\n  }\r\n\r\n  <mat-sidenav-content>\r\n    <div class=\"loan-summary-container\">\r\n      <!-- Document Quick Links - Sticky -->\r\n      <div class=\"document-links-sticky\">\r\n        <div class=\"document-links\">\r\n          <span class=\"links-label\">Quick Documents:</span>\r\n          @for (doc of documentTypes; track doc.id) {\r\n            <button\r\n              mat-stroked-button\r\n              (click)=\"openDocument(doc.id)\"\r\n              class=\"doc-btn\"\r\n            >\r\n              <mat-icon>{{ doc.icon }}</mat-icon>\r\n              {{ doc.name }}\r\n            </button>\r\n          }\r\n          <div class=\"view-toggle\">\r\n            <mat-button-toggle-group\r\n              [value]=\"viewMode\"\r\n              (change)=\"onViewModeChange($event.value)\"\r\n            >\r\n              <mat-button-toggle value=\"carousel\" matTooltip=\"Carousel View\">\r\n                <mat-icon>view_carousel</mat-icon>\r\n              </mat-button-toggle>\r\n              <mat-button-toggle value=\"list\" matTooltip=\"List View\">\r\n                <mat-icon>view_list</mat-icon>\r\n              </mat-button-toggle>\r\n            </mat-button-toggle-group>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Content Area -->\r\n      @if (viewMode === \"carousel\") {\r\n        <!-- Carousel View -->\r\n        <div class=\"carousel-container\">\r\n          <button\r\n            mat-icon-button\r\n            class=\"nav-btn prev-btn\"\r\n            (click)=\"previousSlide()\"\r\n            [disabled]=\"currentSlideIndex === 0\"\r\n          >\r\n            <mat-icon>chevron_left</mat-icon>\r\n          </button>\r\n\r\n          <div class=\"carousel-content\">\r\n            <div\r\n              class=\"carousel-track\"\r\n              [style.transform]=\"\r\n                'translateX(-' + currentSlideIndex * 100 + '%)'\r\n              \"\r\n            >\r\n              @for (\r\n                section of visibleSections;\r\n                track section.id;\r\n                let i = $index\r\n              ) {\r\n                <div class=\"carousel-slide\">\r\n                  @switch (section.id) {\r\n                    @case (\"go-nogo\") {\r\n                      <uc-go-nogo-decision\r\n                        [goNoGoDecision]=\"goNoGoDecision\"\r\n                        [goNoGoSummaryMarkdown]=\"goNoGoSummaryMarkdown\"\r\n                        [bureauQuickSummary]=\"bureauQuickSummary\"\r\n                      >\r\n                      </uc-go-nogo-decision>\r\n                    }\r\n                    @case (\"borrower-info\") {\r\n                      <uc-borrower-info\r\n                        [borrowerInformation]=\"loanSummary.borrowerInformation\"\r\n                        [proposalBorrowerInfo]=\"proposalBorrowerInfo\"\r\n                      >\r\n                      </uc-borrower-info>\r\n                    }\r\n                    @case (\"risk-rating\") {\r\n                      <uc-risk-rating\r\n                        [riskRatingAnalysis]=\"loanSummary.riskRatingAnalysis\"\r\n                      >\r\n                      </uc-risk-rating>\r\n                    }\r\n                    @case (\"director-info\") {\r\n                      <uc-director-info\r\n                        [directors]=\"loanSummary.companyDirectorInformation\"\r\n                        [proposalDirectorInfo]=\"proposalDirectorInfo\"\r\n                      >\r\n                      </uc-director-info>\r\n                    }\r\n                    @case (\"loan-facility\") {\r\n                      <uc-loan-facility\r\n                        [facilities]=\"loanSummary.loanFacilityInformation\"\r\n                        [proposalFacilityInfo]=\"proposalFacilityInfo\"\r\n                      >\r\n                      </uc-loan-facility>\r\n                    }\r\n                    @case (\"credit-bureau\") {\r\n                      <uc-credit-bureau\r\n                        [creditBureauDetails]=\"\r\n                          loanSummary.creditSummary.creditBureauDetails\r\n                        \"\r\n                        [bureauViewMode]=\"bureauViewMode\"\r\n                        [bureauDetailedMarkdown]=\"bureauDetailedMarkdown\"\r\n                        [isLoadingBureauDetails]=\"isLoadingBureauDetails\"\r\n                        [bureauData]=\"bureauData\"\r\n                        [bureauQuickSummary]=\"bureauQuickSummary\"\r\n                        (bureauViewModeChange)=\"onBureauViewModeChange($event)\"\r\n                      >\r\n                      </uc-credit-bureau>\r\n                    }\r\n                    @case (\"credit-assessment\") {\r\n                      <uc-credit-assessment\r\n                        [creditSummary]=\"loanSummary.creditSummary\"\r\n                      >\r\n                      </uc-credit-assessment>\r\n                    }\r\n                    @case (\"gst-summary\") {\r\n                      <uc-gst-summary\r\n                        [gstSummary]=\"loanSummary.gstSummary\"\r\n                        [gstViewMode]=\"gstViewMode\"\r\n                        [gstDetailedMarkdown]=\"gstDetailedMarkdown\"\r\n                        [isLoadingGstDetails]=\"isLoadingGstDetails\"\r\n                        [gstQuickSummary]=\"gstQuickSummary\"\r\n                        (gstViewModeChange)=\"onGstViewModeChange($event)\"\r\n                      >\r\n                      </uc-gst-summary>\r\n                    }\r\n                    @case (\"balance-sheet\") {\r\n                      <uc-balance-sheet\r\n                        [balanceSheetSummary]=\"loanSummary.balanceSheetSummary\"\r\n                        [financialViewMode]=\"financialViewMode\"\r\n                        [financialDetailedMarkdown]=\"financialDetailedMarkdown\"\r\n                        [isLoadingFinancialDetails]=\"isLoadingFinancialDetails\"\r\n                        [financialQuickSummary]=\"financialQuickSummary\"\r\n                        (financialViewModeChange)=\"\r\n                          onFinancialViewModeChange($event)\r\n                        \"\r\n                      >\r\n                      </uc-balance-sheet>\r\n                    }\r\n                    @case (\"risk-assessment\") {\r\n                      <uc-risk-assessment\r\n                        [riskAssessmentRating]=\"\r\n                          loanSummary.riskAssessmentRating\r\n                        \"\r\n                        [corpositoryDetails]=\"loanSummary.corpositoryDetails\"\r\n                      >\r\n                      </uc-risk-assessment>\r\n                    }\r\n                    @case (\"ews-dashboard\") {\r\n                      <uc-ews-dashboard\r\n                        [ewsDashboard]=\"loanSummary.ewsDashboard\"\r\n                      >\r\n                      </uc-ews-dashboard>\r\n                    }\r\n                  }\r\n                </div>\r\n              }\r\n            </div>\r\n          </div>\r\n\r\n          <button\r\n            mat-icon-button\r\n            class=\"nav-btn next-btn\"\r\n            (click)=\"nextSlide()\"\r\n            [disabled]=\"currentSlideIndex === visibleSections.length - 1\"\r\n          >\r\n            <mat-icon>chevron_right</mat-icon>\r\n          </button>\r\n        </div>\r\n\r\n        <!-- Carousel Indicators -->\r\n        <div class=\"carousel-indicators\">\r\n          @for (section of visibleSections; track section.id; let i = $index) {\r\n            <button\r\n              class=\"indicator\"\r\n              [class.active]=\"i === currentSlideIndex\"\r\n              (click)=\"goToSlide(i)\"\r\n              [matTooltip]=\"section.title\"\r\n            ></button>\r\n          }\r\n        </div>\r\n      } @else {\r\n        <!-- List View -->\r\n        <div class=\"list-container\" #listContainer (scroll)=\"onScroll($event)\">\r\n          @for (section of visibleSections; track section.id; let i = $index) {\r\n            <div\r\n              class=\"list-item\"\r\n              [attr.data-section-id]=\"section.id\"\r\n              [attr.data-section-index]=\"i\"\r\n            >\r\n              @switch (section.id) {\r\n                @case (\"go-nogo\") {\r\n                  <uc-go-nogo-decision\r\n                    [goNoGoDecision]=\"goNoGoDecision\"\r\n                    [goNoGoSummaryMarkdown]=\"goNoGoSummaryMarkdown\"\r\n                    [bureauQuickSummary]=\"bureauQuickSummary\"\r\n                  >\r\n                  </uc-go-nogo-decision>\r\n                }\r\n                @case (\"borrower-info\") {\r\n                  <uc-borrower-info\r\n                    [borrowerInformation]=\"loanSummary.borrowerInformation\"\r\n                    [proposalBorrowerInfo]=\"proposalBorrowerInfo\"\r\n                  >\r\n                  </uc-borrower-info>\r\n                }\r\n                @case (\"risk-rating\") {\r\n                  <uc-risk-rating\r\n                    [riskRatingAnalysis]=\"loanSummary.riskRatingAnalysis\"\r\n                  >\r\n                  </uc-risk-rating>\r\n                }\r\n                @case (\"director-info\") {\r\n                  <uc-director-info\r\n                    [directors]=\"loanSummary.companyDirectorInformation\"\r\n                    [proposalDirectorInfo]=\"proposalDirectorInfo\"\r\n                  >\r\n                  </uc-director-info>\r\n                }\r\n                @case (\"loan-facility\") {\r\n                  <uc-loan-facility\r\n                    [facilities]=\"loanSummary.loanFacilityInformation\"\r\n                    [proposalFacilityInfo]=\"proposalFacilityInfo\"\r\n                  >\r\n                  </uc-loan-facility>\r\n                }\r\n                @case (\"credit-bureau\") {\r\n                  <uc-credit-bureau\r\n                    [creditBureauDetails]=\"\r\n                      loanSummary.creditSummary.creditBureauDetails\r\n                    \"\r\n                    [bureauViewMode]=\"bureauViewMode\"\r\n                    [bureauDetailedMarkdown]=\"bureauDetailedMarkdown\"\r\n                    [isLoadingBureauDetails]=\"isLoadingBureauDetails\"\r\n                    [bureauData]=\"bureauData\"\r\n                    [bureauQuickSummary]=\"bureauQuickSummary\"\r\n                    (bureauViewModeChange)=\"onBureauViewModeChange($event)\"\r\n                  >\r\n                  </uc-credit-bureau>\r\n                }\r\n                @case (\"credit-assessment\") {\r\n                  <uc-credit-assessment\r\n                    [creditSummary]=\"loanSummary.creditSummary\"\r\n                  >\r\n                  </uc-credit-assessment>\r\n                }\r\n                @case (\"gst-summary\") {\r\n                  <uc-gst-summary\r\n                    [gstSummary]=\"loanSummary.gstSummary\"\r\n                    [gstViewMode]=\"gstViewMode\"\r\n                    [gstDetailedMarkdown]=\"gstDetailedMarkdown\"\r\n                    [isLoadingGstDetails]=\"isLoadingGstDetails\"\r\n                    [gstQuickSummary]=\"gstQuickSummary\"\r\n                    (gstViewModeChange)=\"onGstViewModeChange($event)\"\r\n                  >\r\n                  </uc-gst-summary>\r\n                }\r\n                @case (\"balance-sheet\") {\r\n                  <uc-balance-sheet\r\n                    [balanceSheetSummary]=\"loanSummary.balanceSheetSummary\"\r\n                    [financialViewMode]=\"financialViewMode\"\r\n                    [financialDetailedMarkdown]=\"financialDetailedMarkdown\"\r\n                    [isLoadingFinancialDetails]=\"isLoadingFinancialDetails\"\r\n                    [financialQuickSummary]=\"financialQuickSummary\"\r\n                    (financialViewModeChange)=\"\r\n                      onFinancialViewModeChange($event)\r\n                    \"\r\n                  >\r\n                  </uc-balance-sheet>\r\n                }\r\n                @case (\"risk-assessment\") {\r\n                  <uc-risk-assessment\r\n                    [riskAssessmentRating]=\"loanSummary.riskAssessmentRating\"\r\n                    [corpositoryDetails]=\"loanSummary.corpositoryDetails\"\r\n                  >\r\n                  </uc-risk-assessment>\r\n                }\r\n                @case (\"ews-dashboard\") {\r\n                  <uc-ews-dashboard [ewsDashboard]=\"loanSummary.ewsDashboard\">\r\n                  </uc-ews-dashboard>\r\n                }\r\n              }\r\n            </div>\r\n          }\r\n        </div>\r\n      }\r\n    </div>\r\n\r\n    <!-- Floating Section Indicator - Fixed position -->\r\n    @if (viewMode === \"list\" && showSectionIndicator && currentSection) {\r\n      <div class=\"section-indicator\">\r\n        <div class=\"indicator-content\">\r\n          <div class=\"indicator-progress\">\r\n            <div class=\"progress-ring\">\r\n              <svg viewBox=\"0 0 36 36\">\r\n                <path\r\n                  class=\"progress-bg\"\r\n                  d=\"M18 2.0845\r\n                 a 15.9155 15.9155 0 0 1 0 31.831\r\n                 a 15.9155 15.9155 0 0 1 0 -31.831\"\r\n                />\r\n                <path\r\n                  class=\"progress-fill\"\r\n                  [attr.stroke-dasharray]=\"getSectionProgress() + ', 100'\"\r\n                  d=\"M18 2.0845\r\n                 a 15.9155 15.9155 0 0 1 0 31.831\r\n                 a 15.9155 15.9155 0 0 1 0 -31.831\"\r\n                />\r\n              </svg>\r\n              <span class=\"progress-text\"\r\n                >{{ currentSectionIndex + 1 }}/{{\r\n                  visibleSections.length\r\n                }}</span\r\n              >\r\n            </div>\r\n          </div>\r\n          <div class=\"indicator-info\">\r\n            <span class=\"indicator-label\">Currently Viewing</span>\r\n            <span class=\"indicator-title\">\r\n              <mat-icon>{{ currentSection.icon }}</mat-icon>\r\n              {{ currentSection.title }}\r\n            </span>\r\n            @if (nextSection) {\r\n              <span class=\"indicator-next\">\r\n                <mat-icon>arrow_forward</mat-icon>\r\n                Next: {{ nextSection.title }}\r\n              </span>\r\n            }\r\n          </div>\r\n        </div>\r\n      </div>\r\n    }\r\n  </mat-sidenav-content>\r\n</mat-sidenav-container>\r\n\r\n<!-- Saving Settings Overlay -->\r\n@if (isSavingSettings) {\r\n  <div class=\"saving-overlay\">\r\n    <div class=\"saving-modal\">\r\n      <div class=\"saving-icon\">\r\n        <mat-icon class=\"settings-icon\">settings</mat-icon>\r\n        <div class=\"pulse-ring\"></div>\r\n      </div>\r\n      <h3>Generating AI Summary</h3>\r\n      <p>Applying your prompt template and model configuration...</p>\r\n      <div class=\"saving-progress\">\r\n        <div class=\"progress-bar\" [style.width.%]=\"savingProgress\"></div>\r\n      </div>\r\n      <div class=\"progress-info\">\r\n        <span class=\"progress-percentage\">{{ savingProgress }}%</span>\r\n        @if (savingProgress >= 85 && savingProgress < 100) {\r\n          <span class=\"waiting-text\">Waiting for AI response...</span>\r\n        }\r\n      </div>\r\n      <div class=\"saving-details\">\r\n        <span class=\"detail-item\">\r\n          <mat-icon>smart_toy</mat-icon>\r\n          {{ selectedModel }}\r\n        </span>\r\n      </div>\r\n    </div>\r\n  </div>\r\n}\r\n\r\n<!-- Error Toast Notification -->\r\n@if (showErrorToast) {\r\n  <div class=\"error-toast\" (click)=\"hideErrorToast()\">\r\n    <mat-icon class=\"error-icon\">error_outline</mat-icon>\r\n    <span class=\"error-message\">{{ errorToastMessage }}</span>\r\n    <button mat-icon-button class=\"close-toast-btn\" (click)=\"hideErrorToast()\">\r\n      <mat-icon>close</mat-icon>\r\n    </button>\r\n  </div>\r\n}\r\n","/**\r\n * @fileoverview AI Settings Modal Component\r\n * @description A modal dialog for configuring AI inference parameters,\r\n * RAG configuration, document type selection, and prompt templates.\r\n * Provides similar functionality to the panel but as an overlay modal.\r\n * \r\n * @module uc-ui/components/shared/ai-settings-modal\r\n * @requires @angular/core\r\n * @requires @angular/common\r\n * @requires @angular/forms\r\n * @requires @angular/material\r\n */\r\n\r\nimport { Component, Input, Output, EventEmitter, ViewChild, ElementRef, OnInit, OnChanges, SimpleChanges, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSliderModule } from '@angular/material/slider';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { LoanSummaryService } from '../../../services/loan-summary.service';\r\n\r\n/**\r\n * Interface representing the AI settings data\r\n * @interface AiSettingsData\r\n */\r\nexport interface AiSettingsData {\r\n  /** Selected LLM model for inference */\r\n  selectedModel: string;\r\n  /** Custom prompt template */\r\n  promptTemplate: string;\r\n  /** Chunk size for document splitting (RAG) */\r\n  chunkSize: number;\r\n  /** Overlap between consecutive chunks */\r\n  chunkOverlap: number;\r\n  /** Number of top similar chunks to retrieve */\r\n  topK: number;\r\n  /** Embedding model for vector representation */\r\n  embeddingModel: string;\r\n  /** Search type (similarity, mmr, hybrid) */\r\n  searchType: string;\r\n  /** Vector store backend (pgvector, inmemory) */\r\n  vectorStore: string;\r\n  /** Whether GST analysis is selected */\r\n  selectedGst: boolean;\r\n  /** Whether Bureau analysis is selected */\r\n  selectedBureau: boolean;\r\n  /** Whether Financial analysis is selected */\r\n  selectedFinancial: boolean;\r\n  /** GST-specific prompt template */\r\n  gstPromptTemplate: string;\r\n  /** Bureau-specific prompt template */\r\n  bureauPromptTemplate: string;\r\n  /** Financial-specific prompt template */\r\n  financialPromptTemplate: string;\r\n}\r\n\r\n/**\r\n * Interface for tracking prompt history items\r\n * @interface PromptHistoryItem\r\n */\r\nexport interface PromptHistoryItem {\r\n  /** The prompt template content */\r\n  template: string;\r\n  /** ISO timestamp when the prompt was saved */\r\n  timestamp: string;\r\n  /** Source of the prompt (typed manually or uploaded from file) */\r\n  source: 'typed' | 'uploaded';\r\n}\r\n\r\n/**\r\n * AI Settings Modal Component\r\n * \r\n * @description Provides a modal dialog UI for configuring AI model settings,\r\n * RAG parameters, and prompt templates. Supports document type selection,\r\n * prompt history, and file upload functionality.\r\n * \r\n * @example\r\n * ```html\r\n * <uc-ai-settings-modal\r\n *   [isOpen]=\"showSettingsModal\"\r\n *   (closeModal)=\"showSettingsModal = false\"\r\n *   (settingsSaved)=\"onSettingsSaved($event)\">\r\n * </uc-ai-settings-modal>\r\n * ```\r\n */\r\n@Component({\r\n  selector: 'uc-ai-settings-modal',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    FormsModule,\r\n    MatButtonModule,\r\n    MatIconModule,\r\n    MatInputModule,\r\n    MatFormFieldModule,\r\n    MatSelectModule,\r\n    MatSliderModule,\r\n    MatTooltipModule,\r\n  ],\r\n  templateUrl: './ai-settings-modal.component.html',\r\n  styleUrl: './ai-settings-modal.component.scss',\r\n})\r\nexport class AiSettingsModalComponent implements OnInit, OnChanges {\r\n  /** Whether the modal is currently open */\r\n  @Input() isOpen = false;\r\n  \r\n  // Document availability inputs (based on proposal.documents)\r\n  /** Whether GST document is available in the proposal */\r\n  @Input() hasGstDocument = false;\r\n  \r\n  /** Whether Bureau document is available in the proposal */\r\n  @Input() hasBureauDocument = false;\r\n  \r\n  /** Whether Financial document is available in the proposal */\r\n  @Input() hasFinancialDocument = false;\r\n  \r\n  /** Event emitted when the modal is closed */\r\n  @Output() closeModal = new EventEmitter<void>();\r\n  \r\n  /** Event emitted when settings are saved successfully */\r\n  @Output() settingsSaved = new EventEmitter<AiSettingsData>();\r\n\r\n  /** Reference to GST prompt file input element */\r\n  @ViewChild('gstPromptFileInput') gstPromptFileInput!: ElementRef<HTMLInputElement>;\r\n  \r\n  /** Reference to Bureau prompt file input element */\r\n  @ViewChild('bureauPromptFileInput') bureauPromptFileInput!: ElementRef<HTMLInputElement>;\r\n  \r\n  /** Reference to Financial prompt file input element */\r\n  @ViewChild('financialPromptFileInput') financialPromptFileInput!: ElementRef<HTMLInputElement>;\r\n\r\n  /** Injected loan summary service for state management */\r\n  private readonly loanSummaryService = inject(LoanSummaryService);\r\n\r\n  // Model settings\r\n  /** Available LLM models for selection */\r\n  availableModels: string[] = [\r\n    'llama3.2:3b',\r\n    'mistral:7b',\r\n    'qwen3.5:latest',\r\n    'gemma4:latest',\r\n    'deepseek-r1:latest'\r\n  ];\r\n  \r\n  /** Currently selected LLM model */\r\n  selectedModel = 'gemma4:latest';\r\n  \r\n  /** Custom prompt template */\r\n  promptTemplate = '';\r\n\r\n  // RAG Configuration State\r\n  /** Chunk size for document splitting */\r\n  chunkSize = 1000;\r\n  \r\n  /** Overlap between consecutive chunks */\r\n  chunkOverlap = 150;\r\n  \r\n  /** Number of top similar chunks to retrieve */\r\n  topK = 15;\r\n\r\n  /** Available embedding models */\r\n  availableEmbeddingModels: string[] = ['embeddinggemma:300m', 'all-minilm'];\r\n  \r\n  /** Currently selected embedding model */\r\n  selectedEmbeddingModel = 'embeddinggemma:300m';\r\n\r\n  /** Available search types with labels */\r\n  availableSearchTypes: Array<{ value: string; label: string }> = [\r\n    { value: 'similarity', label: 'Similarity Search' },\r\n    { value: 'mmr', label: 'Max Marginal Relevance' },\r\n    { value: 'hybrid', label: 'Hybrid Search - Similarity + BM25' }\r\n  ];\r\n  \r\n  /** Currently selected search type */\r\n  selectedSearchType = 'hybrid';\r\n\r\n  /** Available vector store backends */\r\n  availableVectorStores: Array<{ value: string; label: string }> = [\r\n    { value: 'pgvector', label: 'PG Vector' },\r\n    { value: 'inmemory', label: 'InMemoryVector' },\r\n  ];\r\n  \r\n  /** Currently selected vector store */\r\n  selectedVectorStore = 'pgvector';\r\n\r\n  // Document type selection\r\n  /** Whether GST analysis is selected */\r\n  selectedGst = true;\r\n  \r\n  /** Whether Bureau analysis is selected */\r\n  selectedBureau = false;\r\n  \r\n  /** Whether Financial analysis is selected */\r\n  selectedFinancial = false;\r\n\r\n  // Prompt templates\r\n  /** GST-specific prompt template */\r\n  gstPromptTemplate = '';\r\n  \r\n  /** Bureau-specific prompt template */\r\n  bureauPromptTemplate = '';\r\n  \r\n  /** Financial-specific prompt template */\r\n  financialPromptTemplate = '';\r\n\r\n  // Prompt history\r\n  /** History of GST prompt templates */\r\n  gstPromptHistory: PromptHistoryItem[] = [];\r\n  \r\n  /** History of Bureau prompt templates */\r\n  bureauPromptHistory: PromptHistoryItem[] = [];\r\n  \r\n  /** History of Financial prompt templates */\r\n  financialPromptHistory: PromptHistoryItem[] = [];\r\n  \r\n  /** Whether GST prompt history is expanded */\r\n  showGstPromptHistory = false;\r\n  \r\n  /** Whether Bureau prompt history is expanded */\r\n  showBureauPromptHistory = false;\r\n  \r\n  /** Whether Financial prompt history is expanded */\r\n  showFinancialPromptHistory = false;\r\n\r\n  // Storage keys\r\n  private readonly settingsStorageKey = 'uc-ui.aiSettings.v1';\r\n  private readonly gstHistoryStorageKey = 'uc-ui.aiSettings.gstPromptHistory';\r\n  private readonly bureauHistoryStorageKey = 'uc-ui.aiSettings.bureauPromptHistory';\r\n  private readonly financialHistoryStorageKey = 'uc-ui.aiSettings.financialPromptHistory';\r\n\r\n  // Backup state for cancel functionality\r\n  private backupSelectedModel = 'gemma4:latest';\r\n  private backupPromptTemplate = '';\r\n  private backupChunkSize = 1000;\r\n  private backupChunkOverlap = 150;\r\n  private backupTopK = 15;\r\n  private backupSelectedEmbeddingModel = 'embeddinggemma:300m';\r\n  private backupSelectedSearchType = 'hybrid';\r\n  private backupSelectedVectorStore = 'pgvector';\r\n  private backupSelectedGst = true;\r\n  private backupSelectedBureau = false;\r\n  private backupSelectedFinancial = false;\r\n  private backupGstPromptTemplate = '';\r\n  private backupBureauPromptTemplate = '';\r\n  private backupFinancialPromptTemplate = '';\r\n\r\n  /** Default GST prompt template */\r\n  readonly defaultGstPromptTemplate = `\r\nCredit underwriter summary for \r\n1. Detailed profile and GST report analysis\r\n2. ITC Utilization pattern\r\n3. Customer and supplier risk assessment\r\n4. Fraud & Compliance risk assessment\r\n5. Concentration Risk Assessment\r\n6. Financial Health indicators\r\n7. Underwriter Recommendation\r\n8. Final Recommendation\r\nNote: Don't include the document number in the response\r\n`;\r\n\r\n  /** Default Bureau prompt template */\r\n  readonly defaultBureauPromptTemplate = `Generate in detailed CIBIL summary along with the profile`;\r\n\r\n  /** Default Financial prompt template */\r\n  readonly defaultFinancialPromptTemplate = `Generate a comprehensive Financial Statement analysis covering:\r\n1. Balance Sheet Analysis - Assets, Liabilities, and Equity breakdown\r\n2. Income Statement Review - Revenue, Expenses, and Profitability trends\r\n3. Cash Flow Analysis - Operating, Investing, and Financing activities\r\n4. Key Financial Ratios - Liquidity, Solvency, Profitability, and Efficiency ratios\r\n5. Working Capital Assessment\r\n6. Debt Analysis and Coverage Ratios\r\n7. Year-over-Year Comparison and Trends\r\n8. Financial Health Indicators and Risk Flags\r\n9. Recommendations for Credit Assessment\r\nNote: Focus on data-driven insights relevant for credit underwriting decisions.`;\r\n\r\n  ngOnInit(): void {\r\n    this.loadPromptHistories();\r\n    // Set initial checkbox selections based on document availability\r\n    this.initializeDocumentSelections();\r\n    console.log('[AI-SETTINGS-MODAL] ngOnInit - after initializeDocumentSelections:', {\r\n      hasGst: this.hasGstDocument,\r\n      hasBureau: this.hasBureauDocument,\r\n      hasFinancial: this.hasFinancialDocument,\r\n      selectedGst: this.selectedGst,\r\n      selectedBureau: this.selectedBureau,\r\n      selectedFinancial: this.selectedFinancial\r\n    });\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    console.log('[AI-SETTINGS-MODAL] ngOnChanges - changes:', Object.keys(changes));\r\n    \r\n    // React when document availability inputs change\r\n    if (changes['hasGstDocument'] || changes['hasBureauDocument'] || changes['hasFinancialDocument']) {\r\n      console.log('[AI-SETTINGS-MODAL] Document inputs changed - before init:', {\r\n        hasGst: this.hasGstDocument,\r\n        hasBureau: this.hasBureauDocument,\r\n        hasFinancial: this.hasFinancialDocument\r\n      });\r\n      this.initializeDocumentSelections();\r\n      console.log('[AI-SETTINGS-MODAL] Document inputs changed - after init:', {\r\n        selectedGst: this.selectedGst,\r\n        selectedBureau: this.selectedBureau,\r\n        selectedFinancial: this.selectedFinancial\r\n      });\r\n    }\r\n    \r\n    // React when modal is opened\r\n    if (changes['isOpen'] && changes['isOpen'].currentValue === true) {\r\n      console.log('[AI-SETTINGS-MODAL] Modal opened - before init:', {\r\n        hasGst: this.hasGstDocument,\r\n        hasBureau: this.hasBureauDocument,\r\n        hasFinancial: this.hasFinancialDocument,\r\n        selectedGst: this.selectedGst\r\n      });\r\n      this.initializeDocumentSelections();\r\n      console.log('[AI-SETTINGS-MODAL] Modal opened - after init:', {\r\n        selectedGst: this.selectedGst,\r\n        selectedBureau: this.selectedBureau,\r\n        selectedFinancial: this.selectedFinancial\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Initialize checkbox selections based on document availability\r\n   * All available documents should be selected by default\r\n   */\r\n  private initializeDocumentSelections(): void {\r\n    this.selectedGst = this.hasGstDocument;\r\n    this.selectedBureau = this.hasBureauDocument;\r\n    this.selectedFinancial = this.hasFinancialDocument;\r\n    \r\n    // Update backups as well\r\n    this.backupSelectedGst = this.selectedGst;\r\n    this.backupSelectedBureau = this.selectedBureau;\r\n    this.backupSelectedFinancial = this.selectedFinancial;\r\n  }\r\n\r\n  /**\r\n   * Initialize the modal with current settings from the service\r\n   * Should be called when the modal is opened\r\n   */\r\n  initializeSettings(): void {\r\n    // Sync settings from the service\r\n    this.selectedModel = this.loanSummaryService.selectedModel;\r\n    this.chunkSize = this.loanSummaryService.chunk_size;\r\n    this.chunkOverlap = this.loanSummaryService.chunk_overlap;\r\n    this.topK = this.loanSummaryService.top_k;\r\n    this.selectedEmbeddingModel = this.loanSummaryService.embedding_model;\r\n    this.selectedSearchType = this.loanSummaryService.search_type;\r\n    this.selectedVectorStore = this.loanSummaryService.storage_type;\r\n    \r\n    // Set selections based on document availability - all available documents checked by default\r\n    this.selectedGst = this.hasGstDocument;\r\n    this.selectedBureau = this.hasBureauDocument;\r\n    this.selectedFinancial = this.hasFinancialDocument;\r\n\r\n    // Sync prompt templates from service\r\n    if (this.loanSummaryService.gstPromptTemplate) {\r\n      this.gstPromptTemplate = this.loanSummaryService.gstPromptTemplate;\r\n    }\r\n    if (this.loanSummaryService.bureauPromptTemplate) {\r\n      this.bureauPromptTemplate = this.loanSummaryService.bureauPromptTemplate;\r\n    }\r\n    if (this.loanSummaryService.financialPromptTemplate) {\r\n      this.financialPromptTemplate = this.loanSummaryService.financialPromptTemplate;\r\n    }\r\n\r\n    // Create backup for cancel functionality\r\n    this.createBackup();\r\n  }\r\n\r\n  private createBackup(): void {\r\n    this.backupSelectedModel = this.selectedModel;\r\n    this.backupPromptTemplate = this.promptTemplate;\r\n    this.backupChunkSize = this.chunkSize;\r\n    this.backupChunkOverlap = this.chunkOverlap;\r\n    this.backupTopK = this.topK;\r\n    this.backupSelectedEmbeddingModel = this.selectedEmbeddingModel;\r\n    this.backupSelectedSearchType = this.selectedSearchType;\r\n    this.backupSelectedVectorStore = this.selectedVectorStore;\r\n    this.backupSelectedGst = this.selectedGst;\r\n    this.backupSelectedBureau = this.selectedBureau;\r\n    this.backupSelectedFinancial = this.selectedFinancial;\r\n    this.backupGstPromptTemplate = this.gstPromptTemplate;\r\n    this.backupBureauPromptTemplate = this.bureauPromptTemplate;\r\n    this.backupFinancialPromptTemplate = this.financialPromptTemplate;\r\n  }\r\n\r\n  private restoreBackup(): void {\r\n    this.selectedModel = this.backupSelectedModel;\r\n    this.promptTemplate = this.backupPromptTemplate;\r\n    this.chunkSize = this.backupChunkSize;\r\n    this.chunkOverlap = this.backupChunkOverlap;\r\n    this.topK = this.backupTopK;\r\n    this.selectedEmbeddingModel = this.backupSelectedEmbeddingModel;\r\n    this.selectedSearchType = this.backupSelectedSearchType;\r\n    this.selectedVectorStore = this.backupSelectedVectorStore;\r\n    this.selectedGst = this.backupSelectedGst;\r\n    this.selectedBureau = this.backupSelectedBureau;\r\n    this.selectedFinancial = this.backupSelectedFinancial;\r\n    this.gstPromptTemplate = this.backupGstPromptTemplate;\r\n    this.bureauPromptTemplate = this.backupBureauPromptTemplate;\r\n    this.financialPromptTemplate = this.backupFinancialPromptTemplate;\r\n  }\r\n\r\n  /**\r\n   * Handle modal close - restores backup and emits close event\r\n   */\r\n  onClose(): void {\r\n    this.restoreBackup();\r\n    this.closeModal.emit();\r\n  }\r\n\r\n  /**\r\n   * Handle overlay click - closes modal\r\n   */\r\n  onOverlayClick(): void {\r\n    this.onClose();\r\n  }\r\n\r\n  /**\r\n   * Prevent modal content clicks from closing modal\r\n   */\r\n  onModalClick(event: Event): void {\r\n    event.stopPropagation();\r\n  }\r\n\r\n  /**\r\n   * Save all settings to localStorage and sync with service\r\n   */\r\n  saveSettings(): void {\r\n    // Validate prompts\r\n    if (this.selectedGst && !this.gstPromptTemplate?.trim()) {\r\n      alert('GST prompt template cannot be empty when GST is selected.');\r\n      return;\r\n    }\r\n    if (this.selectedBureau && !this.bureauPromptTemplate?.trim()) {\r\n      alert('Bureau prompt template cannot be empty when Bureau is selected.');\r\n      return;\r\n    }\r\n    if (this.selectedFinancial && !this.financialPromptTemplate?.trim()) {\r\n      alert('Financial prompt template cannot be empty when Financial Statement is selected.');\r\n      return;\r\n    }\r\n\r\n    const settings: AiSettingsData = {\r\n      selectedModel: this.selectedModel,\r\n      promptTemplate: this.promptTemplate,\r\n      chunkSize: this.chunkSize,\r\n      chunkOverlap: this.chunkOverlap,\r\n      topK: this.topK,\r\n      embeddingModel: this.selectedEmbeddingModel,\r\n      searchType: this.selectedSearchType,\r\n      vectorStore: this.selectedVectorStore,\r\n      selectedGst: this.selectedGst,\r\n      selectedBureau: this.selectedBureau,\r\n      selectedFinancial: this.selectedFinancial,\r\n      gstPromptTemplate: this.gstPromptTemplate,\r\n      bureauPromptTemplate: this.bureauPromptTemplate,\r\n      financialPromptTemplate: this.financialPromptTemplate\r\n    };\r\n\r\n    try {\r\n      localStorage.setItem(this.settingsStorageKey, JSON.stringify(settings));\r\n\r\n      // Save prompts to history\r\n      if (this.selectedGst && this.gstPromptTemplate?.trim()) {\r\n        this.addToGstPromptHistory(this.gstPromptTemplate, 'typed');\r\n      }\r\n      if (this.selectedBureau && this.bureauPromptTemplate?.trim()) {\r\n        this.addToBureauPromptHistory(this.bureauPromptTemplate, 'typed');\r\n      }\r\n      if (this.selectedFinancial && this.financialPromptTemplate?.trim()) {\r\n        this.addToFinancialPromptHistory(this.financialPromptTemplate, 'typed');\r\n      }\r\n\r\n      // Update backup\r\n      this.createBackup();\r\n\r\n      // Sync to service\r\n      this.loanSummaryService.selectedModel = this.selectedModel;\r\n      this.loanSummaryService.chunk_size = this.chunkSize;\r\n      this.loanSummaryService.chunk_overlap = this.chunkOverlap;\r\n      this.loanSummaryService.top_k = this.topK;\r\n      this.loanSummaryService.embedding_model = this.selectedEmbeddingModel;\r\n      this.loanSummaryService.search_type = this.selectedSearchType;\r\n      this.loanSummaryService.storage_type = this.selectedVectorStore;\r\n      this.loanSummaryService.selectedGst = this.selectedGst;\r\n      this.loanSummaryService.selectedBureau = this.selectedBureau;\r\n      this.loanSummaryService.selectedFinancial = this.selectedFinancial;\r\n      this.loanSummaryService.gstPromptTemplate = this.gstPromptTemplate;\r\n      this.loanSummaryService.bureauPromptTemplate = this.bureauPromptTemplate;\r\n      this.loanSummaryService.financialPromptTemplate = this.financialPromptTemplate;\r\n\r\n      this.settingsSaved.emit(settings);\r\n      this.closeModal.emit();\r\n\r\n      console.log('AI settings saved to cache.');\r\n    } catch (e) {\r\n      console.error('Failed to save settings to localStorage:', e);\r\n      alert('Failed to save settings. Please try again.');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Reset all settings to default values\r\n   */\r\n  resetSettings(): void {\r\n    this.selectedModel = 'llama3.2:3b';\r\n    this.promptTemplate = '';\r\n    this.chunkSize = 500;\r\n    this.chunkOverlap = 100;\r\n    this.topK = 10;\r\n    this.selectedEmbeddingModel = 'embeddinggemma:300m';\r\n    this.selectedSearchType = 'similarity';\r\n    this.selectedVectorStore = 'inmemory';\r\n\r\n    this.createBackup();\r\n\r\n    try {\r\n      localStorage.removeItem(this.settingsStorageKey);\r\n      console.log('AI settings reset to defaults.');\r\n    } catch (e) {\r\n      console.error('Failed to clear settings from localStorage:', e);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Format slider label for display\r\n   */\r\n  formatSliderLabel(value: number): string {\r\n    return `${value}`;\r\n  }\r\n\r\n  // ========== Document Type Toggle Methods ==========\r\n\r\n  toggleGstSelection(): void {\r\n    if (this.selectedGst && !this.selectedBureau && !this.selectedFinancial) {\r\n      return;\r\n    }\r\n    this.selectedGst = !this.selectedGst;\r\n  }\r\n\r\n  toggleBureauSelection(): void {\r\n    if (this.selectedBureau && !this.selectedGst && !this.selectedFinancial) {\r\n      return;\r\n    }\r\n    this.selectedBureau = !this.selectedBureau;\r\n  }\r\n\r\n  toggleFinancial(): void {\r\n    if (this.selectedFinancial && !this.selectedGst && !this.selectedBureau) {\r\n      return;\r\n    }\r\n    this.selectedFinancial = !this.selectedFinancial;\r\n\r\n    if (this.selectedFinancial && !this.financialPromptTemplate?.trim()) {\r\n      this.financialPromptTemplate = this.defaultFinancialPromptTemplate;\r\n    }\r\n  }\r\n\r\n  // ========== Default Prompt Template Methods ==========\r\n\r\n  loadDefaultGstPromptTemplate(): void {\r\n    this.gstPromptTemplate = this.defaultGstPromptTemplate;\r\n  }\r\n\r\n  loadDefaultBureauPromptTemplate(): void {\r\n    this.bureauPromptTemplate = this.defaultBureauPromptTemplate;\r\n  }\r\n\r\n  loadDefaultFinancialPromptTemplate(): void {\r\n    this.financialPromptTemplate = this.defaultFinancialPromptTemplate;\r\n  }\r\n\r\n  // ========== File Upload Methods ==========\r\n\r\n  triggerGstPromptFileUpload(): void {\r\n    this.gstPromptFileInput?.nativeElement?.click();\r\n  }\r\n\r\n  triggerBureauPromptFileUpload(): void {\r\n    this.bureauPromptFileInput?.nativeElement?.click();\r\n  }\r\n\r\n  triggerFinancialPromptFileUpload(): void {\r\n    this.financialPromptFileInput?.nativeElement?.click();\r\n  }\r\n\r\n  onGstPromptFileUpload(event: Event): void {\r\n    this.handleFileUpload(event, 'gst');\r\n  }\r\n\r\n  onBureauPromptFileUpload(event: Event): void {\r\n    this.handleFileUpload(event, 'bureau');\r\n  }\r\n\r\n  onFinancialPromptFileUpload(event: Event): void {\r\n    this.handleFileUpload(event, 'financial');\r\n  }\r\n\r\n  private handleFileUpload(event: Event, type: 'gst' | 'bureau' | 'financial'): void {\r\n    const input = event.target as HTMLInputElement;\r\n    const file = input.files?.[0];\r\n\r\n    if (!file) return;\r\n\r\n    if (!file.name.toLowerCase().endsWith('.txt')) {\r\n      alert('Please upload a .txt file.');\r\n      input.value = '';\r\n      return;\r\n    }\r\n\r\n    const maxSizeBytes = 1 * 1024 * 1024;\r\n    if (file.size > maxSizeBytes) {\r\n      alert('File size exceeds 1 MB limit.');\r\n      input.value = '';\r\n      return;\r\n    }\r\n\r\n    const reader = new FileReader();\r\n    reader.onload = () => {\r\n      const content = reader.result as string;\r\n      if (content && content.trim()) {\r\n        switch (type) {\r\n          case 'gst':\r\n            this.gstPromptTemplate = content.trim();\r\n            this.addToGstPromptHistory(this.gstPromptTemplate, 'uploaded');\r\n            break;\r\n          case 'bureau':\r\n            this.bureauPromptTemplate = content.trim();\r\n            this.addToBureauPromptHistory(this.bureauPromptTemplate, 'uploaded');\r\n            break;\r\n          case 'financial':\r\n            this.financialPromptTemplate = content.trim();\r\n            this.addToFinancialPromptHistory(this.financialPromptTemplate, 'uploaded');\r\n            break;\r\n        }\r\n        console.log(`${type.toUpperCase()} Prompt template loaded from file.`);\r\n      } else {\r\n        alert('The uploaded file is empty.');\r\n      }\r\n    };\r\n    reader.onerror = () => {\r\n      alert('Failed to read file.');\r\n    };\r\n    reader.readAsText(file);\r\n    input.value = '';\r\n  }\r\n\r\n  // ========== Prompt History Methods ==========\r\n\r\n  private loadPromptHistories(): void {\r\n    this.loadGstPromptHistory();\r\n    this.loadBureauPromptHistory();\r\n    this.loadFinancialPromptHistory();\r\n  }\r\n\r\n  toggleGstPromptHistory(): void {\r\n    this.showGstPromptHistory = !this.showGstPromptHistory;\r\n  }\r\n\r\n  toggleBureauPromptHistory(): void {\r\n    this.showBureauPromptHistory = !this.showBureauPromptHistory;\r\n  }\r\n\r\n  toggleFinancialPromptHistory(): void {\r\n    this.showFinancialPromptHistory = !this.showFinancialPromptHistory;\r\n  }\r\n\r\n  private loadGstPromptHistory(): void {\r\n    try {\r\n      const cached = localStorage.getItem(this.gstHistoryStorageKey);\r\n      if (cached) {\r\n        this.gstPromptHistory = JSON.parse(cached);\r\n      }\r\n    } catch (e) {\r\n      console.error('Failed to load GST prompt history:', e);\r\n      this.gstPromptHistory = [];\r\n    }\r\n  }\r\n\r\n  private loadBureauPromptHistory(): void {\r\n    try {\r\n      const cached = localStorage.getItem(this.bureauHistoryStorageKey);\r\n      if (cached) {\r\n        this.bureauPromptHistory = JSON.parse(cached);\r\n      }\r\n    } catch (e) {\r\n      console.error('Failed to load Bureau prompt history:', e);\r\n      this.bureauPromptHistory = [];\r\n    }\r\n  }\r\n\r\n  private loadFinancialPromptHistory(): void {\r\n    try {\r\n      const cached = localStorage.getItem(this.financialHistoryStorageKey);\r\n      if (cached) {\r\n        this.financialPromptHistory = JSON.parse(cached);\r\n      }\r\n    } catch (e) {\r\n      console.error('Failed to load Financial prompt history:', e);\r\n      this.financialPromptHistory = [];\r\n    }\r\n  }\r\n\r\n  addToGstPromptHistory(template: string, source: 'typed' | 'uploaded'): void {\r\n    if (template === this.defaultGstPromptTemplate) return;\r\n    if (this.gstPromptHistory.length > 0 && this.gstPromptHistory[0].template === template) return;\r\n\r\n    const newEntry: PromptHistoryItem = {\r\n      template: template,\r\n      timestamp: new Date().toISOString(),\r\n      source: source\r\n    };\r\n\r\n    this.gstPromptHistory = [newEntry, ...this.gstPromptHistory.filter(h => h.template !== template)].slice(0, 10);\r\n\r\n    try {\r\n      localStorage.setItem(this.gstHistoryStorageKey, JSON.stringify(this.gstPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to save GST prompt history:', e);\r\n    }\r\n  }\r\n\r\n  addToBureauPromptHistory(template: string, source: 'typed' | 'uploaded'): void {\r\n    if (template === this.defaultBureauPromptTemplate) return;\r\n    if (this.bureauPromptHistory.length > 0 && this.bureauPromptHistory[0].template === template) return;\r\n\r\n    const newEntry: PromptHistoryItem = {\r\n      template: template,\r\n      timestamp: new Date().toISOString(),\r\n      source: source\r\n    };\r\n\r\n    this.bureauPromptHistory = [newEntry, ...this.bureauPromptHistory.filter(h => h.template !== template)].slice(0, 10);\r\n\r\n    try {\r\n      localStorage.setItem(this.bureauHistoryStorageKey, JSON.stringify(this.bureauPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to save Bureau prompt history:', e);\r\n    }\r\n  }\r\n\r\n  addToFinancialPromptHistory(template: string, source: 'typed' | 'uploaded'): void {\r\n    if (template === this.defaultFinancialPromptTemplate) return;\r\n    if (this.financialPromptHistory.length > 0 && this.financialPromptHistory[0].template === template) return;\r\n\r\n    const newEntry: PromptHistoryItem = {\r\n      template: template,\r\n      timestamp: new Date().toISOString(),\r\n      source: source\r\n    };\r\n\r\n    this.financialPromptHistory = [newEntry, ...this.financialPromptHistory.filter(h => h.template !== template)].slice(0, 10);\r\n\r\n    try {\r\n      localStorage.setItem(this.financialHistoryStorageKey, JSON.stringify(this.financialPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to save Financial prompt history:', e);\r\n    }\r\n  }\r\n\r\n  selectGstFromHistory(historyItem: PromptHistoryItem): void {\r\n    this.gstPromptTemplate = historyItem.template;\r\n    this.showGstPromptHistory = false;\r\n  }\r\n\r\n  selectBureauFromHistory(historyItem: PromptHistoryItem): void {\r\n    this.bureauPromptTemplate = historyItem.template;\r\n    this.showBureauPromptHistory = false;\r\n  }\r\n\r\n  selectFinancialFromHistory(historyItem: PromptHistoryItem): void {\r\n    this.financialPromptTemplate = historyItem.template;\r\n    this.showFinancialPromptHistory = false;\r\n  }\r\n\r\n  deleteGstFromHistory(index: number, event: Event): void {\r\n    event.stopPropagation();\r\n    this.gstPromptHistory.splice(index, 1);\r\n    try {\r\n      localStorage.setItem(this.gstHistoryStorageKey, JSON.stringify(this.gstPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to update GST prompt history:', e);\r\n    }\r\n  }\r\n\r\n  deleteBureauFromHistory(index: number, event: Event): void {\r\n    event.stopPropagation();\r\n    this.bureauPromptHistory.splice(index, 1);\r\n    try {\r\n      localStorage.setItem(this.bureauHistoryStorageKey, JSON.stringify(this.bureauPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to update Bureau prompt history:', e);\r\n    }\r\n  }\r\n\r\n  deleteFinancialFromHistory(index: number, event: Event): void {\r\n    event.stopPropagation();\r\n    this.financialPromptHistory.splice(index, 1);\r\n    try {\r\n      localStorage.setItem(this.financialHistoryStorageKey, JSON.stringify(this.financialPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to update Financial prompt history:', e);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Format history date for display\r\n   */\r\n  formatHistoryDate(timestamp: string): string {\r\n    const date = new Date(timestamp);\r\n    return date.toLocaleDateString('en-US', {\r\n      month: 'short',\r\n      day: 'numeric',\r\n      year: 'numeric',\r\n      hour: '2-digit',\r\n      minute: '2-digit'\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Get preview text for prompt history items\r\n   */\r\n  getPromptPreview(template: string): string {\r\n    return template.length > 80 ? template.substring(0, 80) + '...' : template;\r\n  }\r\n}\r\n","@if (isOpen) {\r\n  <div class=\"settings-modal-overlay\" (click)=\"onOverlayClick()\">\r\n    <div class=\"settings-modal\" (click)=\"onModalClick($event)\">\r\n      <div class=\"settings-modal-header\">\r\n        <h3>\r\n          <mat-icon>settings</mat-icon>\r\n          AI Settings\r\n        </h3>\r\n        <button mat-icon-button (click)=\"onClose()\" matTooltip=\"Close\">\r\n          <mat-icon>close</mat-icon>\r\n        </button>\r\n      </div>\r\n\r\n      <div class=\"settings-modal-content\">\r\n        <!-- Model Selection -->\r\n        <div class=\"settings-section\">\r\n          <label class=\"section-label\">\r\n            <mat-icon>smart_toy</mat-icon>\r\n            Select Model\r\n          </label>\r\n          <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n            <mat-select [(ngModel)]=\"selectedModel\">\r\n              @for (model of availableModels; track model) {\r\n                <mat-option [value]=\"model\">{{ model }}</mat-option>\r\n              }\r\n            </mat-select>\r\n          </mat-form-field>\r\n        </div>\r\n\r\n        <!-- Data Type Selection (Checkboxes - at least one required) -->\r\n        <div class=\"settings-section\">\r\n          <label class=\"section-label\">\r\n            <mat-icon>category</mat-icon>\r\n            Select Document Types for Analysis\r\n          </label>\r\n          <p class=\"section-hint\">\r\n            Select one or more document types (minimum one required)\r\n          </p>\r\n          <div class=\"data-type-selection\">\r\n            @if (hasGstDocument) {\r\n              <div\r\n                class=\"data-type-option\"\r\n                [class.selected]=\"selectedGst\"\r\n                (click)=\"toggleGstSelection()\"\r\n              >\r\n                <div class=\"checkbox-square\" [class.checked]=\"selectedGst\">\r\n                  @if (selectedGst) {\r\n                    <mat-icon class=\"check-icon\">check</mat-icon>\r\n                  }\r\n                </div>\r\n                <mat-icon>receipt_long</mat-icon>\r\n                <span>GST Data</span>\r\n              </div>\r\n            }\r\n            @if (hasBureauDocument) {\r\n              <div\r\n                class=\"data-type-option\"\r\n                [class.selected]=\"selectedBureau\"\r\n                (click)=\"toggleBureauSelection()\"\r\n              >\r\n                <div class=\"checkbox-square\" [class.checked]=\"selectedBureau\">\r\n                  @if (selectedBureau) {\r\n                    <mat-icon class=\"check-icon\">check</mat-icon>\r\n                  }\r\n                </div>\r\n                <mat-icon>credit_score</mat-icon>\r\n                <span>Bureau Data</span>\r\n              </div>\r\n            }\r\n            @if (hasFinancialDocument) {\r\n              <div\r\n                class=\"data-type-option\"\r\n                [class.selected]=\"selectedFinancial\"\r\n                (click)=\"toggleFinancial()\"\r\n              >\r\n                <div\r\n                  class=\"checkbox-square\"\r\n                  [class.checked]=\"selectedFinancial\"\r\n                >\r\n                  @if (selectedFinancial) {\r\n                    <mat-icon class=\"check-icon\">check</mat-icon>\r\n                  }\r\n                </div>\r\n                <mat-icon>account_balance</mat-icon>\r\n                <span>Financial Statement</span>\r\n              </div>\r\n            }\r\n          </div>\r\n        </div>\r\n\r\n        <!-- GST Prompt Template (shown when GST selected and available) -->\r\n        @if (selectedGst && hasGstDocument) {\r\n          <div class=\"settings-section\">\r\n            <div class=\"section-header-row\">\r\n              <label class=\"section-label\">\r\n                <mat-icon>receipt_long</mat-icon>\r\n                GST Prompt Template\r\n              </label>\r\n              <div class=\"prompt-actions\">\r\n                <div\r\n                  class=\"default-prompt-card\"\r\n                  (click)=\"loadDefaultGstPromptTemplate()\"\r\n                  matTooltip=\"Load Default GST Template\"\r\n                >\r\n                  <mat-icon>auto_fix_high</mat-icon>\r\n                  <span>Default</span>\r\n                </div>\r\n              </div>\r\n            </div>\r\n            <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n              <textarea\r\n                matInput\r\n                [(ngModel)]=\"gstPromptTemplate\"\r\n                rows=\"6\"\r\n                placeholder=\"Enter your GST analysis prompt...\"\r\n              ></textarea>\r\n            </mat-form-field>\r\n\r\n            <!-- GST Prompt File Upload -->\r\n            <div class=\"file-upload-inline\">\r\n              <div\r\n                class=\"file-upload-area small\"\r\n                (click)=\"triggerGstPromptFileUpload()\"\r\n              >\r\n                <mat-icon>cloud_upload</mat-icon>\r\n                <span>Upload .txt file</span>\r\n              </div>\r\n              <input\r\n                type=\"file\"\r\n                #gstPromptFileInput\r\n                accept=\".txt\"\r\n                (change)=\"onGstPromptFileUpload($event)\"\r\n                style=\"display: none\"\r\n              />\r\n            </div>\r\n\r\n            <!-- GST Prompt History -->\r\n            <div class=\"prompt-history-inline\">\r\n              <div class=\"history-header\" (click)=\"toggleGstPromptHistory()\">\r\n                <mat-icon>history</mat-icon>\r\n                <span>GST Prompt History</span>\r\n                <mat-icon class=\"expand-icon\">{{\r\n                  showGstPromptHistory ? \"expand_less\" : \"expand_more\"\r\n                }}</mat-icon>\r\n              </div>\r\n              @if (showGstPromptHistory && gstPromptHistory.length > 0) {\r\n                <div class=\"history-list-compact\">\r\n                  @for (\r\n                    item of gstPromptHistory;\r\n                    track item.timestamp;\r\n                    let i = $index\r\n                  ) {\r\n                    <div\r\n                      class=\"history-item-compact\"\r\n                      (click)=\"selectGstFromHistory(item)\"\r\n                      [class.selected]=\"gstPromptTemplate === item.template\"\r\n                    >\r\n                      <p class=\"history-preview\">\r\n                        {{ getPromptPreview(item.template) }}\r\n                      </p>\r\n                      <div class=\"history-meta\">\r\n                        <span>{{ formatHistoryDate(item.timestamp) }}</span>\r\n                        <button\r\n                          mat-icon-button\r\n                          class=\"delete-btn-small\"\r\n                          (click)=\"deleteGstFromHistory(i, $event)\"\r\n                          matTooltip=\"Delete\"\r\n                        >\r\n                          <mat-icon>close</mat-icon>\r\n                        </button>\r\n                      </div>\r\n                    </div>\r\n                  }\r\n                </div>\r\n              }\r\n              @if (showGstPromptHistory && gstPromptHistory.length === 0) {\r\n                <p class=\"history-empty-text\">No GST prompt history yet</p>\r\n              }\r\n            </div>\r\n          </div>\r\n        }\r\n\r\n        <!-- Bureau Prompt Template (shown when Bureau selected and available) -->\r\n        @if (selectedBureau && hasBureauDocument) {\r\n          <div class=\"settings-section\">\r\n            <div class=\"section-header-row\">\r\n              <label class=\"section-label\">\r\n                <mat-icon>credit_score</mat-icon>\r\n                Bureau Prompt Template\r\n              </label>\r\n              <div class=\"prompt-actions\">\r\n                <div\r\n                  class=\"default-prompt-card\"\r\n                  (click)=\"loadDefaultBureauPromptTemplate()\"\r\n                  matTooltip=\"Load Default Bureau Template\"\r\n                >\r\n                  <mat-icon>auto_fix_high</mat-icon>\r\n                  <span>Default</span>\r\n                </div>\r\n              </div>\r\n            </div>\r\n            <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n              <textarea\r\n                matInput\r\n                [(ngModel)]=\"bureauPromptTemplate\"\r\n                rows=\"6\"\r\n                placeholder=\"Enter your Bureau analysis prompt...\"\r\n              ></textarea>\r\n            </mat-form-field>\r\n\r\n            <!-- Bureau Prompt File Upload -->\r\n            <div class=\"file-upload-inline\">\r\n              <div\r\n                class=\"file-upload-area small\"\r\n                (click)=\"triggerBureauPromptFileUpload()\"\r\n              >\r\n                <mat-icon>cloud_upload</mat-icon>\r\n                <span>Upload .txt file</span>\r\n              </div>\r\n              <input\r\n                type=\"file\"\r\n                #bureauPromptFileInput\r\n                accept=\".txt\"\r\n                (change)=\"onBureauPromptFileUpload($event)\"\r\n                style=\"display: none\"\r\n              />\r\n            </div>\r\n\r\n            <!-- Bureau Prompt History -->\r\n            <div class=\"prompt-history-inline\">\r\n              <div class=\"history-header\" (click)=\"toggleBureauPromptHistory()\">\r\n                <mat-icon>history</mat-icon>\r\n                <span>Bureau Prompt History</span>\r\n                <mat-icon class=\"expand-icon\">{{\r\n                  showBureauPromptHistory ? \"expand_less\" : \"expand_more\"\r\n                }}</mat-icon>\r\n              </div>\r\n              @if (showBureauPromptHistory && bureauPromptHistory.length > 0) {\r\n                <div class=\"history-list-compact\">\r\n                  @for (\r\n                    item of bureauPromptHistory;\r\n                    track item.timestamp;\r\n                    let i = $index\r\n                  ) {\r\n                    <div\r\n                      class=\"history-item-compact\"\r\n                      (click)=\"selectBureauFromHistory(item)\"\r\n                      [class.selected]=\"bureauPromptTemplate === item.template\"\r\n                    >\r\n                      <p class=\"history-preview\">\r\n                        {{ getPromptPreview(item.template) }}\r\n                      </p>\r\n                      <div class=\"history-meta\">\r\n                        <span>{{ formatHistoryDate(item.timestamp) }}</span>\r\n                        <button\r\n                          mat-icon-button\r\n                          class=\"delete-btn-small\"\r\n                          (click)=\"deleteBureauFromHistory(i, $event)\"\r\n                          matTooltip=\"Delete\"\r\n                        >\r\n                          <mat-icon>close</mat-icon>\r\n                        </button>\r\n                      </div>\r\n                    </div>\r\n                  }\r\n                </div>\r\n              }\r\n              @if (\r\n                showBureauPromptHistory && bureauPromptHistory.length === 0\r\n              ) {\r\n                <p class=\"history-empty-text\">No Bureau prompt history yet</p>\r\n              }\r\n            </div>\r\n          </div>\r\n        }\r\n\r\n        <!-- Financial Statement Prompt Template (shown when Financial selected and available) -->\r\n        @if (selectedFinancial && hasFinancialDocument) {\r\n          <div class=\"settings-section\">\r\n            <div class=\"section-header-row\">\r\n              <label class=\"section-label\">\r\n                <mat-icon>account_balance</mat-icon>\r\n                Financial Statement Prompt Template\r\n              </label>\r\n              <div class=\"prompt-actions\">\r\n                <div\r\n                  class=\"default-prompt-card\"\r\n                  (click)=\"loadDefaultFinancialPromptTemplate()\"\r\n                  matTooltip=\"Load Default Financial Template\"\r\n                >\r\n                  <mat-icon>auto_fix_high</mat-icon>\r\n                  <span>Default</span>\r\n                </div>\r\n              </div>\r\n            </div>\r\n            <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n              <textarea\r\n                matInput\r\n                [(ngModel)]=\"financialPromptTemplate\"\r\n                rows=\"6\"\r\n                placeholder=\"Enter your Financial Statement analysis prompt...\"\r\n              ></textarea>\r\n            </mat-form-field>\r\n\r\n            <!-- Financial Prompt File Upload -->\r\n            <div class=\"file-upload-inline\">\r\n              <div\r\n                class=\"file-upload-area small\"\r\n                (click)=\"triggerFinancialPromptFileUpload()\"\r\n              >\r\n                <mat-icon>cloud_upload</mat-icon>\r\n                <span>Upload .txt file</span>\r\n              </div>\r\n              <input\r\n                type=\"file\"\r\n                #financialPromptFileInput\r\n                accept=\".txt\"\r\n                (change)=\"onFinancialPromptFileUpload($event)\"\r\n                style=\"display: none\"\r\n              />\r\n            </div>\r\n\r\n            <!-- Financial Prompt History -->\r\n            <div class=\"prompt-history-inline\">\r\n              <div\r\n                class=\"history-header\"\r\n                (click)=\"toggleFinancialPromptHistory()\"\r\n              >\r\n                <mat-icon>history</mat-icon>\r\n                <span>Financial Prompt History</span>\r\n                <mat-icon class=\"expand-icon\">{{\r\n                  showFinancialPromptHistory ? \"expand_less\" : \"expand_more\"\r\n                }}</mat-icon>\r\n              </div>\r\n              @if (\r\n                showFinancialPromptHistory && financialPromptHistory.length > 0\r\n              ) {\r\n                <div class=\"history-list-compact\">\r\n                  @for (\r\n                    item of financialPromptHistory;\r\n                    track item.timestamp;\r\n                    let i = $index\r\n                  ) {\r\n                    <div\r\n                      class=\"history-item-compact\"\r\n                      (click)=\"selectFinancialFromHistory(item)\"\r\n                      [class.selected]=\"\r\n                        financialPromptTemplate === item.template\r\n                      \"\r\n                    >\r\n                      <p class=\"history-preview\">\r\n                        {{ getPromptPreview(item.template) }}\r\n                      </p>\r\n                      <div class=\"history-meta\">\r\n                        <span>{{ formatHistoryDate(item.timestamp) }}</span>\r\n                        <button\r\n                          mat-icon-button\r\n                          class=\"delete-btn-small\"\r\n                          (click)=\"deleteFinancialFromHistory(i, $event)\"\r\n                          matTooltip=\"Delete\"\r\n                        >\r\n                          <mat-icon>close</mat-icon>\r\n                        </button>\r\n                      </div>\r\n                    </div>\r\n                  }\r\n                </div>\r\n              }\r\n              @if (\r\n                showFinancialPromptHistory &&\r\n                financialPromptHistory.length === 0\r\n              ) {\r\n                <p class=\"history-empty-text\">\r\n                  No Financial prompt history yet\r\n                </p>\r\n              }\r\n            </div>\r\n          </div>\r\n        }\r\n\r\n        <!-- RAG Configuration Section -->\r\n        <div class=\"settings-section rag-config-section\">\r\n          <div class=\"section-divider\">\r\n            <span class=\"divider-label\">RAG Configuration</span>\r\n          </div>\r\n          <p class=\"rag-description\">\r\n            Configure RAG parameters for better output accuracy\r\n          </p>\r\n\r\n          <!-- Chunk Size -->\r\n          <div class=\"rag-field\">\r\n            <label class=\"field-label\">\r\n              <mat-icon>data_array</mat-icon>\r\n              Chunk Size\r\n            </label>\r\n            <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n              <input\r\n                matInput\r\n                type=\"number\"\r\n                [(ngModel)]=\"chunkSize\"\r\n                placeholder=\"500\"\r\n                min=\"100\"\r\n                max=\"2000\"\r\n              />\r\n              <mat-hint>Characters per chunk (100-2000)</mat-hint>\r\n            </mat-form-field>\r\n          </div>\r\n\r\n          <!-- Chunk Overlap -->\r\n          <div class=\"rag-field\">\r\n            <label class=\"field-label\">\r\n              <mat-icon>compare_arrows</mat-icon>\r\n              Chunk Overlap\r\n            </label>\r\n            <div class=\"slider-container\">\r\n              <mat-slider\r\n                min=\"50\"\r\n                max=\"1000\"\r\n                step=\"50\"\r\n                discrete\r\n                [displayWith]=\"formatSliderLabel\"\r\n              >\r\n                <input matSliderThumb [(ngModel)]=\"chunkOverlap\" />\r\n              </mat-slider>\r\n              <span class=\"slider-value\">{{ chunkOverlap }}</span>\r\n            </div>\r\n          </div>\r\n\r\n          <!-- Top K -->\r\n          <div class=\"rag-field\">\r\n            <label class=\"field-label\">\r\n              <mat-icon>filter_list</mat-icon>\r\n              Top K (Retrieved Chunks)\r\n            </label>\r\n            <div class=\"slider-container\">\r\n              <mat-slider\r\n                min=\"1\"\r\n                max=\"20\"\r\n                step=\"1\"\r\n                discrete\r\n                [displayWith]=\"formatSliderLabel\"\r\n              >\r\n                <input matSliderThumb [(ngModel)]=\"topK\" />\r\n              </mat-slider>\r\n              <span class=\"slider-value\">{{ topK }}</span>\r\n            </div>\r\n          </div>\r\n\r\n          <!-- Embedding Model -->\r\n          <div class=\"rag-field\">\r\n            <label class=\"field-label\">\r\n              <mat-icon>hub</mat-icon>\r\n              Embedding Model\r\n            </label>\r\n            <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n              <mat-select [(ngModel)]=\"selectedEmbeddingModel\">\r\n                @for (model of availableEmbeddingModels; track model) {\r\n                  <mat-option [value]=\"model\">{{ model }}</mat-option>\r\n                }\r\n              </mat-select>\r\n            </mat-form-field>\r\n          </div>\r\n\r\n          <!-- Search Type -->\r\n          <div class=\"rag-field\">\r\n            <label class=\"field-label\">\r\n              <mat-icon>search</mat-icon>\r\n              Search Type\r\n            </label>\r\n            <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n              <mat-select [(ngModel)]=\"selectedSearchType\">\r\n                @for (\r\n                  searchType of availableSearchTypes;\r\n                  track searchType.value\r\n                ) {\r\n                  <mat-option [value]=\"searchType.value\">{{\r\n                    searchType.label\r\n                  }}</mat-option>\r\n                }\r\n              </mat-select>\r\n            </mat-form-field>\r\n          </div>\r\n\r\n          <!-- Vector Store Type -->\r\n          <div class=\"rag-field\">\r\n            <label class=\"field-label\">\r\n              <mat-icon>storage</mat-icon>\r\n              Vector Store Type\r\n            </label>\r\n            <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n              <mat-select [(ngModel)]=\"selectedVectorStore\">\r\n                @for (store of availableVectorStores; track store.value) {\r\n                  <mat-option [value]=\"store.value\">{{\r\n                    store.label\r\n                  }}</mat-option>\r\n                }\r\n              </mat-select>\r\n            </mat-form-field>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <div class=\"settings-modal-footer\">\r\n        <button mat-stroked-button color=\"warn\" (click)=\"resetSettings()\">\r\n          <mat-icon>refresh</mat-icon>\r\n          Reset\r\n        </button>\r\n        <button mat-flat-button color=\"primary\" (click)=\"saveSettings()\">\r\n          <mat-icon>save</mat-icon>\r\n          Save\r\n        </button>\r\n      </div>\r\n    </div>\r\n  </div>\r\n}\r\n","import { Component, Inject, OnInit, OnDestroy, ViewChild, ElementRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Subject } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators';\r\nimport {\r\n  MAT_DIALOG_DATA,\r\n  MatDialogRef,\r\n  MatDialogModule,\r\n} from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSliderModule } from '@angular/material/slider';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatSidenavModule } from '@angular/material/sidenav';\r\nimport { trigger, transition, style, animate, keyframes } from '@angular/animations';\r\n\r\nimport { LoanSummaryService } from '../../../services/loan-summary.service';\r\nimport html2pdf from 'html2pdf.js';\r\nimport {\r\n  Proposal,\r\n  SummaryService,\r\n  LoanSummaryDetails,\r\n  GoNoGoDecision,\r\n  BureauData,\r\n} from '../../../models/loan-summary.model';\r\nimport {\r\n  QuickSummary,\r\n  GstQuickSummary,\r\n  BureauQuickSummary,\r\n  FinancialQuickSummary,\r\n} from '../../../models/api-response.model';\r\nimport { ServiceCardComponent } from './service-card/service-card.component';\r\nimport { SummaryLoadingComponent } from '../../shared/summary-loading/summary-loading.component';\r\nimport { LoanSummaryComponent } from '../loan-summary/loan-summary.component';\r\nimport { AiSettingsModalComponent, AiSettingsData } from '../../shared/ai-settings-modal/ai-settings-modal.component';\r\n\r\ntype DialogView = 'selection' | 'loading' | 'summary';\r\ntype SortOption = 'category' | 'alphabetical' | 'selected';\r\ntype SummaryType = 'quick' | 'detailed';\r\n\r\n@Component({\r\n  selector: 'uc-ai-summary-dialog',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    FormsModule,\r\n    MatDialogModule,\r\n    MatButtonModule,\r\n    MatIconModule,\r\n    MatInputModule,\r\n    MatFormFieldModule,\r\n    MatSelectModule,\r\n    MatSliderModule,\r\n    MatTooltipModule,\r\n    MatSidenavModule,\r\n    ServiceCardComponent,\r\n    SummaryLoadingComponent,\r\n    LoanSummaryComponent,\r\n    AiSettingsModalComponent,\r\n  ],\r\n  templateUrl: './ai-summary-dialog.component.html',\r\n  styleUrl: './ai-summary-dialog.component.scss',\r\n  animations: [\r\n    trigger('heroAnimation', [\r\n      transition(':enter', [\r\n        style({ \r\n          opacity: 0, \r\n          transform: 'translateY(20px) scale(0.5)',\r\n        }),\r\n        animate('400ms cubic-bezier(0.34, 1.56, 0.64, 1)', keyframes([\r\n          style({ opacity: 0, transform: 'translateY(20px) scale(0.5)', offset: 0 }),\r\n          style({ opacity: 0.8, transform: 'translateY(-5px) scale(1.1)', offset: 0.6 }),\r\n          style({ opacity: 1, transform: 'translateY(0) scale(1)', offset: 1 }),\r\n        ]))\r\n      ]),\r\n      transition(':leave', [\r\n        animate('200ms ease-out', style({ \r\n          opacity: 0, \r\n          transform: 'translateY(10px) scale(0.8)' \r\n        }))\r\n      ])\r\n    ])\r\n  ]\r\n})\r\nexport class AiSummaryDialogComponent implements OnInit, OnDestroy {\r\n  @ViewChild('loanSummaryRef') loanSummaryRef!: LoanSummaryComponent;\r\n  @ViewChild('dialogContent') dialogContent!: ElementRef<HTMLElement>;\r\n  @ViewChild(AiSettingsModalComponent) aiSettingsModal!: AiSettingsModalComponent;\r\n\r\n  currentView: DialogView = 'selection';\r\n  services: SummaryService[] = [];\r\n  filteredServices: SummaryService[] = [];\r\n  searchQuery = '';\r\n  sortOption: SortOption = 'category';\r\n  summaryType: SummaryType = 'detailed';\r\n  showDecisionBadge = false;\r\n  isExporting = false;\r\n\r\n  // Settings Modal State\r\n  isSettingsModalOpen = false;\r\n  availableModels: string[] = [\r\n    'llama3.2:3b',\r\n    'mistral:7b',\r\n    'qwen3.5:latest',\r\n    'gemma4:latest',\r\n    'deepseek-r1:latest'\r\n  ];\r\n  selectedModel = 'gemma4:latest';\r\n  promptTemplate = '';\r\n  isEditingPrompt = false;\r\n  isSavingSettings = false;\r\n  showPromptHistory = true;\r\n  promptHistory: Array<{ template: string; timestamp: string; source: 'typed' | 'uploaded' }> = [];\r\n  readonly defaultPromptTemplate = `\r\nCredit underwriter summary for \r\n1. Detailed profile and GST report analysis\r\n2. ITC Utilization pattern\r\n3. Customer and supplier risk assessment\r\n4. Fraud & Compliance risk assessment\r\n5. Concentration Risk Assessment\r\n6. Financial Health indicators\r\n7. Underwriter Recommendation\r\n8. Final Recommendation\r\nNote: Don't include the document number in the response\r\n`;\r\n  private readonly settingsStorageKey = 'app.aiSettings.v1';\r\n  private readonly historyStorageKey = 'app.aiSettings.promptHistory';\r\n  \r\n  // Backup state for restoring on cancel/close\r\n  private backupSelectedModel = 'gemma4:latest';\r\n  private backupPromptTemplate = '';\r\n  \r\n  // RAG Configuration State\r\n  chunkSize = 1000;\r\n  chunkOverlap = 150;\r\n  topK = 15;\r\n  chunkOverlapOptions: number[] = [50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 600, 700, 800, 900, 1000];\r\n  \r\n  availableEmbeddingModels: string[] = ['embeddinggemma:300m', 'all-minilm'];\r\n  selectedEmbeddingModel = 'embeddinggemma:300m';\r\n  \r\n  availableSearchTypes: Array<{ value: string; label: string }> = [\r\n    { value: 'similarity', label: 'Similarity Search' },\r\n    { value: 'mmr', label: 'Max Marginal Relevance' },\r\n    { value: 'hybrid', label: 'Hybrid Search - Similarity + BM25' }\r\n  ];\r\n  selectedSearchType = 'hybrid';\r\n  \r\n  availableVectorStores: Array<{ value: string; label: string }> = [\r\n    { value: 'pgvector', label: 'PG Vector' },\r\n    { value: 'inmemory', label: 'InMemoryVector' },\r\n  ];\r\n  selectedVectorStore = 'pgvector';\r\n  \r\n  // Backup for RAG settings\r\n  private backupChunkSize = 1000;\r\n  private backupChunkOverlap = 150;\r\n  private backupTopK = 15;\r\n  private backupSelectedEmbeddingModel = 'embeddinggemma:300m';\r\n  private backupSelectedSearchType = 'hybrid';\r\n  private backupSelectedVectorStore = 'pgvector';\r\n  private backupSelectedGst = true;\r\n  private backupSelectedBureau = false;\r\n  private backupSelectedFinancial = false;\r\n  private backupGstPromptTemplate = '';\r\n  private backupBureauPromptTemplate = '';\r\n  private backupFinancialPromptTemplate = '';\r\n  \r\n  @ViewChild('promptFileInput') promptFileInput!: ElementRef<HTMLInputElement>;\r\n  @ViewChild('gstPromptFileInput') gstPromptFileInput!: ElementRef<HTMLInputElement>;\r\n  @ViewChild('bureauPromptFileInput') bureauPromptFileInput!: ElementRef<HTMLInputElement>;\r\n  @ViewChild('financialPromptFileInput') financialPromptFileInput!: ElementRef<HTMLInputElement>;\r\n  \r\n  // Document type selection: GST, Bureau, and/or Financial (checkboxes, at least one required)\r\n  selectedGst = true;\r\n  selectedBureau = false;\r\n  selectedFinancial = false;\r\n  \r\n  // Separate prompt templates for GST, Bureau, and Financial\r\n  gstPromptTemplate = '';\r\n  bureauPromptTemplate = '';\r\n  financialPromptTemplate = '';\r\n  \r\n  // Separate prompt history for GST, Bureau, and Financial\r\n  gstPromptHistory: Array<{ template: string; timestamp: string; source: 'typed' | 'uploaded' }> = [];\r\n  bureauPromptHistory: Array<{ template: string; timestamp: string; source: 'typed' | 'uploaded' }> = [];\r\n  financialPromptHistory: Array<{ template: string; timestamp: string; source: 'typed' | 'uploaded' }> = [];\r\n  showGstPromptHistory = false;\r\n  showBureauPromptHistory = false;\r\n  showFinancialPromptHistory = false;\r\n  private readonly gstHistoryStorageKey = 'app.aiSettings.gstPromptHistory';\r\n  private readonly bureauHistoryStorageKey = 'app.aiSettings.bureauPromptHistory';\r\n  private readonly financialHistoryStorageKey = 'app.aiSettings.financialPromptHistory';\r\n  \r\n  // Default prompt templates\r\n  readonly defaultGstPromptTemplate = `\r\nCredit underwriter summary for \r\n1. Detailed profile and GST report analysis\r\n2. ITC Utilization pattern\r\n3. Customer and supplier risk assessment\r\n4. Fraud & Compliance risk assessment\r\n5. Concentration Risk Assessment\r\n6. Financial Health indicators\r\n7. Underwriter Recommendation\r\n8. Final Recommendation\r\nNote: Don't include the document number in the response\r\n`;\r\n\r\n  readonly defaultBureauPromptTemplate = `Generate in detailed CIBIL summary along with the profile`;\r\n\r\n  readonly defaultFinancialPromptTemplate = `Generate a comprehensive Financial Statement analysis covering:\r\n1. Balance Sheet Analysis - Assets, Liabilities, and Equity breakdown\r\n2. Income Statement Review - Revenue, Expenses, and Profitability trends\r\n3. Cash Flow Analysis - Operating, Investing, and Financing activities\r\n4. Key Financial Ratios - Liquidity, Solvency, Profitability, and Efficiency ratios\r\n5. Working Capital Assessment\r\n6. Debt Analysis and Coverage Ratios\r\n7. Year-over-Year Comparison and Trends\r\n8. Financial Health Indicators and Risk Flags\r\n9. Recommendations for Credit Assessment\r\nNote: Focus on data-driven insights relevant for credit underwriting decisions.`;\r\n\r\n  loanSummary: LoanSummaryDetails | null = null;\r\n  goNoGoDecision: GoNoGoDecision | null = null;\r\n  selectedServices: SummaryService[] = [];\r\n  \r\n  // Cache for generated PDF\r\n  private cachedPdfBlob: Blob | null = null;\r\n  private cachedPdfFilename: string = '';\r\n  \r\n  // AI Response for GST detailed analysis\r\n  aiGeneratedResponse: string = '';\r\n  \r\n  // AI Response for Bureau detailed analysis\r\n  aiGeneratedBureauResponse: string = '';\r\n  \r\n  // AI Response for Financial Statement detailed analysis\r\n  aiGeneratedFinancialResponse: string = '';\r\n  \r\n  // AI Response for GO/NO-GO decision\r\n  aiGeneratedGoNoGoResponse: string = '';\r\n  \r\n  // Parsed decision and score from AI response\r\n  parsedDecision: 'GO' | 'NO-GO' | 'REVIEW' | null = null;\r\n  parsedScore: number | null = null;\r\n  \r\n  // Bureau data from package-test API\r\n  bureauData: BureauData | null = null;\r\n  \r\n  // Quick Summary data from multi-model inference API\r\n  quickSummary: QuickSummary | null = null;\r\n  gstQuickSummary: GstQuickSummary | null = null;\r\n  bureauQuickSummary: BureauQuickSummary | null = null;\r\n  financialQuickSummary: FinancialQuickSummary | null = null;\r\n  \r\n  // Toast notification state\r\n  showErrorToast = false;\r\n  errorToastMessage = '';\r\n  private errorToastTimeout: any = null;\r\n  \r\n  // Debouncing for scroll events to prevent flickering\r\n  private goNoGoScrollSubject = new Subject<boolean>();\r\n  private destroy$ = new Subject<void>();\r\n\r\n  // Document availability flags based on proposal.documents\r\n  hasGstDocument = false;\r\n  hasBureauDocument = false;\r\n  hasFinancialDocument = false;\r\n\r\n  constructor(\r\n    public dialogRef: MatDialogRef<AiSummaryDialogComponent>,\r\n    @Inject(MAT_DIALOG_DATA) public data: { proposal: Proposal },\r\n    private loanSummaryService: LoanSummaryService,\r\n    private http: HttpClient,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.loadServices();\r\n    this.loadAiSettingsFromCache();\r\n    this.initializeDocumentAvailability();\r\n    \r\n    // Debounce scroll state changes to prevent header flickering\r\n    this.goNoGoScrollSubject.pipe(\r\n      debounceTime(50),\r\n      distinctUntilChanged(),\r\n      takeUntil(this.destroy$)\r\n    ).subscribe((scrolledPast: boolean) => {\r\n      this.showDecisionBadge = scrolledPast;\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Initialize document availability based on proposal.documents array.\r\n   * Sets selection flags and availability flags for each document type.\r\n   */\r\n  private initializeDocumentAvailability(): void {\r\n    const documents = this.data.proposal?.documents || [];\r\n    \r\n    // Check for each document type (case-insensitive, partial match)\r\n    this.hasGstDocument = documents.some(doc => \r\n      doc.documentName?.toLowerCase().includes('gst')\r\n    );\r\n    this.hasBureauDocument = documents.some(doc => {\r\n      const name = doc.documentName?.toLowerCase() || '';\r\n      return name.includes('cibil') || name.includes('bureau');\r\n    });\r\n    this.hasFinancialDocument = documents.some(doc => {\r\n      const name = doc.documentName?.toLowerCase() || '';\r\n      return name.includes('fin') || name.includes('financial');\r\n    });\r\n    \r\n    // Set initial selections based on available documents\r\n    this.selectedGst = this.hasGstDocument;\r\n    this.selectedBureau = this.hasBureauDocument;\r\n    this.selectedFinancial = this.hasFinancialDocument;\r\n    \r\n    // Update backup values\r\n    this.backupSelectedGst = this.selectedGst;\r\n    this.backupSelectedBureau = this.selectedBureau;\r\n    this.backupSelectedFinancial = this.selectedFinancial;\r\n    \r\n    console.log('📄 [DOCUMENTS] Available documents:', {\r\n      gst: this.hasGstDocument,\r\n      bureau: this.hasBureauDocument,\r\n      financial: this.hasFinancialDocument,\r\n      proposalNo: this.data.proposal?.proposalNo\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Check if at least one document is available\r\n   */\r\n  hasAnyDocument(): boolean {\r\n    return this.hasGstDocument || this.hasBureauDocument || this.hasFinancialDocument;\r\n  }\r\n\r\n  /**\r\n   * Check if at least one document type is selected\r\n   */\r\n  hasAnySelection(): boolean {\r\n    return (this.selectedGst && this.hasGstDocument) || \r\n           (this.selectedBureau && this.hasBureauDocument) || \r\n           (this.selectedFinancial && this.hasFinancialDocument);\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n    this.goNoGoScrollSubject.complete();\r\n  }\r\n\r\n\r\n  loadServices(): void {\r\n    this.loanSummaryService.getAvailableServices().subscribe((services) => {\r\n      this.services = services;\r\n      // When summaryType is 'detailed', select all services by default\r\n      if (this.summaryType === 'detailed') {\r\n        this.services.forEach((s) => {\r\n          s.selected = true;\r\n        });\r\n      }\r\n      this.applyFilters();\r\n    });\r\n  }\r\n\r\n  applyFilters(): void {\r\n    let filtered = [...this.services];\r\n\r\n    // Apply search filter\r\n    if (this.searchQuery.trim()) {\r\n      const query = this.searchQuery.toLowerCase();\r\n      filtered = filtered.filter(\r\n        (s) =>\r\n          s.name.toLowerCase().includes(query) ||\r\n          s.description.toLowerCase().includes(query),\r\n      );\r\n    }\r\n\r\n    // Apply summary type filter\r\n    if (this.summaryType === 'quick') {\r\n      filtered = filtered.filter((s) => s.category === 'essential');\r\n    }\r\n\r\n    // Apply sort\r\n    switch (this.sortOption) {\r\n      case 'category':\r\n        filtered.sort((a, b) => {\r\n          if (a.category === b.category) return a.name.localeCompare(b.name);\r\n          return a.category === 'essential' ? -1 : 1;\r\n        });\r\n        break;\r\n      case 'alphabetical':\r\n        filtered.sort((a, b) => a.name.localeCompare(b.name));\r\n        break;\r\n      case 'selected':\r\n        filtered.sort((a, b) => {\r\n          if (a.selected === b.selected) return a.name.localeCompare(b.name);\r\n          return a.selected ? -1 : 1;\r\n        });\r\n        break;\r\n    }\r\n\r\n    this.filteredServices = filtered;\r\n  }\r\n\r\n  onSearchChange(): void {\r\n    this.applyFilters();\r\n  }\r\n\r\n  onSortChange(): void {\r\n    this.applyFilters();\r\n  }\r\n\r\n  onSummaryTypeChange(): void {\r\n    // Reset selections based on summary type\r\n    this.services.forEach((s) => {\r\n      if (this.summaryType === 'quick') {\r\n        s.selected = s.category === 'essential';\r\n      } else {\r\n        s.selected = true;\r\n      }\r\n    });\r\n    this.applyFilters();\r\n  }\r\n\r\n  toggleServiceSelection(service: SummaryService): void {\r\n    const found = this.services.find((s) => s.id === service.id);\r\n    if (found) {\r\n      found.selected = !found.selected;\r\n    }\r\n  }\r\n\r\n  getSelectedCount(): number {\r\n    return this.services.filter((s) => s.selected).length;\r\n  }\r\n\r\n  generateSummary(): void {\r\n    this.selectedServices = this.services.filter((s) => s.selected);\r\n    this.currentView = 'loading';\r\n    \r\n    // Clear previous AI responses\r\n    this.aiGeneratedResponse = '';\r\n    this.aiGeneratedBureauResponse = '';\r\n    this.aiGeneratedFinancialResponse = '';\r\n\r\n    // Sync RAG settings to the shared service before API call\r\n    this.loanSummaryService.chunk_size = this.chunkSize;\r\n    this.loanSummaryService.chunk_overlap = this.chunkOverlap;\r\n    this.loanSummaryService.top_k = this.topK;\r\n    this.loanSummaryService.embedding_model = this.selectedEmbeddingModel;\r\n    this.loanSummaryService.search_type = this.selectedSearchType;\r\n    this.loanSummaryService.storage_type = this.selectedVectorStore;\r\n\r\n    if (this.loanSummaryService.isAI) {\r\n      // Determine which documents are selected\r\n      if (this.isMultipleSelected()) {\r\n        // Multi-model inference - multiple document types selected\r\n        const prompts: { gst?: string; bureau?: string; financial?: string } = {};\r\n        \r\n        if (this.selectedGst) {\r\n          prompts.gst = this.gstPromptTemplate || this.defaultGstPromptTemplate;\r\n        }\r\n        if (this.selectedBureau) {\r\n          prompts.bureau = this.bureauPromptTemplate || this.defaultBureauPromptTemplate;\r\n        }\r\n        if (this.selectedFinancial) {\r\n          prompts.financial = this.financialPromptTemplate || this.defaultFinancialPromptTemplate;\r\n        }\r\n        \r\n        console.log('🔍 [PROPOSAL_NO] Sending proposalNo from dialog:', this.data.proposal.proposalNo);\r\n        console.log('🔍 [MULTI-MODEL] Document types selected:', Object.keys(prompts));\r\n        \r\n        // Call multi-model inference API (includes quick_summary in response)\r\n        this.loanSummaryService.callMultiModelInference(\r\n          prompts,\r\n          this.selectedModel,\r\n          this.data.proposal.proposalNo,\r\n          this.data.proposal.documents\r\n        ).subscribe({\r\n          next: (response) => {\r\n            console.log('Multi-model inference response received:', response);\r\n            \r\n            if (response.status === 'success') {\r\n              if (response.responses.gst?.status === 'success') {\r\n                this.aiGeneratedResponse = response.responses.gst.response;\r\n              }\r\n              if (response.responses.bureau?.status === 'success') {\r\n                this.aiGeneratedBureauResponse = response.responses.bureau.response;\r\n              }\r\n              if (response.responses.financial?.status === 'success') {\r\n                this.aiGeneratedFinancialResponse = response.responses.financial.response;\r\n              }\r\n              if (response.responses.go_nogo?.status === 'success') {\r\n                this.aiGeneratedGoNoGoResponse = response.responses.go_nogo.response;\r\n                this.parseDecisionFromGoNoGoResponse();\r\n                console.log('GO/NO-GO decision received:', response.responses.go_nogo.response.substring(0, 200));\r\n              }\r\n              \r\n              // Extract quick_summary data for overview cards\r\n              if (response.quick_summary) {\r\n                this.quickSummary = response.quick_summary;\r\n                this.gstQuickSummary = response.quick_summary.gst || null;\r\n                this.bureauQuickSummary = response.quick_summary.bureau || null;\r\n                this.financialQuickSummary = response.quick_summary.financial || null;\r\n                console.log('📊 [QUICK_SUMMARY] Extracted quick summary data:', {\r\n                  gst: this.gstQuickSummary,\r\n                  bureau: this.bureauQuickSummary,\r\n                  financial: this.financialQuickSummary\r\n                });\r\n              }\r\n            } else {\r\n              // Load fallback from local files\r\n              this.loadFallbackResponses();\r\n              return;\r\n            }\r\n            \r\n            // Now get loan summary data\r\n            this.loanSummaryService\r\n              .getLoanSummary(this.data.proposal.proposalNo)\r\n              .subscribe({\r\n                next: (summaryResponse) => {\r\n                  this.loanSummary = summaryResponse.loanSummaryDetails;\r\n                  this.goNoGoDecision = this.loanSummaryService.calculateGoNoGoDecision(\r\n                    this.loanSummary,\r\n                  );\r\n                  this.currentView = 'summary';\r\n                },\r\n                error: (error) => {\r\n                  console.error('Error getting loan summary:', error);\r\n                  this.currentView = 'selection';\r\n                },\r\n              });\r\n          },\r\n          error: (error) => {\r\n            console.error('Multi-model inference API error:', error);\r\n            this.showErrorToastNotification(this.extractErrorMessage(error));\r\n            this.loadFallbackResponses();\r\n          }\r\n        });\r\n      } else {\r\n        // Single document inference\r\n        const documentType = this.selectedGst ? 'gst' : (this.selectedBureau ? 'bureau' : 'financial');\r\n        const prompt = this.selectedGst \r\n          ? (this.gstPromptTemplate || this.defaultGstPromptTemplate)\r\n          : (this.selectedBureau \r\n              ? (this.bureauPromptTemplate || this.defaultBureauPromptTemplate)\r\n              : (this.financialPromptTemplate || this.defaultFinancialPromptTemplate));\r\n        \r\n        console.log('🔍 [PROPOSAL_NO] Sending proposalNo from dialog (single):', this.data.proposal.proposalNo);\r\n        \r\n        // Call single model inference API (includes quick_summary in response)\r\n        this.loanSummaryService.callSingleModelInference(\r\n          prompt, documentType, this.selectedModel, this.data.proposal.proposalNo, this.data.proposal.documents\r\n        ).subscribe({\r\n          next: (response) => {\r\n            console.log('Single model inference response received:', response);\r\n            \r\n            if (response.status === 'success') {\r\n              if (documentType === 'gst' && response.responses.gst?.status === 'success') {\r\n                this.aiGeneratedResponse = response.responses.gst.response;\r\n              } else if (documentType === 'bureau' && response.responses.bureau?.status === 'success') {\r\n                this.aiGeneratedBureauResponse = response.responses.bureau.response;\r\n              } else if (documentType === 'financial' && response.responses.financial?.status === 'success') {\r\n                this.aiGeneratedFinancialResponse = response.responses.financial.response;\r\n              }\r\n              \r\n              // Extract quick_summary data for overview cards\r\n              if (response.quick_summary) {\r\n                this.quickSummary = response.quick_summary;\r\n                if (documentType === 'gst') {\r\n                  this.gstQuickSummary = response.quick_summary.gst || null;\r\n                } else if (documentType === 'bureau') {\r\n                  this.bureauQuickSummary = response.quick_summary.bureau || null;\r\n                } else if (documentType === 'financial') {\r\n                  this.financialQuickSummary = response.quick_summary.financial || null;\r\n                }\r\n                console.log('📊 [QUICK_SUMMARY] Single model - Extracted quick summary:', response.quick_summary);\r\n              }\r\n            } else {\r\n              this.loadFallbackResponses();\r\n              return;\r\n            }\r\n            \r\n            // Now get loan summary data\r\n            this.loanSummaryService\r\n              .getLoanSummary(this.data.proposal.proposalNo)\r\n              .subscribe({\r\n                next: (summaryResponse) => {\r\n                  this.loanSummary = summaryResponse.loanSummaryDetails;\r\n                  this.goNoGoDecision = this.loanSummaryService.calculateGoNoGoDecision(\r\n                    this.loanSummary,\r\n                  );\r\n                  this.currentView = 'summary';\r\n                },\r\n                error: (error) => {\r\n                  console.error('Error getting loan summary:', error);\r\n                  this.currentView = 'selection';\r\n                },\r\n              });\r\n          },\r\n          error: (error) => {\r\n            console.error('Single model inference API error:', error);\r\n            this.showErrorToastNotification(this.extractErrorMessage(error));\r\n            this.loadFallbackResponses();\r\n          }\r\n        });\r\n      }\r\n    } else {\r\n      // Load from local MD files when isAI is false\r\n      console.log('isAI is false - Loading from local MD files');\r\n      this.loadFallbackResponses();\r\n    }\r\n  }\r\n  \r\n  private loadFallbackResponses(): void {\r\n    const loadGst = this.selectedGst;\r\n    const loadBureau = this.selectedBureau;\r\n    const loadFinancial = this.selectedFinancial;\r\n    \r\n    // Track loaded states\r\n    let pendingLoads = 0;\r\n    if (loadGst) pendingLoads++;\r\n    if (loadBureau) pendingLoads++;\r\n    if (loadFinancial) pendingLoads++;\r\n    \r\n    let completedLoads = 0;\r\n    \r\n    const checkComplete = () => {\r\n      completedLoads++;\r\n      if (completedLoads >= pendingLoads) {\r\n        loadLoanSummary();\r\n      }\r\n    };\r\n    \r\n    const loadLoanSummary = () => {\r\n      this.loanSummaryService\r\n        .getLoanSummary(this.data.proposal.proposalNo)\r\n        .subscribe({\r\n          next: (response) => {\r\n            this.loanSummary = response.loanSummaryDetails;\r\n            this.goNoGoDecision = this.loanSummaryService.calculateGoNoGoDecision(\r\n              this.loanSummary,\r\n            );\r\n            this.currentView = 'summary';\r\n          },\r\n          error: (error) => {\r\n            console.error('Error getting loan summary:', error);\r\n            this.currentView = 'selection';\r\n          },\r\n        });\r\n    };\r\n    \r\n    // If nothing selected, just load summary\r\n    if (pendingLoads === 0) {\r\n      loadLoanSummary();\r\n      return;\r\n    }\r\n    \r\n    // Use placeholder content instead of loading from assets\r\n    if (loadGst) {\r\n      this.aiGeneratedResponse = '## GST Analysis\\n\\nNo AI-generated GST analysis available. Please generate a summary first.';\r\n      checkComplete();\r\n    }\r\n    \r\n    if (loadBureau) {\r\n      this.aiGeneratedBureauResponse = '## Bureau Analysis\\n\\nNo AI-generated Bureau analysis available. Please generate a summary first.';\r\n      checkComplete();\r\n    }\r\n    \r\n    if (loadFinancial) {\r\n      this.aiGeneratedFinancialResponse = '## Financial Analysis\\n\\nNo AI-generated Financial analysis available. Please generate a summary first.';\r\n      checkComplete();\r\n    }\r\n  }\r\n\r\n  backToSelection(): void {\r\n    this.currentView = 'selection';\r\n    this.loanSummary = null;\r\n    this.goNoGoDecision = null;\r\n  }\r\n\r\n  onRegenerateSummary(): void {\r\n    // Trigger the same flow as generating a new summary\r\n    // Reset decision badge state\r\n    this.showDecisionBadge = false;\r\n    \r\n    // Clear cached PDF since settings changed\r\n    this.cachedPdfBlob = null;\r\n    this.cachedPdfFilename = '';\r\n    \r\n    // Clear previous AI responses\r\n    this.aiGeneratedResponse = '';\r\n    this.aiGeneratedBureauResponse = '';\r\n    this.aiGeneratedFinancialResponse = '';\r\n    \r\n    // Show loading and regenerate\r\n    this.currentView = 'loading';\r\n    \r\n    // Sync RAG settings to the shared service before API call\r\n    this.loanSummaryService.chunk_size = this.chunkSize;\r\n    this.loanSummaryService.chunk_overlap = this.chunkOverlap;\r\n    this.loanSummaryService.top_k = this.topK;\r\n    this.loanSummaryService.embedding_model = this.selectedEmbeddingModel;\r\n    this.loanSummaryService.search_type = this.selectedSearchType;\r\n    this.loanSummaryService.storage_type = this.selectedVectorStore;\r\n    \r\n    if (this.loanSummaryService.isAI) {\r\n      // Use the same multi/single model inference as generateSummary\r\n      if (this.isMultipleSelected()) {\r\n        // Multi-model inference - multiple document types selected\r\n        const prompts: { gst?: string; bureau?: string; financial?: string } = {};\r\n        \r\n        if (this.selectedGst) {\r\n          prompts.gst = this.gstPromptTemplate || this.defaultGstPromptTemplate;\r\n        }\r\n        if (this.selectedBureau) {\r\n          prompts.bureau = this.bureauPromptTemplate || this.defaultBureauPromptTemplate;\r\n        }\r\n        if (this.selectedFinancial) {\r\n          prompts.financial = this.financialPromptTemplate || this.defaultFinancialPromptTemplate;\r\n        }\r\n        \r\n        console.log('🔍 [PROPOSAL_NO] Regenerate - Sending proposalNo:', this.data.proposal.proposalNo);\r\n        \r\n        this.loanSummaryService.callMultiModelInference(\r\n          prompts,\r\n          this.selectedModel,\r\n          this.data.proposal.proposalNo,\r\n          this.data.proposal.documents\r\n        ).subscribe({\r\n          next: (response) => {\r\n            console.log('Regenerate - Multi-model inference response:', response);\r\n            \r\n            if (response.status === 'success') {\r\n              if (response.responses.gst?.status === 'success') {\r\n                this.aiGeneratedResponse = response.responses.gst.response;\r\n              }\r\n              if (response.responses.bureau?.status === 'success') {\r\n                this.aiGeneratedBureauResponse = response.responses.bureau.response;\r\n              }\r\n              if (response.responses.financial?.status === 'success') {\r\n                this.aiGeneratedFinancialResponse = response.responses.financial.response;\r\n              }\r\n              if (response.responses.go_nogo?.status === 'success') {\r\n                this.aiGeneratedGoNoGoResponse = response.responses.go_nogo.response;\r\n                this.parseDecisionFromGoNoGoResponse();\r\n              }\r\n              \r\n              // Extract quick_summary data for overview cards\r\n              if (response.quick_summary) {\r\n                this.quickSummary = response.quick_summary;\r\n                this.gstQuickSummary = response.quick_summary.gst || null;\r\n                this.bureauQuickSummary = response.quick_summary.bureau || null;\r\n                this.financialQuickSummary = response.quick_summary.financial || null;\r\n                console.log('📊 [QUICK_SUMMARY] Regenerate - Extracted quick summary data:', this.quickSummary);\r\n              }\r\n            } else {\r\n              this.loadFallbackResponses();\r\n              return;\r\n            }\r\n            \r\n            this.loanSummaryService\r\n              .getLoanSummary(this.data.proposal.proposalNo)\r\n              .subscribe({\r\n                next: (summaryResponse) => {\r\n                  this.loanSummary = summaryResponse.loanSummaryDetails;\r\n                  this.goNoGoDecision = this.loanSummaryService.calculateGoNoGoDecision(this.loanSummary);\r\n                  this.currentView = 'summary';\r\n                },\r\n                error: (error) => {\r\n                  console.error('Error regenerating summary:', error);\r\n                  this.currentView = 'summary';\r\n                },\r\n              });\r\n          },\r\n          error: (error) => {\r\n            console.error('AI Inference API error:', error);\r\n            this.showErrorToastNotification(this.extractErrorMessage(error));\r\n            \r\n            // Fallback to hardcoded content\r\n            console.error('Regenerate - Multi-model inference API error:', error);\r\n            this.loadFallbackResponses();\r\n          }\r\n        });\r\n      } else {\r\n        // Single document inference\r\n        const documentType = this.selectedGst ? 'gst' : (this.selectedBureau ? 'bureau' : 'financial');\r\n        const prompt = this.selectedGst \r\n          ? (this.gstPromptTemplate || this.defaultGstPromptTemplate)\r\n          : (this.selectedBureau \r\n              ? (this.bureauPromptTemplate || this.defaultBureauPromptTemplate)\r\n              : (this.financialPromptTemplate || this.defaultFinancialPromptTemplate));\r\n        \r\n        console.log('🔍 [PROPOSAL_NO] Regenerate single - Sending proposalNo:', this.data.proposal.proposalNo);\r\n        \r\n        this.loanSummaryService.callSingleModelInference(\r\n          prompt,\r\n          documentType,\r\n          this.selectedModel,\r\n          this.data.proposal.proposalNo,\r\n          this.data.proposal.documents\r\n        ).subscribe({\r\n          next: (response) => {\r\n            console.log('Regenerate - Single model inference response:', response);\r\n            \r\n            if (response.status === 'success') {\r\n              if (documentType === 'gst' && response.responses.gst?.status === 'success') {\r\n                this.aiGeneratedResponse = response.responses.gst.response;\r\n              } else if (documentType === 'bureau' && response.responses.bureau?.status === 'success') {\r\n                this.aiGeneratedBureauResponse = response.responses.bureau.response;\r\n              } else if (documentType === 'financial' && response.responses.financial?.status === 'success') {\r\n                this.aiGeneratedFinancialResponse = response.responses.financial.response;\r\n              }\r\n              \r\n              // Extract quick_summary data for overview cards\r\n              if (response.quick_summary) {\r\n                this.quickSummary = response.quick_summary;\r\n                if (documentType === 'gst') {\r\n                  this.gstQuickSummary = response.quick_summary.gst || null;\r\n                } else if (documentType === 'bureau') {\r\n                  this.bureauQuickSummary = response.quick_summary.bureau || null;\r\n                } else if (documentType === 'financial') {\r\n                  this.financialQuickSummary = response.quick_summary.financial || null;\r\n                }\r\n                console.log('📊 [QUICK_SUMMARY] Regenerate single - Extracted quick summary:', response.quick_summary);\r\n              }\r\n            } else {\r\n              this.loadFallbackResponses();\r\n              return;\r\n            }\r\n            \r\n            this.loanSummaryService\r\n              .getLoanSummary(this.data.proposal.proposalNo)\r\n              .subscribe({\r\n                next: (summaryResponse) => {\r\n                  this.loanSummary = summaryResponse.loanSummaryDetails;\r\n                  this.goNoGoDecision = this.loanSummaryService.calculateGoNoGoDecision(this.loanSummary);\r\n                  this.currentView = 'summary';\r\n                },\r\n                error: (error) => {\r\n                  console.error('Error regenerating summary:', error);\r\n                  this.currentView = 'summary';\r\n                },\r\n              });\r\n          },\r\n          error: (error) => {\r\n            console.error('Regenerate - Single model inference API error:', error);\r\n            this.showErrorToastNotification('AI service unavailable. Showing default analysis.');\r\n            this.loadFallbackResponses();\r\n          }\r\n        });\r\n      }\r\n    } else {\r\n      // When isAI is false, use placeholder content instead of loading from local file\r\n      console.log('isAI is false - Using placeholder content');\r\n      if (this.loanSummaryService.selectedDataType === 'gst') {\r\n        this.aiGeneratedResponse = '## GST Analysis\\n\\nNo AI-generated GST analysis available. Please enable AI mode and generate a summary.';\r\n      } else {\r\n        this.aiGeneratedBureauResponse = '## Bureau Analysis\\n\\nNo AI-generated Bureau analysis available. Please enable AI mode and generate a summary.';\r\n      }\r\n      \r\n      // Now get loan summary data\r\n      this.loanSummaryService\r\n        .getLoanSummary(this.data.proposal.proposalNo)\r\n        .subscribe({\r\n          next: (response) => {\r\n            this.loanSummary = response.loanSummaryDetails;\r\n            this.goNoGoDecision = this.loanSummaryService.calculateGoNoGoDecision(\r\n              this.loanSummary,\r\n            );\r\n            this.currentView = 'summary';\r\n          },\r\n          error: (error) => {\r\n            console.error('Error regenerating summary:', error);\r\n            this.currentView = 'summary';\r\n          },\r\n        });\r\n    }\r\n  }\r\n\r\n  closeDialog(): void {\r\n    this.dialogRef.close();\r\n  }\r\n\r\n  onExportReport(): void {\r\n    if (this.isExporting) return;\r\n    \r\n    // If we already have a cached PDF, use it\r\n    if (this.cachedPdfBlob && this.cachedPdfFilename) {\r\n      console.log('Using cached PDF');\r\n      this.openAndDownloadCachedPdf();\r\n      return;\r\n    }\r\n    \r\n    this.isExporting = true;\r\n    console.log('Generating new PDF for:', this.data.proposal.proposalNo);\r\n    \r\n    // Get the loan summary content element\r\n    const loanSummaryElement = this.loanSummaryRef?.elementRef?.nativeElement;\r\n    \r\n    if (!loanSummaryElement) {\r\n      console.error('Loan summary element not found');\r\n      this.isExporting = false;\r\n      alert('Unable to export. Please try again.');\r\n      return;\r\n    }\r\n\r\n    this.ensureDetailedAnalysisReady()\r\n      .then(() => this.generatePDF(loanSummaryElement))\r\n      .catch((error) => {\r\n        console.error('Error preparing data for PDF export:', error);\r\n        this.isExporting = false;\r\n        alert('Unable to export report. Please try again.');\r\n      });\r\n  }\r\n\r\n  private ensureDetailedAnalysisReady(): Promise<void> {\r\n    const requiresGst = !this.loanSummaryRef.gstDetailedMarkdown || this.loanSummaryRef.gstDetailedMarkdown.trim() === '';\r\n    const requiresBureau = !this.loanSummaryRef.bureauDetailedMarkdown || this.loanSummaryRef.bureauDetailedMarkdown.trim() === '';\r\n    const requiresFinancial = !this.loanSummaryRef.financialDetailedMarkdown || this.loanSummaryRef.financialDetailedMarkdown.trim() === '';\r\n\r\n    console.log('PDF Export - Checking detailed analysis ready:', {\r\n      gstReady: !requiresGst,\r\n      bureauReady: !requiresBureau,\r\n      financialReady: !requiresFinancial,\r\n      requiresGst,\r\n      requiresBureau,\r\n      requiresFinancial\r\n    });\r\n\r\n    if (requiresGst) {\r\n      console.log('Loading GST detailed analysis...');\r\n      this.loanSummaryRef.onGstViewModeChange('detailed');\r\n    }\r\n    if (requiresBureau) {\r\n      console.log('Loading Bureau detailed analysis...');\r\n      this.loanSummaryRef.onBureauViewModeChange('detailed');\r\n    }\r\n    if (requiresFinancial) {\r\n      console.log('Loading Financial detailed analysis...');\r\n      this.loanSummaryRef.onFinancialViewModeChange('detailed');\r\n    }\r\n\r\n    const startTime = Date.now();\r\n    return new Promise<void>((resolve) => {\r\n      const checkLoaded = () => {\r\n        const gstReady = !requiresGst || (!!this.loanSummaryRef.gstDetailedMarkdown && this.loanSummaryRef.gstDetailedMarkdown.trim() !== '');\r\n        const bureauReady = !requiresBureau || (!!this.loanSummaryRef.bureauDetailedMarkdown && this.loanSummaryRef.bureauDetailedMarkdown.trim() !== '');\r\n        const financialReady = !requiresFinancial || (!!this.loanSummaryRef.financialDetailedMarkdown && this.loanSummaryRef.financialDetailedMarkdown.trim() !== '');\r\n\r\n        console.log('PDF Export - Checking load status:', {\r\n          gstReady,\r\n          bureauReady,\r\n          financialReady,\r\n          elapsed: Date.now() - startTime\r\n        });\r\n\r\n        if (gstReady && bureauReady && financialReady) {\r\n          console.log('All detailed analyses ready for PDF export');\r\n          resolve();\r\n          return;\r\n        }\r\n\r\n        if (Date.now() - startTime > 10000) {\r\n          console.warn('PDF Export timeout - proceeding with available data');\r\n          resolve();\r\n          return;\r\n        }\r\n\r\n        setTimeout(checkLoaded, 150);\r\n      };\r\n      checkLoaded();\r\n    });\r\n  }\r\n\r\n  private openAndDownloadCachedPdf(): void {\r\n    if (!this.cachedPdfBlob || !this.cachedPdfFilename) return;\r\n    \r\n    // Create a blob URL\r\n    const blobUrl = URL.createObjectURL(this.cachedPdfBlob);\r\n    \r\n    // Open PDF in a new tab\r\n    window.open(blobUrl, '_blank');\r\n    \r\n    // Also trigger download\r\n    const link = document.createElement('a');\r\n    link.href = blobUrl;\r\n    link.download = this.cachedPdfFilename;\r\n    link.click();\r\n    \r\n    // Clean up\r\n    setTimeout(() => URL.revokeObjectURL(blobUrl), 100);\r\n  }\r\n\r\n  /**\r\n   * Chart.js draws onto <canvas> elements, but cloneNode(true) only copies the\r\n   * element/attributes - not the painted bitmap. Snapshot each live canvas via\r\n   * toDataURL() and replace the corresponding cloned canvas with an <img> so\r\n   * charts actually show up in the exported PDF instead of empty boxes.\r\n   */\r\n  private replaceCanvasesWithImages(liveElement: HTMLElement, clonedElement: HTMLElement): void {\r\n    const liveCanvases = Array.from(liveElement.querySelectorAll('canvas'));\r\n    const clonedCanvases = Array.from(clonedElement.querySelectorAll('canvas'));\r\n\r\n    liveCanvases.forEach((liveCanvas, index) => {\r\n      const clonedCanvas = clonedCanvases[index];\r\n      if (!clonedCanvas) return;\r\n\r\n      try {\r\n        const dataUrl = liveCanvas.toDataURL('image/png');\r\n        const img = document.createElement('img');\r\n        img.src = dataUrl;\r\n        img.style.width = '100%';\r\n        img.style.height = `${liveCanvas.clientHeight || liveCanvas.height}px`;\r\n        img.style.display = 'block';\r\n        clonedCanvas.replaceWith(img);\r\n      } catch (error) {\r\n        console.warn('PDF Export - failed to snapshot chart canvas', error);\r\n      }\r\n    });\r\n  }\r\n\r\n  private generatePDF(loanSummaryElement: HTMLElement): void {\r\n    // Store current section view modes to restore later\r\n    const originalGstViewMode = this.loanSummaryRef.gstViewMode;\r\n    const originalBureauViewMode = this.loanSummaryRef.bureauViewMode;\r\n    const originalFinancialViewMode = this.loanSummaryRef.financialViewMode;\r\n    \r\n    // Temporarily switch to overview mode for all sections to ensure clean exported layout\r\n    this.loanSummaryRef.gstViewMode = 'overview';\r\n    this.loanSummaryRef.bureauViewMode = 'overview';\r\n    this.loanSummaryRef.financialViewMode = 'overview';\r\n    \r\n    // Force change detection and wait for DOM update\r\n    setTimeout(() => {\r\n      // Clone the element after overview is rendered\r\n      const clonedElement = loanSummaryElement.cloneNode(true) as HTMLElement;\r\n\r\n      // cloneNode() copies <canvas> tags but not the bitmap Chart.js painted onto\r\n      // them, so every chart would render as an empty box in the PDF. Snapshot\r\n      // each live canvas to a data URL and swap the matching cloned canvas for\r\n      // a plain <img> before handing the clone to html2pdf.\r\n      this.replaceCanvasesWithImages(loanSummaryElement, clonedElement);\r\n\r\n      // Restore original view modes\r\n      this.loanSummaryRef.gstViewMode = originalGstViewMode;\r\n      this.loanSummaryRef.bureauViewMode = originalBureauViewMode;\r\n      this.loanSummaryRef.financialViewMode = originalFinancialViewMode;\r\n\r\n      // Remove floating indicators and non-printable elements\r\n      const elementsToRemove = clonedElement.querySelectorAll('.section-indicator, .view-toggle, .nav-btn, .carousel-indicators, .gst-view-toggle, .gst-more-details, .table-pagination');\r\n      elementsToRemove.forEach(el => el.remove());\r\n      \r\n      // Replace Monthly Returns table with full data\r\n      this.replaceMonthlyReturnsTableForPDF(clonedElement);\r\n      \r\n      // Replace Filing History table with full data\r\n      this.replaceFilingHistoryTableForPDF(clonedElement);\r\n      \r\n      // Handle GST Summary section - add Detailed Analysis after Overview\r\n      const gstSummaryCard = clonedElement.querySelector('.gst-summary-card');\r\n      if (gstSummaryCard) {\r\n        const gstContent = gstSummaryCard.querySelector('mat-card-content');\r\n        if (gstContent) {\r\n          const gstDetailedMarkdown = this.loanSummaryRef.gstDetailedMarkdown;\r\n          console.log('PDF Export - GST detailed markdown:', gstDetailedMarkdown ? 'PRESENT' : 'MISSING');\r\n          const gstDetailedView = gstContent.querySelector('.gst-detailed-view');\r\n          if (gstDetailedView) {\r\n            gstDetailedView.remove();\r\n          }\r\n          if (gstDetailedMarkdown && gstDetailedMarkdown.trim() !== '') {\r\n            const detailedSection = document.createElement('div');\r\n            detailedSection.className = 'gst-detailed-analysis-pdf';\r\n            detailedSection.innerHTML = `\r\n              <div style=\"margin-top: 12px; padding-top: 10px; border-top: 2px solid #1e3a5f;\">\r\n                <div style=\"display: flex; align-items: center; gap: 6px; margin-bottom: 8px; background: #f0f9ff; padding: 6px 10px; border-radius: 6px;\">\r\n                  <span style=\"font-size: 13px; font-weight: 600; color: #1e3a5f;\">📊 Detailed GST Analysis Report</span>\r\n                </div>\r\n                <div class=\"markdown-pdf-content\" style=\"line-height: 1.35; color: #374151; font-size: 10px;\">\r\n                  ${this.convertMarkdownToHtml(gstDetailedMarkdown)}\r\n                </div>\r\n              </div>\r\n            `;\r\n            gstContent.appendChild(detailedSection);\r\n            console.log('PDF Export - GST detailed section ADDED to PDF');\r\n          }\r\n        }\r\n      }\r\n\r\n      // Handle Bureau Summary section - add Detailed Analysis after Overview\r\n      const bureauSummaryCard = clonedElement.querySelector('.credit-bureau-card');\r\n      const bureauDetailedMarkdown = this.loanSummaryRef.bureauDetailedMarkdown;\r\n      console.log('PDF Export - Bureau detailed markdown:', bureauDetailedMarkdown ? 'PRESENT' : 'MISSING');\r\n      if (bureauSummaryCard) {\r\n        const bureauContent = bureauSummaryCard.querySelector('mat-card-content') || bureauSummaryCard;\r\n        const bureauDetailedView = bureauContent.querySelector('.bureau-detailed-view');\r\n        if (bureauDetailedView) {\r\n          bureauDetailedView.remove();\r\n        }\r\n        if (!bureauContent) {\r\n          console.warn('PDF Export - bureau content container missing, appending to card directly');\r\n        }\r\n        if (bureauDetailedMarkdown && bureauDetailedMarkdown.trim() !== '') {\r\n          const detailedSection = document.createElement('div');\r\n          detailedSection.className = 'bureau-detailed-analysis-pdf';\r\n          detailedSection.innerHTML = `\r\n            <div style=\"margin-top: 12px; padding-top: 10px; border-top: 2px solid #1e3a5f;\">\r\n              <div style=\"display: flex; align-items: center; gap: 6px; margin-bottom: 8px; background: #f0f9ff; padding: 6px 10px; border-radius: 6px;\">\r\n                <span style=\"font-size: 13px; font-weight: 600; color: #1e3a5f;\">📊 Detailed Bureau Analysis Report</span>\r\n              </div>\r\n              <div class=\"markdown-pdf-content\" style=\"line-height: 1.35; color: #374151; font-size: 10px;\">\r\n                ${this.convertMarkdownToHtml(bureauDetailedMarkdown)}\r\n              </div>\r\n            </div>\r\n          `;\r\n          bureauContent.appendChild(detailedSection);\r\n          console.log('PDF Export - Bureau detailed section ADDED to PDF');\r\n        }\r\n      } else if (bureauDetailedMarkdown && bureauDetailedMarkdown.trim() !== '') {\r\n        console.log('PDF Export - Bureau section not in DOM, appending standalone section');\r\n        const standaloneBureau = this.createStandalonePdfSection(\r\n          'Credit Bureau Overview',\r\n          this.buildBureauOverviewHtml(),\r\n          bureauDetailedMarkdown,\r\n        );\r\n        clonedElement.appendChild(standaloneBureau);\r\n      }\r\n\r\n      // Handle Financial Summary section - add Detailed Analysis after Overview\r\n      const financialSummaryCard = clonedElement.querySelector('.financial-summary-card');\r\n      const financialDetailedMarkdown = this.loanSummaryRef.financialDetailedMarkdown;\r\n      console.log('PDF Export - Financial detailed markdown:', financialDetailedMarkdown ? 'PRESENT' : 'MISSING');\r\n\r\n      if (financialSummaryCard) {\r\n        const financialContent = financialSummaryCard.querySelector('mat-card-content') || financialSummaryCard;\r\n        const financialDetailedView = financialContent.querySelector('.markdown-wrapper');\r\n        if (financialDetailedView && this.loanSummaryRef.financialViewMode === 'overview') {\r\n          financialDetailedView.remove();\r\n        }\r\n        if (!financialContent) {\r\n          console.warn('PDF Export - financial content container missing, appending to card directly');\r\n        }\r\n        if (financialDetailedMarkdown && financialDetailedMarkdown.trim() !== '') {\r\n          const detailedSection = document.createElement('div');\r\n          detailedSection.className = 'financial-detailed-analysis-pdf';\r\n          detailedSection.innerHTML = `\r\n            <div style=\"margin-top: 12px; padding-top: 10px; border-top: 2px solid #1e3a5f;\">\r\n              <div style=\"display: flex; align-items: center; gap: 6px; margin-bottom: 8px; background: #f0f9ff; padding: 6px 10px; border-radius: 6px;\">\r\n                <span style=\"font-size: 13px; font-weight: 600; color: #1e3a5f;\">📊 Detailed Financial Analysis Report</span>\r\n              </div>\r\n              <div class=\"markdown-pdf-content\" style=\"line-height: 1.35; color: #374151; font-size: 10px;\">\r\n                ${this.convertMarkdownToHtml(financialDetailedMarkdown)}\r\n              </div>\r\n            </div>\r\n          `;\r\n          financialContent.appendChild(detailedSection);\r\n          console.log('PDF Export - Financial detailed section ADDED to PDF');\r\n        }\r\n      } else if (financialDetailedMarkdown && financialDetailedMarkdown.trim() !== '') {\r\n        console.log('PDF Export - Financial section not in DOM, appending standalone section');\r\n        const standaloneFinancial = this.createStandalonePdfSection(\r\n          'Balance Sheet / Financial Statement Overview',\r\n          this.buildFinancialOverviewHtml(),\r\n          financialDetailedMarkdown,\r\n        );\r\n        clonedElement.appendChild(standaloneFinancial);\r\n      }\r\n      \r\n      this.renderPDF(clonedElement);\r\n    }, 100);\r\n  }\r\n\r\n  // Replace Monthly Returns table with full data for PDF\r\n  private replaceMonthlyReturnsTableForPDF(clonedElement: HTMLElement): void {\r\n    const monthlyReturnsTable = clonedElement.querySelector('.monthly-returns-table tbody');\r\n    if (monthlyReturnsTable) {\r\n      const fullData = this.loanSummaryRef.getCombinedMonthlyReturnsData();\r\n      const formatLakhs = (value: number) => {\r\n        if (value >= 100) {\r\n          return '₹' + (value / 100).toFixed(2) + ' Cr';\r\n        }\r\n        return '₹' + value.toFixed(2) + ' L';\r\n      };\r\n      \r\n      // Clear existing rows and add all data\r\n      monthlyReturnsTable.innerHTML = fullData.map(item => `\r\n        <tr>\r\n          <td class=\"align-left month-bold\" style=\"font-weight: 600;\">${item.month}</td>\r\n          <td class=\"align-right\">${formatLakhs(item.turnover)}</td>\r\n          <td class=\"align-right\">${formatLakhs(item.totalSales)}</td>\r\n          <td class=\"align-right\">${formatLakhs(item.totalPurchases)}</td>\r\n          <td class=\"align-right\">${formatLakhs(item.totalTaxPaid)}</td>\r\n        </tr>\r\n      `).join('');\r\n    }\r\n  }\r\n\r\n  // Replace Filing History table with full data for PDF\r\n  private replaceFilingHistoryTableForPDF(clonedElement: HTMLElement): void {\r\n    const filingHistoryTable = clonedElement.querySelector('.filing-history-table tbody');\r\n    if (filingHistoryTable) {\r\n      const fullData = this.loanSummaryRef.getCombinedFilingHistoryData();\r\n      \r\n      const getStatusClass = (status: string) => {\r\n        switch (status) {\r\n          case 'Filed': return 'background: #dcfce7; color: #166534;';\r\n          case 'Pending': return 'background: #fef3c7; color: #92400e;';\r\n          case 'Delayed': return 'background: #fee2e2; color: #991b1b;';\r\n          default: return '';\r\n        }\r\n      };\r\n      \r\n      const formatDate = (dateStr: string) => {\r\n        const date = new Date(dateStr);\r\n        const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\r\n        return `${date.getDate().toString().padStart(2, '0')}-${months[date.getMonth()]}-${date.getFullYear()}`;\r\n      };\r\n      \r\n      // Clear existing rows and add all data\r\n      filingHistoryTable.innerHTML = fullData.map(item => `\r\n        <tr>\r\n          <td class=\"align-left period-bold\" style=\"font-weight: 600;\">${item.period}</td>\r\n          <td class=\"align-left\">${item.returnType}</td>\r\n          <td class=\"align-left\">${formatDate(item.filedDate)}</td>\r\n          <td class=\"align-left\">\r\n            <span style=\"padding: 2px 8px; border-radius: 4px; font-size: 10px; font-weight: 500; ${getStatusClass(item.status)}\">\r\n              ${item.status}\r\n            </span>\r\n          </td>\r\n        </tr>\r\n      `).join('');\r\n    }\r\n  }\r\n\r\n  private renderPDF(clonedElement: HTMLElement): void {    // Create a wrapper with proper styling for PDF\r\n    const wrapper = document.createElement('div');\r\n    wrapper.style.cssText = `\r\n      width: 210mm;\r\n      padding: 12mm;\r\n      background: white;\r\n      font-family: 'Roboto', Arial, sans-serif;\r\n    `;\r\n    \r\n    // Add header to PDF\r\n    const header = document.createElement('div');\r\n    header.innerHTML = `\r\n      <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; padding-bottom: 12px; border-bottom: 2px solid #1e3a5f;\">\r\n        <div>\r\n          <h1 style=\"margin: 0; font-size: 22px; color: #1e3a5f;\">Credit Underwriting Report</h1>\r\n          <p style=\"margin: 4px 0 0 0; font-size: 13px; color: #64748b;\">Application ID: ${this.data.proposal.proposalNo}</p>\r\n          <p style=\"margin: 2px 0 0 0; font-size: 13px; color: #64748b;\">${this.loanSummary?.borrowerInformation?.name || this.data.proposal.borrowerName}</p>\r\n        </div>\r\n        <div style=\"text-align: right;\">\r\n          <p style=\"margin: 0; font-size: 11px; color: #64748b;\">Generated on</p>\r\n          <p style=\"margin: 2px 0 0 0; font-size: 13px; font-weight: 600; color: #1e3a5f;\">${new Date().toLocaleDateString('en-IN', { day: '2-digit', month: 'short', year: 'numeric', hour: '2-digit', minute: '2-digit' })}</p>\r\n        </div>\r\n      </div>\r\n    `;\r\n    wrapper.appendChild(header);\r\n    \r\n    // Style adjustments for PDF output - reduced spacing\r\n    const styleOverrides = document.createElement('style');\r\n    styleOverrides.textContent = `\r\n      * { box-sizing: border-box; margin: 0; }\r\n      .loan-summary-container { height: auto !important; overflow: visible !important; padding: 0 !important; }\r\n      .list-container { overflow: visible !important; height: auto !important; padding: 0 !important; gap: 0 !important; }\r\n      .list-item { margin: 0 !important; padding: 0 !important; }\r\n      .document-links-sticky { display: none !important; }\r\n      .summary-card { \r\n        break-inside: avoid; \r\n        page-break-inside: avoid; \r\n        margin: 0 0 12px 0 !important; \r\n        padding: 0 !important;\r\n        box-shadow: none !important; \r\n        border: 1px solid #e5e7eb !important; \r\n        border-radius: 8px !important;\r\n      }\r\n      mat-card-header { \r\n        background: #f8fafc !important; \r\n        padding: 10px 14px !important; \r\n        margin: 0 !important;\r\n        border-bottom: 1px solid #e5e7eb !important; \r\n        border-radius: 8px 8px 0 0 !important;\r\n      }\r\n      mat-card-header mat-card-title { font-size: 14px !important; margin: 0 !important; }\r\n      mat-card-content { padding: 12px 14px !important; margin: 0 !important; }\r\n      .carousel-container, .carousel-content, .carousel-track, .carousel-slide { \r\n        display: block !important; \r\n        transform: none !important; \r\n        width: 100% !important; \r\n        min-width: 100% !important; \r\n        padding: 0 !important;\r\n        margin: 0 !important;\r\n      }\r\n      .decision-card { border-left: 4px solid #16a34a !important; }\r\n      .decision-display { padding: 12px !important; margin-bottom: 10px !important; }\r\n      \r\n      /* PDF: Vertical layout for decision content */\r\n      .decision-content-split { \r\n        display: block !important; \r\n        grid-template-columns: 1fr !important; \r\n      }\r\n      .status-badges-section { \r\n        margin-bottom: 12px !important; \r\n      }\r\n      .analysis-text-section {\r\n        margin-top: 0 !important;\r\n        border-left: none !important;\r\n        border-top: 3px solid #1e3a5f !important;\r\n        padding-top: 12px !important;\r\n      }\r\n      \r\n      .info-grid { display: grid !important; grid-template-columns: repeat(2, 1fr) !important; gap: 8px !important; }\r\n      .info-item { padding: 6px 0 !important; margin: 0 !important; }\r\n      .factors-grid { display: grid !important; grid-template-columns: repeat(2, 1fr) !important; gap: 8px !important; margin-top: 10px !important; }\r\n      .risk-factors-grid, .metrics-grid { display: grid !important; grid-template-columns: repeat(2, 1fr) !important; gap: 10px !important; }\r\n      .gst-kpi-cards, .credit-kpi-cards { display: grid !important; grid-template-columns: repeat(3, 1fr) !important; gap: 10px !important; }\r\n      .gst-kpi-card, .credit-kpi-card { padding: 10px !important; }\r\n      table { width: 100% !important; border-collapse: collapse !important; font-size: 10px !important; margin: 8px 0 !important; }\r\n      th, td { padding: 6px 8px !important; border: 1px solid #e5e7eb !important; }\r\n      th { background: #f8fafc !important; font-weight: 600 !important; }\r\n      /* Chart canvases are snapshotted to <img> before capture - just keep them from overflowing their card */\r\n      .uc-bar-chart-wrapper, .uc-line-chart-wrapper, .uc-pie-chart-wrapper { max-width: 100% !important; overflow: hidden !important; }\r\n      .uc-bar-chart-wrapper img, .uc-line-chart-wrapper img, .uc-pie-chart-wrapper img { max-width: 100% !important; height: auto !important; }\r\n      .enquiries-chart-wrapper, .loan-type-chart-wrapper, .monthly-returns-chart-wrapper { padding: 8px !important; margin-bottom: 10px !important; }\r\n      .chart-subheader { font-size: 11px !important; margin-bottom: 8px !important; }\r\n\r\n      /* Balance sheet's two-column layout (KPIs/ratios + pie chart) was overflowing the page width */\r\n      .balance-sheet-layout { display: grid !important; grid-template-columns: 2fr 1fr !important; gap: 10px !important; width: 100% !important; }\r\n      .bs-right { padding: 8px !important; min-width: 0 !important; }\r\n      .bs-left { min-width: 0 !important; }\r\n      .director-card { border: 1px solid #e5e7eb !important; border-radius: 6px !important; padding: 10px !important; margin-bottom: 8px !important; }\r\n      .director-cards-container { gap: 8px !important; }\r\n      .risk-summary-section { border-radius: 10px !important; padding: 12px !important; margin-bottom: 12px !important; }\r\n      .risk-factor-card, .metric-card { padding: 10px !important; }\r\n      .recommendation-section { padding: 10px 14px !important; margin-bottom: 12px !important; }\r\n      .section-header { margin-bottom: 10px !important; padding-bottom: 8px !important; }\r\n      .section-header h4 { font-size: 13px !important; margin: 0 !important; }\r\n      .gst-header-section { padding-bottom: 12px !important; margin-bottom: 12px !important; }\r\n      .gst-turnover-trend, .gst-monthly-returns, .gst-filing-history { margin-bottom: 12px !important; }\r\n      .trend-chart-container { padding: 10px !important; }\r\n      .credit-score-header { padding: 14px !important; margin-bottom: 12px !important; }\r\n      .credit-section { margin-bottom: 12px !important; }\r\n      .payment-history-metrics, .enquiries-metrics { gap: 10px !important; }\r\n      .assessment-grid { gap: 10px !important; }\r\n      .assessment-card { padding: 12px !important; }\r\n      .balance-sheet-grid { gap: 10px !important; margin-bottom: 12px !important; }\r\n      .bs-card { padding: 12px !important; }\r\n      .ratios-section { margin-top: 10px !important; }\r\n      .risk-grid { gap: 10px !important; }\r\n      .risk-card { padding: 12px !important; }\r\n      .corpository-section { margin-top: 12px !important; padding-top: 12px !important; }\r\n      .ews-display { padding: 14px !important; }\r\n      \r\n      /* Markdown PDF styles - Compact spacing */\r\n      .markdown-pdf-content { line-height: 1.4 !important; }\r\n      .markdown-pdf-content h1 { font-size: 15px !important; margin: 10px 0 6px 0 !important; color: #1f2937 !important; border-bottom: 1px solid #e5e7eb !important; padding-bottom: 4px !important; }\r\n      .markdown-pdf-content h2 { font-size: 13px !important; margin: 8px 0 4px 0 !important; color: #374151 !important; }\r\n      .markdown-pdf-content h3 { font-size: 12px !important; margin: 6px 0 3px 0 !important; color: #4b5563 !important; }\r\n      .markdown-pdf-content h4 { font-size: 11px !important; margin: 5px 0 2px 0 !important; color: #4b5563 !important; }\r\n      .markdown-pdf-content p { margin: 3px 0 !important; font-size: 10px !important; line-height: 1.35 !important; }\r\n      .markdown-pdf-content ul, .markdown-pdf-content ol { margin: 2px 0 !important; padding-left: 16px !important; font-size: 10px !important; }\r\n      .markdown-pdf-content li { margin: 1px 0 !important; line-height: 1.3 !important; }\r\n      .markdown-pdf-content table { margin: 6px 0 !important; font-size: 9px !important; }\r\n      .markdown-pdf-content hr { margin: 6px 0 !important; border: none !important; border-top: 1px solid #e5e7eb !important; }\r\n      .markdown-pdf-content strong { font-weight: 600 !important; }\r\n      .markdown-pdf-content blockquote { border-left: 2px solid #3b82f6 !important; padding-left: 8px !important; margin: 4px 0 !important; color: #6b7280 !important; font-style: italic !important; font-size: 10px !important; }\r\n      .markdown-pdf-content br { display: block !important; content: \"\" !important; margin: 1px 0 !important; }\r\n      .gst-detailed-analysis-pdf { margin-top: 12px !important; }\r\n      \r\n      @media print { \r\n        body { -webkit-print-color-adjust: exact !important; print-color-adjust: exact !important; } \r\n        .summary-card { break-inside: avoid !important; }\r\n      }\r\n    `;\r\n    wrapper.appendChild(styleOverrides);\r\n    \r\n    // Append cloned content\r\n    wrapper.appendChild(clonedElement);\r\n    \r\n    // Temporarily append to body for rendering\r\n    document.body.appendChild(wrapper);\r\n    \r\n    // Configure html2pdf options\r\n    const options = {\r\n      margin: [8, 8, 8, 8] as [number, number, number, number],\r\n      filename: `Credit_Underwriting_Report_${this.data.proposal.proposalNo}_${new Date().toISOString().split('T')[0]}.pdf`,\r\n      image: { type: 'jpeg' as const, quality: 0.95 },\r\n      html2canvas: {\r\n        scale: 1.5,\r\n        useCORS: true,\r\n        logging: false,\r\n        letterRendering: true,\r\n        allowTaint: true,\r\n        scrollX: 0,\r\n        scrollY: 0\r\n      },\r\n      jsPDF: { \r\n        unit: 'mm', \r\n        format: 'a4', \r\n        orientation: 'portrait' as const,\r\n        compress: true\r\n      },\r\n      pagebreak: { mode: ['avoid-all', 'css', 'legacy'] }\r\n    };\r\n    \r\n    // Generate PDF and open in new tab.\r\n    // Note: profiling showed html2canvas's rasterization pass (toCanvas) is the\r\n    // dominant cost for a report this size (tens of seconds) - scale/quality\r\n    // tuning barely moves it, since the bottleneck is walking/rendering the\r\n    // large cloned DOM tree, not output resolution. A real fix would mean\r\n    // moving off html2canvas (e.g. native browser print-to-PDF).\r\n    html2pdf()\r\n      .set(options)\r\n      .from(wrapper)\r\n      .outputPdf('blob')\r\n      .then((pdfBlob: Blob) => {\r\n        // Cache the PDF blob and filename for future use\r\n        this.cachedPdfBlob = pdfBlob;\r\n        this.cachedPdfFilename = options.filename;\r\n        \r\n        // Create a blob URL\r\n        const blobUrl = URL.createObjectURL(pdfBlob);\r\n        \r\n        // Open PDF in a new tab\r\n        window.open(blobUrl, '_blank');\r\n        \r\n        // Also trigger download\r\n        const link = document.createElement('a');\r\n        link.href = blobUrl;\r\n        link.download = options.filename;\r\n        link.click();\r\n        \r\n        // Clean up\r\n        setTimeout(() => URL.revokeObjectURL(blobUrl), 100);\r\n        document.body.removeChild(wrapper);\r\n        this.isExporting = false;\r\n        \r\n        console.log('PDF exported, cached, and opened in new tab successfully');\r\n      })\r\n      .catch((error: Error) => {\r\n        console.error('Error exporting PDF:', error);\r\n        document.body.removeChild(wrapper);\r\n        this.isExporting = false;\r\n        alert('Error exporting PDF. Please try again.');\r\n      });\r\n  }\r\n\r\n  private createStandalonePdfSection(title: string, overviewHtml: string, markdown: string): HTMLElement {\r\n    const section = document.createElement('div');\r\n    section.className = 'summary-card';\r\n    section.style.cssText = 'margin-top: 14px; padding: 14px; border: 1px solid #e5e7eb; border-radius: 10px; background: #ffffff;';\r\n    section.innerHTML = `\r\n      <div style=\"margin-bottom: 12px;\">\r\n        <h2 style=\"margin: 0; font-size: 16px; color: #1f2937;\">${title}</h2>\r\n      </div>\r\n      <div style=\"margin-bottom: 12px; color: #334155; font-size: 11px; line-height: 1.5;\">${overviewHtml}</div>\r\n      <div class=\"markdown-pdf-content\" style=\"line-height: 1.35; color: #374151; font-size: 10px;\">\r\n        ${this.convertMarkdownToHtml(markdown)}\r\n      </div>\r\n    `;\r\n    return section;\r\n  }\r\n\r\n  private buildBureauOverviewHtml(): string {\r\n    const bureau = this.loanSummaryRef.bureauQuickSummary;\r\n    if (!bureau) {\r\n      return '<p style=\"margin: 0;\">No bureau overview data available.</p>';\r\n    }\r\n\r\n    return `\r\n      <div style=\"display:grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px;\">\r\n        <div style=\"padding: 10px; border: 1px solid #e2e8f0; border-radius: 8px; background: #f8fafc;\">\r\n          <strong>CIBIL Score</strong>\r\n          <div style=\"margin-top: 6px; font-size: 14px; font-weight: 600;\">${bureau.cibil_score}</div>\r\n          <div style=\"font-size: 10px; color: #475569;\">${bureau.cibil_remarks}</div>\r\n        </div>\r\n        <div style=\"padding: 10px; border: 1px solid #e2e8f0; border-radius: 8px; background: #f8fafc;\">\r\n          <strong>Accounts</strong>\r\n          <div style=\"margin-top: 6px; font-size: 14px; font-weight: 600;\">${bureau.total_accounts}</div>\r\n          <div style=\"font-size: 10px; color: #475569;\">Active: ${bureau.active_accounts}</div>\r\n        </div>\r\n        <div style=\"padding: 10px; border: 1px solid #e2e8f0; border-radius: 8px; background: #f8fafc;\">\r\n          <strong>Utilization</strong>\r\n          <div style=\"margin-top: 6px; font-size: 14px; font-weight: 600;\">${bureau.credit_utilization}%</div>\r\n          <div style=\"font-size: 10px; color: #475569;\">On-time: ${bureau.ontime_payments}%</div>\r\n        </div>\r\n        <div style=\"padding: 10px; border: 1px solid #e2e8f0; border-radius: 8px; background: #f8fafc;\">\r\n          <strong>Delays / Defaults</strong>\r\n          <div style=\"margin-top: 6px; font-size: 14px; font-weight: 600;\">Delayed: ${bureau.delayed_payments}%</div>\r\n          <div style=\"font-size: 10px; color: #475569;\">Defaulted: ${bureau.defaulted_payments}%</div>\r\n        </div>\r\n      </div>\r\n    `;\r\n  }\r\n\r\n  private buildFinancialOverviewHtml(): string {\r\n    const financial = this.loanSummaryRef.financialQuickSummary;\r\n    if (!financial) {\r\n      return '<p style=\"margin: 0;\">No financial overview data available.</p>';\r\n    }\r\n\r\n    return `\r\n      <div style=\"display:grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px;\">\r\n        <div style=\"padding: 10px; border: 1px solid #e2e8f0; border-radius: 8px; background: #f8fafc;\">\r\n          <strong>Total Assets</strong>\r\n          <div style=\"margin-top: 6px; font-size: 14px; font-weight: 600;\">${financial.total_assets}</div>\r\n        </div>\r\n        <div style=\"padding: 10px; border: 1px solid #e2e8f0; border-radius: 8px; background: #f8fafc;\">\r\n          <strong>Total Liabilities</strong>\r\n          <div style=\"margin-top: 6px; font-size: 14px; font-weight: 600;\">${financial.total_liabilities}</div>\r\n        </div>\r\n        <div style=\"padding: 10px; border: 1px solid #e2e8f0; border-radius: 8px; background: #f8fafc;\">\r\n          <strong>Net Worth</strong>\r\n          <div style=\"margin-top: 6px; font-size: 14px; font-weight: 600;\">${financial.net_worth}</div>\r\n        </div>\r\n        <div style=\"padding: 10px; border: 1px solid #e2e8f0; border-radius: 8px; background: #f8fafc;\">\r\n          <strong>Key Ratios</strong>\r\n          <div style=\"margin-top: 6px; font-size: 10px; color: #475569;\">Current: ${financial.current_ratio}</div>\r\n          <div style=\"font-size: 10px; color: #475569;\">Debt/Equity: ${financial.debt_equity_ratio}</div>\r\n        </div>\r\n      </div>\r\n    `;\r\n  }\r\n\r\n  private convertMarkdownToHtml(markdown: string): string {\r\n    // Enhanced table conversion with better pattern matching\r\n    const lines = markdown.split('\\n');\r\n    const result: string[] = [];\r\n    let i = 0;\r\n    \r\n    while (i < lines.length) {\r\n      const line = lines[i];\r\n      \r\n      // Check if this line looks like a table header (has pipes and content)\r\n      if (line.trim().startsWith('|') && line.trim().endsWith('|')) {\r\n        // Look ahead for the separator line\r\n        if (i + 1 < lines.length) {\r\n          const nextLine = lines[i + 1];\r\n          // Check if next line is the separator (|---|---|)\r\n          if (nextLine.match(/^\\s*\\|[\\s\\-:|]+\\|\\s*$/)) {\r\n            // We found a table! Process it\r\n            const headerCells = line.split('|')\r\n              .map(cell => cell.trim())\r\n              .filter(cell => cell.length > 0);\r\n            \r\n            const headerHtml = headerCells.map(cell => \r\n              `<th style=\"padding: 6px 8px; border: 1px solid #e5e7eb; background: #f8fafc; font-weight: 600; text-align: left; font-size: 10px;\">${cell}</th>`\r\n            ).join('');\r\n            \r\n            // Skip the separator line\r\n            i += 2;\r\n            \r\n            // Collect table body rows\r\n            const bodyRows: string[] = [];\r\n            while (i < lines.length && lines[i].trim().startsWith('|') && lines[i].trim().endsWith('|')) {\r\n              const rowCells = lines[i].split('|')\r\n                .map(cell => cell.trim())\r\n                .filter(cell => cell.length > 0);\r\n              \r\n              const rowHtml = rowCells.map(cell => \r\n                `<td style=\"padding: 6px 8px; border: 1px solid #e5e7eb; font-size: 10px;\">${cell}</td>`\r\n              ).join('');\r\n              \r\n              bodyRows.push(`<tr>${rowHtml}</tr>`);\r\n              i++;\r\n            }\r\n            \r\n            // Build complete table\r\n            const tableHtml = `<table style=\"width: 100%; border-collapse: collapse; margin: 8px 0; font-size: 10px;\">\r\n              <thead><tr>${headerHtml}</tr></thead>\r\n              <tbody>${bodyRows.join('')}</tbody>\r\n            </table>`;\r\n            \r\n            result.push(tableHtml);\r\n            continue;\r\n          }\r\n        }\r\n      }\r\n      \r\n      // Not a table, just add the line\r\n      result.push(line);\r\n      i++;\r\n    }\r\n    \r\n    return result.join('\\n');\r\n  }\r\n\r\n  onSubmitDecision(): void {\r\n    console.log('Submitting decision for:', this.data.proposal.proposalNo);\r\n    // Placeholder - would open decision submission dialog\r\n    alert('Submit Decision feature coming soon!');\r\n  }\r\n\r\n  onGoNoGoScrolled(scrolledPast: boolean): void {\r\n    this.goNoGoScrollSubject.next(scrolledPast);\r\n  }\r\n\r\n  getHeroDecisionClass(): string {\r\n    const decision = this.effectiveDecision;\r\n    switch (decision) {\r\n      case 'GO': return 'hero-go';\r\n      case 'NO-GO': return 'hero-nogo';\r\n      default: return 'hero-review';\r\n    }\r\n  }\r\n\r\n  /** Get the effective decision (parsed from AI or fallback to goNoGoDecision) */\r\n  get effectiveDecision(): 'GO' | 'NO-GO' | 'REVIEW' {\r\n    return this.parsedDecision || this.goNoGoDecision?.decision || 'REVIEW';\r\n  }\r\n\r\n  /** Get the effective score (parsed from AI or fallback to goNoGoDecision) */\r\n  get effectiveScore(): number {\r\n    return this.parsedScore ?? this.goNoGoDecision?.score ?? 0;\r\n  }\r\n\r\n  /** Parse decision and score from AI-generated Go/No-Go markdown */\r\n  parseDecisionFromGoNoGoResponse(): void {\r\n    const markdown = this.aiGeneratedGoNoGoResponse;\r\n    if (!markdown) return;\r\n    \r\n    // Parse decision - look for patterns like \"Decision: ❌ NO-GO\" or \"Decision: ✅ GO\"\r\n    const decisionPatterns = [\r\n      /Decision:\\s*[❌✅⚠️🔴🟢🟡]*\\s*(NO-GO|NO GO|NOGO|GO|REVIEW)/i,\r\n      /\\*\\*Decision\\*\\*:\\s*[❌✅⚠️🔴🟢🟡]*\\s*(NO-GO|NO GO|NOGO|GO|REVIEW)/i,\r\n      /(NO-GO|GO|REVIEW)\\s*\\((?:Reject|Approve|Review)\\)/i,\r\n    ];\r\n    \r\n    for (const pattern of decisionPatterns) {\r\n      const match = markdown.match(pattern);\r\n      if (match) {\r\n        const decision = match[1].toUpperCase().replace(/\\s+/g, '-');\r\n        if (decision === 'NOGO' || decision === 'NO-GO' || decision === 'NO GO') {\r\n          this.parsedDecision = 'NO-GO';\r\n        } else if (decision === 'GO') {\r\n          this.parsedDecision = 'GO';\r\n        } else if (decision === 'REVIEW') {\r\n          this.parsedDecision = 'REVIEW';\r\n        }\r\n        break;\r\n      }\r\n    }\r\n    \r\n    // Parse score - look for patterns like \"Summary Score: 20/100\" or \"Score: 85%\"\r\n    const scorePatterns = [\r\n      /Summary\\s*Score:\\s*(\\d+)\\s*\\/\\s*100/i,\r\n      /\\*\\*Summary\\s*Score\\*\\*:\\s*(\\d+)\\s*\\/\\s*100/i,\r\n      /Score:\\s*(\\d+)\\s*(?:\\/\\s*100|%)/i,\r\n      /(\\d+)\\s*\\/\\s*100\\s*(?:points?)?/i,\r\n    ];\r\n    \r\n    for (const pattern of scorePatterns) {\r\n      const match = markdown.match(pattern);\r\n      if (match) {\r\n        this.parsedScore = parseInt(match[1], 10);\r\n        break;\r\n      }\r\n    }\r\n  }\r\n\r\n  formatTotalLoanAmount(): string {\r\n    const amount = this.data.proposal.amountRequested || 0;\r\n    if (amount >= 10000000) {\r\n      return '₹' + (amount / 10000000).toFixed(2) + ' Cr';\r\n    } else if (amount >= 100000) {\r\n      return '₹' + (amount / 100000).toFixed(2) + ' L';\r\n    } else if (amount >= 1000) {\r\n      return '₹' + (amount / 1000).toFixed(2) + ' K';\r\n    }\r\n    return '₹' + amount.toLocaleString('en-IN');\r\n  }\r\n\r\n  // ========== Settings Modal Methods ==========\r\n\r\n  openSettingsModal(): void {\r\n    // If in summary view, open the side panel in loan-summary component\r\n    if (this.currentView === 'summary' && this.loanSummaryRef) {\r\n      this.loanSummaryRef.openSettingsPanel();\r\n      return;\r\n    }\r\n    \r\n    // Otherwise, open the modal for selection/loading views\r\n    // Sync ALL settings FROM the service (in case another component updated them)\r\n    this.selectedModel = this.loanSummaryService.selectedModel;\r\n    this.chunkSize = this.loanSummaryService.chunk_size;\r\n    this.chunkOverlap = this.loanSummaryService.chunk_overlap;\r\n    this.topK = this.loanSummaryService.top_k;\r\n    this.selectedEmbeddingModel = this.loanSummaryService.embedding_model;\r\n    this.selectedSearchType = this.loanSummaryService.search_type;\r\n    this.selectedVectorStore = this.loanSummaryService.storage_type;\r\n    // Sync document type selections from service\r\n    this.selectedGst = this.loanSummaryService.selectedGst;\r\n    this.selectedBureau = this.loanSummaryService.selectedBureau;\r\n    this.selectedFinancial = this.loanSummaryService.selectedFinancial;\r\n    // Sync prompt templates from service (if they have values)\r\n    if (this.loanSummaryService.gstPromptTemplate) {\r\n      this.gstPromptTemplate = this.loanSummaryService.gstPromptTemplate;\r\n    }\r\n    if (this.loanSummaryService.bureauPromptTemplate) {\r\n      this.bureauPromptTemplate = this.loanSummaryService.bureauPromptTemplate;\r\n    }\r\n    if (this.loanSummaryService.financialPromptTemplate) {\r\n      this.financialPromptTemplate = this.loanSummaryService.financialPromptTemplate;\r\n    }\r\n    \r\n    this.backupSelectedModel = this.selectedModel;\r\n    this.backupPromptTemplate = this.promptTemplate;\r\n    // Backup RAG settings\r\n    this.backupChunkSize = this.chunkSize;\r\n    this.backupChunkOverlap = this.chunkOverlap;\r\n    this.backupTopK = this.topK;\r\n    this.backupSelectedEmbeddingModel = this.selectedEmbeddingModel;\r\n    this.backupSelectedSearchType = this.selectedSearchType;\r\n    this.backupSelectedVectorStore = this.selectedVectorStore;\r\n    // Backup GST/Bureau/Financial settings\r\n    this.backupSelectedGst = this.selectedGst;\r\n    this.backupSelectedBureau = this.selectedBureau;\r\n    this.backupSelectedFinancial = this.selectedFinancial;\r\n    this.backupGstPromptTemplate = this.gstPromptTemplate;\r\n    this.backupBureauPromptTemplate = this.bureauPromptTemplate;\r\n    this.backupFinancialPromptTemplate = this.financialPromptTemplate;\r\n    this.isSettingsModalOpen = true;\r\n    \r\n    // Initialize the modal component with current settings\r\n    if (this.aiSettingsModal) {\r\n      this.aiSettingsModal.initializeSettings();\r\n    }\r\n  }\r\n\r\n  closeSettingsModal(): void {\r\n    // Restore backup values when closing without save\r\n    this.selectedModel = this.backupSelectedModel;\r\n    this.promptTemplate = this.backupPromptTemplate;\r\n    // Restore RAG settings\r\n    this.chunkSize = this.backupChunkSize;\r\n    this.chunkOverlap = this.backupChunkOverlap;\r\n    this.topK = this.backupTopK;\r\n    this.selectedEmbeddingModel = this.backupSelectedEmbeddingModel;\r\n    this.selectedSearchType = this.backupSelectedSearchType;\r\n    this.selectedVectorStore = this.backupSelectedVectorStore;\r\n    // Restore GST/Bureau/Financial settings\r\n    this.selectedGst = this.backupSelectedGst;\r\n    this.selectedBureau = this.backupSelectedBureau;\r\n    this.selectedFinancial = this.backupSelectedFinancial;\r\n    this.gstPromptTemplate = this.backupGstPromptTemplate;\r\n    this.bureauPromptTemplate = this.backupBureauPromptTemplate;\r\n    this.financialPromptTemplate = this.backupFinancialPromptTemplate;\r\n    this.isSettingsModalOpen = false;\r\n    this.isEditingPrompt = false;\r\n  }\r\n\r\n  onSettingsModalClose(): void {\r\n    this.isSettingsModalOpen = false;\r\n  }\r\n\r\n  onSettingsSaved(settings: AiSettingsData): void {\r\n    // Sync settings from the modal to local state\r\n    this.selectedModel = settings.selectedModel;\r\n    this.chunkSize = settings.chunkSize;\r\n    this.chunkOverlap = settings.chunkOverlap;\r\n    this.topK = settings.topK;\r\n    this.selectedEmbeddingModel = settings.embeddingModel;\r\n    this.selectedSearchType = settings.searchType;\r\n    this.selectedVectorStore = settings.vectorStore;\r\n    this.selectedGst = settings.selectedGst;\r\n    this.selectedBureau = settings.selectedBureau;\r\n    this.selectedFinancial = settings.selectedFinancial;\r\n    this.gstPromptTemplate = settings.gstPromptTemplate;\r\n    this.bureauPromptTemplate = settings.bureauPromptTemplate;\r\n    this.financialPromptTemplate = settings.financialPromptTemplate;\r\n    \r\n    // Update backup values\r\n    this.backupSelectedModel = settings.selectedModel;\r\n    this.backupChunkSize = settings.chunkSize;\r\n    this.backupChunkOverlap = settings.chunkOverlap;\r\n    this.backupTopK = settings.topK;\r\n    this.backupSelectedEmbeddingModel = settings.embeddingModel;\r\n    this.backupSelectedSearchType = settings.searchType;\r\n    this.backupSelectedVectorStore = settings.vectorStore;\r\n    this.backupSelectedGst = settings.selectedGst;\r\n    this.backupSelectedBureau = settings.selectedBureau;\r\n    this.backupSelectedFinancial = settings.selectedFinancial;\r\n    this.backupGstPromptTemplate = settings.gstPromptTemplate;\r\n    this.backupBureauPromptTemplate = settings.bureauPromptTemplate;\r\n    this.backupFinancialPromptTemplate = settings.financialPromptTemplate;\r\n    \r\n    this.isSettingsModalOpen = false;\r\n    \r\n    // Show saving feedback\r\n    this.isSavingSettings = true;\r\n    setTimeout(() => {\r\n      this.isSavingSettings = false;\r\n    }, 2000);\r\n  }\r\n\r\n  toggleEditPrompt(): void {\r\n    this.isEditingPrompt = !this.isEditingPrompt;\r\n  }\r\n\r\n  loadDefaultPromptTemplate(): void {\r\n    this.promptTemplate = this.defaultPromptTemplate;\r\n    this.isEditingPrompt = true;\r\n  }\r\n\r\n  saveAiSettings(): void {\r\n    // Validate that at least one document type has a prompt\r\n    if (this.selectedGst && !this.gstPromptTemplate?.trim()) {\r\n      alert('GST prompt template cannot be empty when GST is selected.');\r\n      return;\r\n    }\r\n    if (this.selectedBureau && !this.bureauPromptTemplate?.trim()) {\r\n      alert('Bureau prompt template cannot be empty when Bureau is selected.');\r\n      return;\r\n    }\r\n    if (this.selectedFinancial && !this.financialPromptTemplate?.trim()) {\r\n      alert('Financial prompt template cannot be empty when Financial Statement is selected.');\r\n      return;\r\n    }\r\n\r\n    const settings = {\r\n      selectedModel: this.selectedModel,\r\n      promptTemplate: this.promptTemplate,\r\n      // RAG Configuration\r\n      chunkSize: this.chunkSize,\r\n      chunkOverlap: this.chunkOverlap,\r\n      topK: this.topK,\r\n      embeddingModel: this.selectedEmbeddingModel,\r\n      searchType: this.selectedSearchType,\r\n      vectorStore: this.selectedVectorStore,\r\n      // Document type selections\r\n      selectedGst: this.selectedGst,\r\n      selectedBureau: this.selectedBureau,\r\n      selectedFinancial: this.selectedFinancial,\r\n      // Prompt templates\r\n      gstPromptTemplate: this.gstPromptTemplate,\r\n      bureauPromptTemplate: this.bureauPromptTemplate,\r\n      financialPromptTemplate: this.financialPromptTemplate\r\n    };\r\n\r\n    try {\r\n      localStorage.setItem(this.settingsStorageKey, JSON.stringify(settings));\r\n      \r\n      // Save GST prompt to history if selected and not empty\r\n      if (this.selectedGst && this.gstPromptTemplate?.trim()) {\r\n        this.addToGstPromptHistory(this.gstPromptTemplate, 'typed');\r\n      }\r\n      \r\n      // Save Bureau prompt to history if selected and not empty\r\n      if (this.selectedBureau && this.bureauPromptTemplate?.trim()) {\r\n        this.addToBureauPromptHistory(this.bureauPromptTemplate, 'typed');\r\n      }\r\n      \r\n      // Save Financial prompt to history if selected and not empty\r\n      if (this.selectedFinancial && this.financialPromptTemplate?.trim()) {\r\n        this.addToFinancialPromptHistory(this.financialPromptTemplate, 'typed');\r\n      }\r\n      \r\n      // Update backup to match saved values\r\n      this.backupSelectedModel = this.selectedModel;\r\n      this.backupPromptTemplate = this.promptTemplate;\r\n      // Update GST/Bureau/Financial backup values\r\n      this.backupSelectedGst = this.selectedGst;\r\n      this.backupSelectedBureau = this.selectedBureau;\r\n      this.backupSelectedFinancial = this.selectedFinancial;\r\n      this.backupGstPromptTemplate = this.gstPromptTemplate;\r\n      this.backupBureauPromptTemplate = this.bureauPromptTemplate;\r\n      this.backupFinancialPromptTemplate = this.financialPromptTemplate;\r\n      // Update RAG backup values\r\n      this.backupChunkSize = this.chunkSize;\r\n      this.backupChunkOverlap = this.chunkOverlap;\r\n      this.backupTopK = this.topK;\r\n      this.backupSelectedEmbeddingModel = this.selectedEmbeddingModel;\r\n      this.backupSelectedSearchType = this.selectedSearchType;\r\n      this.backupSelectedVectorStore = this.selectedVectorStore;\r\n      this.isEditingPrompt = false;\r\n      \r\n      // Sync ALL settings to the shared service so other components stay in sync\r\n      this.loanSummaryService.selectedModel = this.selectedModel;\r\n      this.loanSummaryService.chunk_size = this.chunkSize;\r\n      this.loanSummaryService.chunk_overlap = this.chunkOverlap;\r\n      this.loanSummaryService.top_k = this.topK;\r\n      this.loanSummaryService.embedding_model = this.selectedEmbeddingModel;\r\n      this.loanSummaryService.search_type = this.selectedSearchType;\r\n      this.loanSummaryService.storage_type = this.selectedVectorStore;\r\n      // Sync document type selections to service\r\n      this.loanSummaryService.selectedGst = this.selectedGst;\r\n      this.loanSummaryService.selectedBureau = this.selectedBureau;\r\n      this.loanSummaryService.selectedFinancial = this.selectedFinancial;\r\n      // Sync prompt templates to service\r\n      this.loanSummaryService.gstPromptTemplate = this.gstPromptTemplate;\r\n      this.loanSummaryService.bureauPromptTemplate = this.bureauPromptTemplate;\r\n      this.loanSummaryService.financialPromptTemplate = this.financialPromptTemplate;\r\n      \r\n      // Close the modal - API call will be made when user clicks \"Generate Summary\"\r\n      this.isSettingsModalOpen = false;\r\n      \r\n      console.log('AI settings saved to cache.');\r\n    } catch (e) {\r\n      console.error('Failed to save settings to localStorage:', e);\r\n      alert('Failed to save settings. Please try again.');\r\n    }\r\n  }\r\n\r\n  loadAiSettingsFromCache(): void {\r\n    try {\r\n      const cached = localStorage.getItem(this.settingsStorageKey);\r\n      if (cached) {\r\n        const settings = JSON.parse(cached);\r\n        this.selectedModel = settings.selectedModel || 'llama3.2:3b';\r\n        this.promptTemplate = settings.promptTemplate || this.defaultPromptTemplate;\r\n        // Load RAG settings\r\n        this.chunkSize = settings.chunkSize ?? 500;\r\n        this.chunkOverlap = settings.chunkOverlap ?? 100;\r\n        this.topK = settings.topK ?? 10;\r\n        this.selectedEmbeddingModel = settings.embeddingModel || 'embeddinggemma:300m';\r\n        this.selectedSearchType = settings.searchType || 'similarity';\r\n        this.selectedVectorStore = settings.vectorStore || 'pgvector';\r\n        // Load GST/Bureau/Financial selection and prompts\r\n        this.selectedGst = settings.selectedGst ?? true;\r\n        this.selectedBureau = settings.selectedBureau ?? false;\r\n        this.selectedFinancial = settings.selectedFinancial ?? false;\r\n        this.gstPromptTemplate = settings.gstPromptTemplate || this.defaultGstPromptTemplate;\r\n        this.bureauPromptTemplate = settings.bureauPromptTemplate || this.defaultBureauPromptTemplate;\r\n        this.financialPromptTemplate = settings.financialPromptTemplate || this.defaultFinancialPromptTemplate;\r\n      } else {\r\n        // No cached settings, use defaults\r\n        this.promptTemplate = this.defaultPromptTemplate;\r\n        this.gstPromptTemplate = this.defaultGstPromptTemplate;\r\n        this.bureauPromptTemplate = this.defaultBureauPromptTemplate;\r\n        this.financialPromptTemplate = this.defaultFinancialPromptTemplate;\r\n      }\r\n      // Initialize backup with loaded values\r\n      this.backupSelectedModel = this.selectedModel;\r\n      this.backupPromptTemplate = this.promptTemplate;\r\n      // Initialize RAG backup values\r\n      this.backupChunkSize = this.chunkSize;\r\n      this.backupChunkOverlap = this.chunkOverlap;\r\n      this.backupTopK = this.topK;\r\n      this.backupSelectedEmbeddingModel = this.selectedEmbeddingModel;\r\n      this.backupSelectedSearchType = this.selectedSearchType;\r\n      this.backupSelectedVectorStore = this.selectedVectorStore;\r\n      \r\n      // Sync ALL settings TO the service so other components can access them\r\n      this.loanSummaryService.selectedModel = this.selectedModel;\r\n      this.loanSummaryService.chunk_size = this.chunkSize;\r\n      this.loanSummaryService.chunk_overlap = this.chunkOverlap;\r\n      this.loanSummaryService.top_k = this.topK;\r\n      this.loanSummaryService.embedding_model = this.selectedEmbeddingModel;\r\n      this.loanSummaryService.search_type = this.selectedSearchType;\r\n      this.loanSummaryService.storage_type = this.selectedVectorStore;\r\n      // Sync document type selections to service\r\n      this.loanSummaryService.selectedGst = this.selectedGst;\r\n      this.loanSummaryService.selectedBureau = this.selectedBureau;\r\n      this.loanSummaryService.selectedFinancial = this.selectedFinancial;\r\n      // Sync prompt templates to service\r\n      this.loanSummaryService.gstPromptTemplate = this.gstPromptTemplate;\r\n      this.loanSummaryService.bureauPromptTemplate = this.bureauPromptTemplate;\r\n      this.loanSummaryService.financialPromptTemplate = this.financialPromptTemplate;\r\n      \r\n      // Load prompt history\r\n      this.loadPromptHistory();\r\n      // Load separate GST, Bureau, and Financial prompt histories\r\n      this.loadGstPromptHistory();\r\n      this.loadBureauPromptHistory();\r\n      this.loadFinancialPromptHistory();\r\n    } catch (e) {\r\n      console.error('Failed to load settings from localStorage:', e);\r\n      this.promptTemplate = this.defaultPromptTemplate;\r\n      this.backupSelectedModel = this.selectedModel;\r\n      this.backupPromptTemplate = this.promptTemplate;\r\n      // Reset RAG backup on error\r\n      this.backupChunkSize = this.chunkSize;\r\n      this.backupChunkOverlap = this.chunkOverlap;\r\n      this.backupTopK = this.topK;\r\n      this.backupSelectedEmbeddingModel = this.selectedEmbeddingModel;\r\n      this.backupSelectedSearchType = this.selectedSearchType;\r\n      this.backupSelectedVectorStore = this.selectedVectorStore;\r\n    }\r\n  }\r\n\r\n  resetAiSettings(): void {\r\n    this.selectedModel = 'llama3.2:3b';\r\n    this.promptTemplate = this.defaultPromptTemplate;\r\n    this.isEditingPrompt = false;\r\n    \r\n    // Reset RAG settings to defaults\r\n    this.chunkSize = 500;\r\n    this.chunkOverlap = 100;\r\n    this.topK = 10;\r\n    this.selectedEmbeddingModel = 'embeddinggemma:300m';\r\n    this.selectedSearchType = 'similarity';\r\n    this.selectedVectorStore = 'inmemory';\r\n    \r\n    // Update backup to match reset values\r\n    this.backupSelectedModel = this.selectedModel;\r\n    this.backupPromptTemplate = this.promptTemplate;\r\n    this.backupChunkSize = this.chunkSize;\r\n    this.backupChunkOverlap = this.chunkOverlap;\r\n    this.backupTopK = this.topK;\r\n    this.backupSelectedEmbeddingModel = this.selectedEmbeddingModel;\r\n    this.backupSelectedSearchType = this.selectedSearchType;\r\n    this.backupSelectedVectorStore = this.selectedVectorStore;\r\n    \r\n    // Also clear from localStorage\r\n    try {\r\n      localStorage.removeItem(this.settingsStorageKey);\r\n      console.log('AI settings reset to defaults.');\r\n    } catch (e) {\r\n      console.error('Failed to clear settings from localStorage:', e);\r\n    }\r\n  }\r\n\r\n  formatSliderLabel(value: number): string {\r\n    return `${value}`;\r\n  }\r\n\r\n  triggerFileUpload(): void {\r\n    this.promptFileInput?.nativeElement?.click();\r\n  }\r\n\r\n  onPromptFileUpload(event: Event): void {\r\n    const input = event.target as HTMLInputElement;\r\n    const file = input.files?.[0];\r\n\r\n    if (!file) return;\r\n\r\n    // Validate file type\r\n    if (!file.name.toLowerCase().endsWith('.txt')) {\r\n      alert('Please upload a .txt file.');\r\n      input.value = '';\r\n      return;\r\n    }\r\n\r\n    // Validate file size (max 1 MB)\r\n    const maxSizeBytes = 1 * 1024 * 1024;\r\n    if (file.size > maxSizeBytes) {\r\n      alert('File size exceeds 1 MB limit.');\r\n      input.value = '';\r\n      return;\r\n    }\r\n\r\n    const reader = new FileReader();\r\n    reader.onload = () => {\r\n      const content = reader.result as string;\r\n      if (content && content.trim()) {\r\n        this.promptTemplate = content.trim();\r\n        this.isEditingPrompt = true;\r\n        console.log('Prompt template loaded from file.');\r\n      } else {\r\n        alert('The uploaded file is empty.');\r\n      }\r\n    };\r\n    reader.onerror = () => {\r\n      alert('Failed to read file.');\r\n    };\r\n    reader.readAsText(file);\r\n\r\n    // Reset input to allow re-uploading same file\r\n    input.value = '';\r\n  }\r\n\r\n\r\n\r\n  // ========== Document Type Checkbox Methods ==========\r\n  \r\n  toggleGstSelection(): void {\r\n    // Prevent deselecting both\r\n    if (this.selectedGst && !this.selectedBureau) {\r\n      return; // Cannot deselect the only selected option\r\n    }\r\n    this.selectedGst = !this.selectedGst;\r\n  }\r\n  \r\n  toggleBureauSelection(): void {\r\n    // Prevent deselecting both\r\n    if (this.selectedBureau && !this.selectedGst) {\r\n      return; // Cannot deselect the only selected option\r\n    }\r\n    this.selectedBureau = !this.selectedBureau;\r\n  }\r\n  \r\n  toggleFinancial(): void {\r\n    // Prevent deselecting if it's the only selected option\r\n    if (this.selectedFinancial && !this.selectedGst && !this.selectedBureau) {\r\n      return;\r\n    }\r\n    this.selectedFinancial = !this.selectedFinancial;\r\n    \r\n    // Load default prompt if Financial is selected and prompt is empty\r\n    if (this.selectedFinancial && !this.financialPromptTemplate?.trim()) {\r\n      this.financialPromptTemplate = this.defaultFinancialPromptTemplate;\r\n    }\r\n  }\r\n  \r\n  isBothSelected(): boolean {\r\n    return this.selectedGst && this.selectedBureau;\r\n  }\r\n  \r\n  isMultipleSelected(): boolean {\r\n    // Returns true if more than one document type is selected\r\n    const count = (this.selectedGst ? 1 : 0) + (this.selectedBureau ? 1 : 0) + (this.selectedFinancial ? 1 : 0);\r\n    return count >= 2;\r\n  }\r\n  \r\n  isOnlyGstSelected(): boolean {\r\n    return this.selectedGst && !this.selectedBureau && !this.selectedFinancial;\r\n  }\r\n  \r\n  isOnlyBureauSelected(): boolean {\r\n    return !this.selectedGst && this.selectedBureau && !this.selectedFinancial;\r\n  }\r\n  \r\n  isOnlyFinancialSelected(): boolean {\r\n    return !this.selectedGst && !this.selectedBureau && this.selectedFinancial;\r\n  }\r\n  \r\n  loadDefaultGstPromptTemplate(): void {\r\n    this.gstPromptTemplate = this.defaultGstPromptTemplate;\r\n  }\r\n  \r\n  loadDefaultBureauPromptTemplate(): void {\r\n    this.bureauPromptTemplate = this.defaultBureauPromptTemplate;\r\n  }\r\n  \r\n  loadDefaultFinancialPromptTemplate(): void {\r\n    this.financialPromptTemplate = this.defaultFinancialPromptTemplate;\r\n  }\r\n\r\n  // ========== GST Prompt File Upload Methods ==========\r\n\r\n  triggerGstPromptFileUpload(): void {\r\n    this.gstPromptFileInput?.nativeElement?.click();\r\n  }\r\n\r\n  onGstPromptFileUpload(event: Event): void {\r\n    const input = event.target as HTMLInputElement;\r\n    const file = input.files?.[0];\r\n\r\n    if (!file) return;\r\n\r\n    if (!file.name.toLowerCase().endsWith('.txt')) {\r\n      alert('Please upload a .txt file.');\r\n      input.value = '';\r\n      return;\r\n    }\r\n\r\n    const maxSizeBytes = 1 * 1024 * 1024;\r\n    if (file.size > maxSizeBytes) {\r\n      alert('File size exceeds 1 MB limit.');\r\n      input.value = '';\r\n      return;\r\n    }\r\n\r\n    const reader = new FileReader();\r\n    reader.onload = () => {\r\n      const content = reader.result as string;\r\n      if (content && content.trim()) {\r\n        this.gstPromptTemplate = content.trim();\r\n        this.addToGstPromptHistory(this.gstPromptTemplate, 'uploaded');\r\n        console.log('GST Prompt template loaded from file.');\r\n      } else {\r\n        alert('The uploaded file is empty.');\r\n      }\r\n    };\r\n    reader.onerror = () => {\r\n      alert('Failed to read file.');\r\n    };\r\n    reader.readAsText(file);\r\n    input.value = '';\r\n  }\r\n\r\n  // ========== Bureau Prompt File Upload Methods ==========\r\n\r\n  triggerBureauPromptFileUpload(): void {\r\n    this.bureauPromptFileInput?.nativeElement?.click();\r\n  }\r\n\r\n  onBureauPromptFileUpload(event: Event): void {\r\n    const input = event.target as HTMLInputElement;\r\n    const file = input.files?.[0];\r\n\r\n    if (!file) return;\r\n\r\n    if (!file.name.toLowerCase().endsWith('.txt')) {\r\n      alert('Please upload a .txt file.');\r\n      input.value = '';\r\n      return;\r\n    }\r\n\r\n    const maxSizeBytes = 1 * 1024 * 1024;\r\n    if (file.size > maxSizeBytes) {\r\n      alert('File size exceeds 1 MB limit.');\r\n      input.value = '';\r\n      return;\r\n    }\r\n\r\n    const reader = new FileReader();\r\n    reader.onload = () => {\r\n      const content = reader.result as string;\r\n      if (content && content.trim()) {\r\n        this.bureauPromptTemplate = content.trim();\r\n        this.addToBureauPromptHistory(this.bureauPromptTemplate, 'uploaded');\r\n        console.log('Bureau Prompt template loaded from file.');\r\n      } else {\r\n        alert('The uploaded file is empty.');\r\n      }\r\n    };\r\n    reader.onerror = () => {\r\n      alert('Failed to read file.');\r\n    };\r\n    reader.readAsText(file);\r\n    input.value = '';\r\n  }\r\n\r\n  // ========== GST Prompt History Methods ==========\r\n\r\n  toggleGstPromptHistory(): void {\r\n    this.showGstPromptHistory = !this.showGstPromptHistory;\r\n  }\r\n\r\n  loadGstPromptHistory(): void {\r\n    try {\r\n      const cached = localStorage.getItem(this.gstHistoryStorageKey);\r\n      if (cached) {\r\n        this.gstPromptHistory = JSON.parse(cached);\r\n      }\r\n    } catch (e) {\r\n      console.error('Failed to load GST prompt history:', e);\r\n      this.gstPromptHistory = [];\r\n    }\r\n  }\r\n\r\n  addToGstPromptHistory(template: string, source: 'typed' | 'uploaded'): void {\r\n    if (template === this.defaultGstPromptTemplate) return;\r\n    if (this.gstPromptHistory.length > 0 && this.gstPromptHistory[0].template === template) return;\r\n\r\n    const newEntry = {\r\n      template: template,\r\n      timestamp: new Date().toISOString(),\r\n      source: source\r\n    };\r\n\r\n    this.gstPromptHistory = [newEntry, ...this.gstPromptHistory.filter(h => h.template !== template)].slice(0, 10);\r\n\r\n    try {\r\n      localStorage.setItem(this.gstHistoryStorageKey, JSON.stringify(this.gstPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to save GST prompt history:', e);\r\n    }\r\n  }\r\n\r\n  selectGstFromHistory(historyItem: { template: string; timestamp: string; source: 'typed' | 'uploaded' }): void {\r\n    this.gstPromptTemplate = historyItem.template;\r\n    this.showGstPromptHistory = false;\r\n  }\r\n\r\n  deleteGstFromHistory(index: number, event: Event): void {\r\n    event.stopPropagation();\r\n    this.gstPromptHistory.splice(index, 1);\r\n    try {\r\n      localStorage.setItem(this.gstHistoryStorageKey, JSON.stringify(this.gstPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to update GST prompt history:', e);\r\n    }\r\n  }\r\n\r\n  // ========== Bureau Prompt History Methods ==========\r\n\r\n  toggleBureauPromptHistory(): void {\r\n    this.showBureauPromptHistory = !this.showBureauPromptHistory;\r\n  }\r\n\r\n  loadBureauPromptHistory(): void {\r\n    try {\r\n      const cached = localStorage.getItem(this.bureauHistoryStorageKey);\r\n      if (cached) {\r\n        this.bureauPromptHistory = JSON.parse(cached);\r\n      }\r\n    } catch (e) {\r\n      console.error('Failed to load Bureau prompt history:', e);\r\n      this.bureauPromptHistory = [];\r\n    }\r\n  }\r\n\r\n  addToBureauPromptHistory(template: string, source: 'typed' | 'uploaded'): void {\r\n    if (template === this.defaultBureauPromptTemplate) return;\r\n    if (this.bureauPromptHistory.length > 0 && this.bureauPromptHistory[0].template === template) return;\r\n\r\n    const newEntry = {\r\n      template: template,\r\n      timestamp: new Date().toISOString(),\r\n      source: source\r\n    };\r\n\r\n    this.bureauPromptHistory = [newEntry, ...this.bureauPromptHistory.filter(h => h.template !== template)].slice(0, 10);\r\n\r\n    try {\r\n      localStorage.setItem(this.bureauHistoryStorageKey, JSON.stringify(this.bureauPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to save Bureau prompt history:', e);\r\n    }\r\n  }\r\n\r\n  selectBureauFromHistory(historyItem: { template: string; timestamp: string; source: 'typed' | 'uploaded' }): void {\r\n    this.bureauPromptTemplate = historyItem.template;\r\n    this.showBureauPromptHistory = false;\r\n  }\r\n\r\n  deleteBureauFromHistory(index: number, event: Event): void {\r\n    event.stopPropagation();\r\n    this.bureauPromptHistory.splice(index, 1);\r\n    try {\r\n      localStorage.setItem(this.bureauHistoryStorageKey, JSON.stringify(this.bureauPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to update Bureau prompt history:', e);\r\n    }\r\n  }\r\n\r\n  // ========== Financial Prompt File Upload Methods ==========\r\n\r\n  triggerFinancialPromptFileUpload(): void {\r\n    this.financialPromptFileInput?.nativeElement?.click();\r\n  }\r\n\r\n  onFinancialPromptFileUpload(event: Event): void {\r\n    const input = event.target as HTMLInputElement;\r\n    const file = input.files?.[0];\r\n\r\n    if (!file) return;\r\n\r\n    if (!file.name.toLowerCase().endsWith('.txt')) {\r\n      alert('Please upload a .txt file.');\r\n      input.value = '';\r\n      return;\r\n    }\r\n\r\n    const maxSizeBytes = 1 * 1024 * 1024;\r\n    if (file.size > maxSizeBytes) {\r\n      alert('File size exceeds 1 MB limit.');\r\n      input.value = '';\r\n      return;\r\n    }\r\n\r\n    const reader = new FileReader();\r\n    reader.onload = () => {\r\n      const content = reader.result as string;\r\n      if (content && content.trim()) {\r\n        this.financialPromptTemplate = content.trim();\r\n        this.addToFinancialPromptHistory(this.financialPromptTemplate, 'uploaded');\r\n        console.log('Financial Prompt template loaded from file.');\r\n      } else {\r\n        alert('The uploaded file is empty.');\r\n      }\r\n    };\r\n    reader.onerror = () => {\r\n      alert('Failed to read file.');\r\n    };\r\n    reader.readAsText(file);\r\n    input.value = '';\r\n  }\r\n\r\n  // ========== Financial Prompt History Methods ==========\r\n\r\n  toggleFinancialPromptHistory(): void {\r\n    this.showFinancialPromptHistory = !this.showFinancialPromptHistory;\r\n  }\r\n\r\n  loadFinancialPromptHistory(): void {\r\n    try {\r\n      const cached = localStorage.getItem(this.financialHistoryStorageKey);\r\n      if (cached) {\r\n        this.financialPromptHistory = JSON.parse(cached);\r\n      }\r\n    } catch (e) {\r\n      console.error('Failed to load Financial prompt history:', e);\r\n      this.financialPromptHistory = [];\r\n    }\r\n  }\r\n\r\n  addToFinancialPromptHistory(template: string, source: 'typed' | 'uploaded'): void {\r\n    if (template === this.defaultFinancialPromptTemplate) return;\r\n    if (this.financialPromptHistory.length > 0 && this.financialPromptHistory[0].template === template) return;\r\n\r\n    const newEntry = {\r\n      template: template,\r\n      timestamp: new Date().toISOString(),\r\n      source: source\r\n    };\r\n\r\n    this.financialPromptHistory = [newEntry, ...this.financialPromptHistory.filter(h => h.template !== template)].slice(0, 10);\r\n\r\n    try {\r\n      localStorage.setItem(this.financialHistoryStorageKey, JSON.stringify(this.financialPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to save Financial prompt history:', e);\r\n    }\r\n  }\r\n\r\n  selectFinancialFromHistory(historyItem: { template: string; timestamp: string; source: 'typed' | 'uploaded' }): void {\r\n    this.financialPromptTemplate = historyItem.template;\r\n    this.showFinancialPromptHistory = false;\r\n  }\r\n\r\n  deleteFinancialFromHistory(index: number, event: Event): void {\r\n    event.stopPropagation();\r\n    this.financialPromptHistory.splice(index, 1);\r\n    try {\r\n      localStorage.setItem(this.financialHistoryStorageKey, JSON.stringify(this.financialPromptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to update Financial prompt history:', e);\r\n    }\r\n  }\r\n\r\n  // ========== Prompt History Methods ==========\r\n\r\n  togglePromptHistory(): void {\r\n    this.showPromptHistory = !this.showPromptHistory;\r\n  }\r\n\r\n  loadPromptHistory(): void {\r\n    try {\r\n      const cached = localStorage.getItem(this.historyStorageKey);\r\n      if (cached) {\r\n        this.promptHistory = JSON.parse(cached);\r\n      }\r\n    } catch (e) {\r\n      console.error('Failed to load prompt history:', e);\r\n      this.promptHistory = [];\r\n    }\r\n  }\r\n\r\n  addToPromptHistory(template: string, source: 'typed' | 'uploaded'): void {\r\n    // Don't add if it's the default template or already exists as the most recent\r\n    if (template === this.defaultPromptTemplate) return;\r\n    if (this.promptHistory.length > 0 && this.promptHistory[0].template === template) return;\r\n\r\n    const newEntry = {\r\n      template: template,\r\n      timestamp: new Date().toISOString(),\r\n      source: source\r\n    };\r\n\r\n    // Add to beginning, keep max 10 entries\r\n    this.promptHistory = [newEntry, ...this.promptHistory.filter(h => h.template !== template)].slice(0, 10);\r\n\r\n    try {\r\n      localStorage.setItem(this.historyStorageKey, JSON.stringify(this.promptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to save prompt history:', e);\r\n    }\r\n  }\r\n\r\n  selectFromHistory(historyItem: { template: string; timestamp: string; source: 'typed' | 'uploaded' }): void {\r\n    this.promptTemplate = historyItem.template;\r\n    this.showPromptHistory = false;\r\n    this.isEditingPrompt = false;\r\n  }\r\n\r\n  deleteFromHistory(index: number, event: Event): void {\r\n    event.stopPropagation();\r\n    this.promptHistory.splice(index, 1);\r\n    try {\r\n      localStorage.setItem(this.historyStorageKey, JSON.stringify(this.promptHistory));\r\n    } catch (e) {\r\n      console.error('Failed to update prompt history:', e);\r\n    }\r\n  }\r\n\r\n  formatHistoryDate(timestamp: string): string {\r\n    const date = new Date(timestamp);\r\n    return date.toLocaleDateString('en-US', {\r\n      month: 'short',\r\n      day: 'numeric',\r\n      year: 'numeric',\r\n      hour: '2-digit',\r\n      minute: '2-digit'\r\n    });\r\n  }\r\n\r\n  getPromptPreview(template: string): string {\r\n    return template.length > 80 ? template.substring(0, 80) + '...' : template;\r\n  }\r\n\r\n  onDialogScroll(event: Event): void {\r\n    // Forward scroll event to loan-summary component when in summary view\r\n    if (this.currentView === 'summary' && this.loanSummaryRef) {\r\n      this.loanSummaryRef.onParentScroll(event);\r\n    }\r\n  }\r\n\r\n  // ========== Toast Notification Methods ==========\r\n\r\n  /**\r\n   * Extract error message from various API error response formats.\r\n   * Backend sends: { error: { code: \"...\", message: \"...\", details: {...} } }\r\n   * HttpClient wraps it in HttpErrorResponse: error.error contains the backend response\r\n   */\r\n  private extractErrorMessage(error: any): string {\r\n    // Try FastAPI HTTPException format: error.error.error.message\r\n    if (error?.error?.error?.message) {\r\n      return `Error: ${error.error.error.message}`;\r\n    }\r\n    // Try FastAPI validation error format: error.error.detail\r\n    if (error?.error?.detail) {\r\n      if (typeof error.error.detail === 'string') {\r\n        return `Error: ${error.error.detail}`;\r\n      }\r\n      // Pydantic validation errors\r\n      if (Array.isArray(error.error.detail)) {\r\n        return `Validation Error: ${error.error.detail.map((d: any) => d.msg).join(', ')}`;\r\n      }\r\n    }\r\n    // Try simple error object: error.error (string) or error.message\r\n    if (typeof error?.error === 'string') {\r\n      return `Error: ${error.error}`;\r\n    }\r\n    if(error?.error_message){\r\n      return `Error: ${error.error_message}`;\r\n    }\r\n    if (error?.message) {\r\n      return `Error: ${error.message}`;\r\n    }\r\n    // Fallback\r\n    return 'AI service unavailable. Please try again later.';\r\n  }\r\n\r\n  showErrorToastNotification(message: string): void {\r\n    // Clear any existing timeout\r\n    if (this.errorToastTimeout) {\r\n      clearTimeout(this.errorToastTimeout);\r\n    }\r\n    \r\n    this.errorToastMessage = message;\r\n    this.showErrorToast = true;\r\n    \r\n    // Auto-hide after 20 seconds\r\n    this.errorToastTimeout = setTimeout(() => {\r\n      this.hideErrorToast();\r\n    }, 20000);\r\n  }\r\n\r\n  hideErrorToast(): void {\r\n    this.showErrorToast = false;\r\n    this.errorToastMessage = '';\r\n    if (this.errorToastTimeout) {\r\n      clearTimeout(this.errorToastTimeout);\r\n      this.errorToastTimeout = null;\r\n    }\r\n  }\r\n}\r\n","<div class=\"dialog-container\">\r\n  <!-- Credit Underwriting Copilot Header -->\r\n  <div class=\"dialog-header copilot-header\">\r\n    <div class=\"header-left\">\r\n      <div class=\"title-row\">\r\n        <h2 class=\"copilot-title\">Credit Underwriting Copilot</h2>\r\n        @if (goNoGoDecision) {\r\n          <div\r\n            class=\"hero-decision-badge\"\r\n            [ngClass]=\"getHeroDecisionClass()\"\r\n            [class.visible]=\"showDecisionBadge\"\r\n          >\r\n            <mat-icon>{{\r\n              effectiveDecision === \"GO\"\r\n                ? \"check_circle\"\r\n                : effectiveDecision === \"NO-GO\"\r\n                  ? \"cancel\"\r\n                  : \"help\"\r\n            }}</mat-icon>\r\n            <span class=\"badge-text\">{{ effectiveDecision }}</span>\r\n            <span class=\"badge-score\">{{ effectiveScore }}%</span>\r\n          </div>\r\n        }\r\n      </div>\r\n      <p class=\"copilot-subtitle\">\r\n        @if (currentView === \"summary\" && loanSummary) {\r\n          Loan Application:\r\n          <span class=\"app-id\">{{ data.proposal.proposalNo }}</span> |\r\n          <span class=\"company-name\">{{\r\n            data.proposal.borrowerInfo?.CompanyName ||\r\n              loanSummary.borrowerInformation.name\r\n          }}</span>\r\n        } @else {\r\n          <span class=\"company-name\">{{\r\n            data.proposal.borrowerInfo?.CompanyName ||\r\n              data.proposal.borrowerName\r\n          }}</span>\r\n          -\r\n          <span class=\"app-id\">{{ data.proposal.proposalNo }}</span>\r\n        }\r\n      </p>\r\n    </div>\r\n    <div class=\"header-right\">\r\n      @if (currentView === \"summary\" && loanSummary) {\r\n        <button\r\n          class=\"loan-amount-btn\"\r\n          matTooltip=\"Total Loan Amount Requested\"\r\n        >\r\n          {{ formatTotalLoanAmount() }}\r\n        </button>\r\n        <button\r\n          class=\"export-btn\"\r\n          (click)=\"onExportReport()\"\r\n          [disabled]=\"isExporting\"\r\n          matTooltip=\"Export Summary Report\"\r\n        >\r\n          @if (isExporting) {\r\n            <mat-icon class=\"spin-icon\">sync</mat-icon>\r\n            Exporting...\r\n          } @else {\r\n            <mat-icon>download</mat-icon>\r\n            Export Report\r\n          }\r\n        </button>\r\n        <button\r\n          class=\"submit-btn\"\r\n          (click)=\"onSubmitDecision()\"\r\n          matTooltip=\"Submit Final Decision\"\r\n        >\r\n          <mat-icon>send</mat-icon>\r\n          Submit Decision\r\n        </button>\r\n      }\r\n      <div class=\"help-icon-wrapper\">\r\n        <button\r\n          mat-icon-button\r\n          class=\"help-btn\"\r\n          matTooltip=\"RAG Configuration Tips\"\r\n        >\r\n          <mat-icon>help_outline</mat-icon>\r\n        </button>\r\n        <div class=\"help-tooltip\">\r\n          <div class=\"tooltip-section\">\r\n            <div class=\"tooltip-title\">\r\n              <mat-icon>precision_manufacturing</mat-icon>\r\n              For Best Accuracy\r\n            </div>\r\n            <ul class=\"tooltip-list\">\r\n              <li>\r\n                Choose <strong>Hybrid Search - Similarity + BM25</strong> as\r\n                search type\r\n              </li>\r\n              <li>\r\n                Set <strong>Top K to 15</strong> for optimal chunk retrieval\r\n              </li>\r\n            </ul>\r\n          </div>\r\n          <div class=\"tooltip-section\">\r\n            <div class=\"tooltip-title\">\r\n              <mat-icon>speed</mat-icon>\r\n              For Faster Response\r\n            </div>\r\n            <ul class=\"tooltip-list\">\r\n              <li>\r\n                Choose <strong>PG Vector</strong> for caching and faster summary\r\n                generation\r\n              </li>\r\n            </ul>\r\n          </div>\r\n        </div>\r\n      </div>\r\n      @if (data.proposal.isAiSettingsConfigurable !== false) {\r\n        <button\r\n          mat-icon-button\r\n          (click)=\"openSettingsModal()\"\r\n          class=\"settings-btn\"\r\n          matTooltip=\"AI Settings\"\r\n        >\r\n          <mat-icon>settings</mat-icon>\r\n        </button>\r\n      }\r\n      <button\r\n        mat-icon-button\r\n        (click)=\"closeDialog()\"\r\n        class=\"close-btn\"\r\n        matTooltip=\"Close\"\r\n      >\r\n        <mat-icon>close</mat-icon>\r\n      </button>\r\n    </div>\r\n  </div>\r\n\r\n  <!-- Content Area -->\r\n  <div\r\n    class=\"dialog-content\"\r\n    #dialogContent\r\n    [class.summary-view]=\"currentView === 'summary'\"\r\n    (scroll)=\"onDialogScroll($event)\"\r\n  >\r\n    @switch (currentView) {\r\n      @case (\"selection\") {\r\n        <!-- Controls Row -->\r\n        <div class=\"controls-row\">\r\n          <mat-form-field appearance=\"outline\" class=\"search-field\">\r\n            <mat-label>Search services</mat-label>\r\n            <input\r\n              matInput\r\n              [(ngModel)]=\"searchQuery\"\r\n              (ngModelChange)=\"onSearchChange()\"\r\n              placeholder=\"Example: Bureau\"\r\n            />\r\n            <mat-icon matPrefix>search</mat-icon>\r\n          </mat-form-field>\r\n\r\n          <mat-form-field appearance=\"outline\" class=\"sort-field\">\r\n            <mat-label>Sort by</mat-label>\r\n            <mat-select\r\n              [(ngModel)]=\"sortOption\"\r\n              (ngModelChange)=\"onSortChange()\"\r\n            >\r\n              <mat-option value=\"category\">Essential First</mat-option>\r\n              <mat-option value=\"alphabetical\">Alphabetical</mat-option>\r\n              <mat-option value=\"selected\">Selected First</mat-option>\r\n            </mat-select>\r\n          </mat-form-field>\r\n\r\n          <mat-form-field appearance=\"outline\" class=\"type-field\">\r\n            <mat-label>Summary Type</mat-label>\r\n            <mat-select\r\n              [(ngModel)]=\"summaryType\"\r\n              (ngModelChange)=\"onSummaryTypeChange()\"\r\n            >\r\n              <mat-option value=\"quick\">Quick Summary</mat-option>\r\n              <mat-option value=\"detailed\">Detailed Summary</mat-option>\r\n            </mat-select>\r\n          </mat-form-field>\r\n\r\n          <button\r\n            mat-raised-button\r\n            color=\"primary\"\r\n            (click)=\"generateSummary()\"\r\n            [disabled]=\"getSelectedCount() === 0\"\r\n            class=\"generate-btn\"\r\n          >\r\n            <mat-icon>auto_awesome</mat-icon>\r\n            Generate Summary ({{ getSelectedCount() }})\r\n          </button>\r\n        </div>\r\n\r\n        <!-- Services Grid -->\r\n        <div class=\"services-grid\">\r\n          @for (service of filteredServices; track service.id) {\r\n            <uc-service-card\r\n              [service]=\"service\"\r\n              (toggleSelection)=\"toggleServiceSelection($event)\"\r\n            ></uc-service-card>\r\n          } @empty {\r\n            <div class=\"no-results\">\r\n              <mat-icon>search_off</mat-icon>\r\n              <p>No services match your search criteria</p>\r\n            </div>\r\n          }\r\n        </div>\r\n      }\r\n\r\n      @case (\"loading\") {\r\n        <uc-summary-loading></uc-summary-loading>\r\n      }\r\n\r\n      @case (\"summary\") {\r\n        @if (loanSummary && goNoGoDecision) {\r\n          <uc-loan-summary\r\n            #loanSummaryRef\r\n            [loanSummary]=\"loanSummary\"\r\n            [goNoGoDecision]=\"goNoGoDecision\"\r\n            [selectedServices]=\"selectedServices\"\r\n            [proposalNo]=\"data.proposal.proposalNo\"\r\n            [aiGeneratedResponse]=\"aiGeneratedResponse\"\r\n            [aiGeneratedBureauResponse]=\"aiGeneratedBureauResponse\"\r\n            [aiGeneratedFinancialResponse]=\"aiGeneratedFinancialResponse\"\r\n            [aiGeneratedGoNoGoResponse]=\"aiGeneratedGoNoGoResponse\"\r\n            [bureauData]=\"bureauData\"\r\n            [hasGstDocument]=\"hasGstDocument\"\r\n            [hasBureauDocument]=\"hasBureauDocument\"\r\n            [hasFinancialDocument]=\"hasFinancialDocument\"\r\n            [documents]=\"data.proposal.documents\"\r\n            [isAiSettingsConfigurable]=\"\r\n              data.proposal.isAiSettingsConfigurable !== false\r\n            \"\r\n            [gstQuickSummary]=\"gstQuickSummary\"\r\n            [bureauQuickSummary]=\"bureauQuickSummary\"\r\n            [financialQuickSummary]=\"financialQuickSummary\"\r\n            [proposalBorrowerInfo]=\"data.proposal.borrowerInfo || null\"\r\n            [proposalDirectorInfo]=\"data.proposal.directorInfo || []\"\r\n            [proposalFacilityInfo]=\"data.proposal.facilityInfo || []\"\r\n            (backToSelection)=\"backToSelection()\"\r\n            (exportReport)=\"onExportReport()\"\r\n            (submitDecision)=\"onSubmitDecision()\"\r\n            (goNoGoScrolled)=\"onGoNoGoScrolled($event)\"\r\n            (regenerateSummary)=\"onRegenerateSummary()\"\r\n          ></uc-loan-summary>\r\n        }\r\n      }\r\n    }\r\n  </div>\r\n\r\n  <!-- Export Overlay -->\r\n  @if (isExporting) {\r\n    <div class=\"export-overlay\">\r\n      <div class=\"export-modal\">\r\n        <div class=\"export-icon\">\r\n          <mat-icon class=\"pdf-icon\">picture_as_pdf</mat-icon>\r\n          <div class=\"pulse-ring\"></div>\r\n        </div>\r\n        <h3>Exporting to PDF</h3>\r\n        <p>Please wait while we generate your report...</p>\r\n        <div class=\"export-progress\">\r\n          <div class=\"progress-bar\"></div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  }\r\n\r\n  <!-- Settings Modal Component -->\r\n  @if (data.proposal.isAiSettingsConfigurable !== false) {\r\n    <uc-ai-settings-modal\r\n      [isOpen]=\"isSettingsModalOpen\"\r\n      [hasGstDocument]=\"hasGstDocument\"\r\n      [hasBureauDocument]=\"hasBureauDocument\"\r\n      [hasFinancialDocument]=\"hasFinancialDocument\"\r\n      (closeModal)=\"onSettingsModalClose()\"\r\n      (settingsSaved)=\"onSettingsSaved($event)\"\r\n    ></uc-ai-settings-modal>\r\n  }\r\n\r\n  <!-- Saving Alert -->\r\n  @if (isSavingSettings) {\r\n    <div class=\"saving-alert\">\r\n      <mat-icon class=\"saving-icon\">check_circle</mat-icon>\r\n      <span>AI Settings Saved!</span>\r\n    </div>\r\n  }\r\n\r\n  <!-- Error Toast Notification -->\r\n  @if (showErrorToast) {\r\n    <div class=\"error-toast\" (click)=\"hideErrorToast()\">\r\n      <mat-icon class=\"error-icon\">error_outline</mat-icon>\r\n      <span class=\"error-message\">{{ errorToastMessage }}</span>\r\n      <button\r\n        mat-icon-button\r\n        class=\"close-toast-btn\"\r\n        (click)=\"hideErrorToast()\"\r\n      >\r\n        <mat-icon>close</mat-icon>\r\n      </button>\r\n    </div>\r\n  }\r\n</div>\r\n","/**\r\n * UC-UI Library - AI Summary Button Component\r\n * \r\n * A reusable button component that opens the AI Summary dialog.\r\n * \r\n * @example\r\n * ```html\r\n * <uc-ai-summary-button\r\n *   [proposal]=\"proposal\"\r\n *   (summaryOpened)=\"onSummaryOpened($event)\">\r\n * </uc-ai-summary-button>\r\n * ```\r\n */\r\n\r\nimport { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatDialog, MatDialogModule, MatDialogConfig } from '@angular/material/dialog';\r\n\r\nimport { Proposal } from '../../../models/loan-summary.model';\r\nimport { AiSummaryDialogComponent } from '../../features/ai-summary-dialog/ai-summary-dialog.component';\r\n\r\n/**\r\n * Configuration for the AI Summary dialog\r\n */\r\nexport interface AiSummaryDialogConfig {\r\n  /** Dialog width */\r\n  width?: string;\r\n  /** Dialog height */\r\n  height?: string;\r\n  /** Maximum width */\r\n  maxWidth?: string;\r\n  /** Maximum height */\r\n  maxHeight?: string;\r\n  /** Panel CSS classes */\r\n  panelClass?: string | string[];\r\n  /** Whether dialog is modal */\r\n  disableClose?: boolean;\r\n}\r\n\r\n/**\r\n * Default dialog configuration\r\n */\r\nconst DEFAULT_DIALOG_CONFIG: AiSummaryDialogConfig = {\r\n  width: '100vw',\r\n  height: '100vh',\r\n  maxWidth: '100vw',\r\n  maxHeight: '100vh',\r\n  panelClass: ['ai-summary-dialog', 'maximized'],\r\n  disableClose: false\r\n};\r\n\r\n@Component({\r\n  selector: 'uc-ai-summary-button',\r\n  standalone: true,\r\n  imports: [CommonModule, MatButtonModule, MatIconModule, MatDialogModule],\r\n  template: `\r\n    <button mat-button (click)=\"openAiSummary()\" class=\"ai-summary-btn\" [disabled]=\"disabled\">\r\n      <mat-icon>{{ icon }}</mat-icon>\r\n      <span>{{ label }}</span>\r\n    </button>\r\n  `,\r\n  styles: [`\r\n    .ai-summary-btn {\r\n      background: linear-gradient(135deg, #667eea 0%, #764ba2 50%, #f093fb 100%);\r\n      color: white !important;\r\n      border: none;\r\n      border-radius: 20px;\r\n      padding: 6px 16px;\r\n      font-weight: 500;\r\n      font-size: 13px;\r\n      text-transform: none;\r\n      box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4);\r\n      transition: all 0.3s ease;\r\n      display: inline-flex;\r\n      align-items: center;\r\n      gap: 6px;\r\n\r\n      mat-icon {\r\n        font-size: 18px;\r\n        width: 18px;\r\n        height: 18px;\r\n        color: white;\r\n      }\r\n\r\n      span {\r\n        color: white;\r\n      }\r\n\r\n      &:hover:not(:disabled) {\r\n        background: linear-gradient(135deg, #764ba2 0%, #667eea 50%, #f093fb 100%);\r\n        box-shadow: 0 6px 20px rgba(102, 126, 234, 0.6);\r\n        transform: translateY(-2px);\r\n      }\r\n\r\n      &:active:not(:disabled) {\r\n        transform: translateY(0);\r\n        box-shadow: 0 2px 10px rgba(102, 126, 234, 0.4);\r\n      }\r\n\r\n      &:disabled {\r\n        opacity: 0.6;\r\n        cursor: not-allowed;\r\n      }\r\n    }\r\n  `]\r\n})\r\nexport class AiSummaryButtonComponent implements OnChanges {\r\n  private readonly dialog = inject(MatDialog);\r\n\r\n  /**\r\n   * The proposal data to generate summary for.\r\n   * Required input.\r\n   */\r\n  @Input({ required: true }) proposal!: Proposal;\r\n\r\n  /**\r\n   * Custom dialog configuration.\r\n   * Merged with defaults if provided.\r\n   */\r\n  @Input() dialogConfig?: Partial<AiSummaryDialogConfig>;\r\n\r\n  /**\r\n   * The dialog component to open.\r\n   * Must be provided if using outside the library context.\r\n   */\r\n  @Input() dialogComponent?: unknown;\r\n\r\n  /**\r\n   * Button label text.\r\n   * @default 'AI Summary'\r\n   */\r\n  @Input() label = 'AI Summary';\r\n\r\n  /**\r\n   * Button icon name (Material icon).\r\n   * @default 'psychology'\r\n   */\r\n  @Input() icon = 'psychology';\r\n\r\n  /**\r\n   * Whether the button is disabled.\r\n   * @default false\r\n   */\r\n  @Input() disabled = false;\r\n\r\n  /**\r\n   * Emitted when the summary dialog is opened.\r\n   * Emits the proposal data.\r\n   */\r\n  @Output('onSummaryOpened') summaryOpened = new EventEmitter<Proposal>();\r\n\r\n  /**\r\n   * Emitted when the summary dialog is closed.\r\n   * Emits the result from the dialog (if any).\r\n   */\r\n  @Output('onSummaryClosed') summaryClosed = new EventEmitter<unknown>();\r\n\r\n  /**\r\n   * Lifecycle hook that responds to changes in input properties.\r\n   * Handles updates to proposal and documents data.\r\n   */\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['proposal']) {\r\n      const newProposal = changes['proposal'].currentValue as Proposal;\r\n      console.log('[AI-SUMMARY-BUTTON] Proposal updated:', {\r\n        proposalNo: newProposal?.proposalNo,\r\n        documents: newProposal?.documents,\r\n        documentsCount: newProposal?.documents?.length || 0,\r\n        isAiSettingsConfigurable: newProposal?.isAiSettingsConfigurable\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Opens the AI Summary dialog.\r\n   */\r\n  openAiSummary(): void {\r\n    // Use the provided dialog component or fall back to the library's AiSummaryDialogComponent\r\n    const componentToOpen = this.dialogComponent || AiSummaryDialogComponent;\r\n\r\n    const config: MatDialogConfig = {\r\n      ...DEFAULT_DIALOG_CONFIG,\r\n      ...this.dialogConfig,\r\n      data: { proposal: this.proposal }\r\n    };\r\n\r\n    const dialogRef = this.dialog.open(componentToOpen as any, config);\r\n    this.summaryOpened.emit(this.proposal);\r\n\r\n    dialogRef.afterClosed().subscribe(result => {\r\n      this.summaryClosed.emit(result);\r\n    });\r\n  }\r\n}\r\n","/**\r\n * UC-UI Library - Shared Components\r\n * \r\n * Reusable UI components used across the library.\r\n * @module uc-ui/components/shared\r\n */\r\n\r\n// AI Summary Button\r\nexport { AiSummaryButtonComponent } from './ai-summary-button/ai-summary-button.component';\r\n\r\n// Summary Loading Indicator\r\nexport { SummaryLoadingComponent } from './summary-loading/summary-loading.component';\r\n\r\n// AI Settings Modal (overlay dialog)\r\nexport {\r\n  AiSettingsModalComponent,\r\n  AiSettingsData,\r\n  PromptHistoryItem as ModalPromptHistoryItem\r\n} from './ai-settings-modal/ai-settings-modal.component';\r\n\r\n// AI Settings Panel (side panel)\r\nexport {\r\n  AiSettingsPanelComponent,\r\n  AiSettingsPanelData,\r\n  PromptHistoryItem as PanelPromptHistoryItem\r\n} from './ai-settings-panel/ai-settings-panel.component';\r\n\r\n// Bar Chart (chart.js based, no ng2-charts / NgModule wiring required)\r\nexport { UcBarChartComponent, UcChartDataset } from './charts/bar-chart/bar-chart.component';\r\n\r\n// Line Chart (chart.js based, no ng2-charts / NgModule wiring required)\r\nexport { UcLineChartComponent, UcLineChartDataset } from './charts/line-chart/line-chart.component';\r\n\r\n// Pie Chart (chart.js based, no ng2-charts / NgModule wiring required)\r\nexport { UcPieChartComponent, UcPieChartSlice } from './charts/pie-chart/pie-chart.component';\r\n","import { Component, Output, EventEmitter, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n  ReactiveFormsModule,\r\n  FormBuilder,\r\n  FormGroup,\r\n  Validators,\r\n  AbstractControl,\r\n  ValidationErrors,\r\n} from '@angular/forms';\r\n\r\nimport { AuthService } from '../../../services/auth.service';\r\nimport { LoginResponse } from '../../../models/api-response.model';\r\n\r\n/**\r\n * Login result emitted after successful/failed login\r\n */\r\nexport interface LoginResult {\r\n  success: boolean;\r\n  message: string;\r\n  lastLogin?: string;\r\n}\r\n\r\n@Component({\r\n  selector: 'uc-login',\r\n  standalone: true,\r\n  imports: [CommonModule, ReactiveFormsModule],\r\n  templateUrl: './login.component.html',\r\n  styleUrl: './login.component.scss',\r\n})\r\nexport class LoginComponent {\r\n  @Output() loginSuccess = new EventEmitter<LoginResult>();\r\n  @Output() loginError = new EventEmitter<LoginResult>();\r\n\r\n  loginForm: FormGroup;\r\n  isLoading = false;\r\n\r\n  private fb = inject(FormBuilder);\r\n  private authService = inject(AuthService);\r\n\r\n  constructor() {\r\n    this.loginForm = this.fb.group({\r\n      username: [\r\n        '',\r\n        [\r\n          Validators.required,\r\n          Validators.maxLength(20),\r\n          this.noSpecialCharactersValidator,\r\n        ],\r\n      ],\r\n      password: [\r\n        '',\r\n        [\r\n          Validators.required,\r\n          Validators.maxLength(20),\r\n          this.noSpecialCharactersValidator,\r\n        ],\r\n      ],\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Custom validator to disallow special characters.\r\n   * Only allows alphanumeric characters.\r\n   */\r\n  noSpecialCharactersValidator(\r\n    control: AbstractControl,\r\n  ): ValidationErrors | null {\r\n    if (!control.value) {\r\n      return null;\r\n    }\r\n    const pattern = /^[a-zA-Z0-9]+$/;\r\n    const valid = pattern.test(control.value);\r\n    return valid ? null : { specialCharacters: true };\r\n  }\r\n\r\n  get username() {\r\n    return this.loginForm.get('username');\r\n  }\r\n\r\n  get password() {\r\n    return this.loginForm.get('password');\r\n  }\r\n\r\n  onLogin(): void {\r\n    if (this.loginForm.invalid) {\r\n      this.loginForm.markAllAsTouched();\r\n      return;\r\n    }\r\n\r\n    this.isLoading = true;\r\n\r\n    this.authService.login(this.loginForm.value).subscribe({\r\n      next: (response: LoginResponse) => {\r\n        this.isLoading = false;\r\n        if (response.status === 'success') {\r\n          const lastLogin = response.lastLoginTimestamp\r\n            ? new Date(response.lastLoginTimestamp).toLocaleString()\r\n            : 'First login';\r\n          this.loginSuccess.emit({\r\n            success: true,\r\n            message: 'Login successful!',\r\n            lastLogin,\r\n          });\r\n        } else {\r\n          this.loginError.emit({\r\n            success: false,\r\n            message: response.message || 'Login failed',\r\n          });\r\n        }\r\n      },\r\n      error: (error) => {\r\n        this.isLoading = false;\r\n        const errorMessage =\r\n          error.error?.message || 'Login failed. Please try again.';\r\n        this.loginError.emit({\r\n          success: false,\r\n          message: errorMessage,\r\n        });\r\n      },\r\n    });\r\n  }\r\n}\r\n","<div class=\"login-container\">\r\n  <div class=\"login-card\">\r\n    <h2>Login</h2>\r\n\r\n    <form [formGroup]=\"loginForm\" (ngSubmit)=\"onLogin()\">\r\n      <div class=\"form-group\">\r\n        <label for=\"username\">Username</label>\r\n        <input\r\n          type=\"text\"\r\n          id=\"username\"\r\n          formControlName=\"username\"\r\n          placeholder=\"Enter username\"\r\n          maxlength=\"20\"\r\n          [class.invalid]=\"username?.invalid && username?.touched\"\r\n        />\r\n        <div class=\"error-messages\" *ngIf=\"username?.touched && username?.invalid\">\r\n          <span *ngIf=\"username?.errors?.['required']\">Username is required</span>\r\n          <span *ngIf=\"username?.errors?.['maxlength']\">Maximum 20 characters allowed</span>\r\n          <span *ngIf=\"username?.errors?.['specialCharacters']\">Special characters are not allowed</span>\r\n        </div>\r\n      </div>\r\n\r\n      <div class=\"form-group\">\r\n        <label for=\"password\">Password</label>\r\n        <input\r\n          type=\"password\"\r\n          id=\"password\"\r\n          formControlName=\"password\"\r\n          placeholder=\"Enter password\"\r\n          maxlength=\"20\"\r\n          [class.invalid]=\"password?.invalid && password?.touched\"\r\n        />\r\n        <div class=\"error-messages\" *ngIf=\"password?.touched && password?.invalid\">\r\n          <span *ngIf=\"password?.errors?.['required']\">Password is required</span>\r\n          <span *ngIf=\"password?.errors?.['maxlength']\">Maximum 20 characters allowed</span>\r\n          <span *ngIf=\"password?.errors?.['specialCharacters']\">Special characters are not allowed</span>\r\n        </div>\r\n      </div>\r\n\r\n      <button type=\"submit\" [disabled]=\"isLoading\" class=\"login-btn\">\r\n        <span *ngIf=\"!isLoading\">Login</span>\r\n        <span *ngIf=\"isLoading\">Logging in...</span>\r\n      </button>\r\n    </form>\r\n  </div>\r\n</div>\r\n","import { Component, OnInit, inject, Output, EventEmitter, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\n\r\nimport { LoanSummaryService } from '../../../services/loan-summary.service';\r\nimport { Proposal } from '../../../models/loan-summary.model';\r\nimport { AiSummaryButtonComponent } from '../../shared/ai-summary-button/ai-summary-button.component';\r\n\r\n@Component({\r\n  selector: 'uc-proposal-inbox',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    MatTableModule,\r\n    MatButtonModule,\r\n    MatIconModule,\r\n    MatChipsModule,\r\n    MatTooltipModule,\r\n    MatCardModule,\r\n    MatDialogModule,\r\n    MatProgressSpinnerModule,\r\n    MatBadgeModule,\r\n    AiSummaryButtonComponent,\r\n  ],\r\n  templateUrl: './proposal-inbox.component.html',\r\n  styleUrl: './proposal-inbox.component.scss',\r\n})\r\nexport class ProposalInboxComponent implements OnInit {\r\n  /** Custom proposals data. If not provided, will fetch from service */\r\n  @Input() proposals: Proposal[] = [];\r\n  \r\n  /** Whether to auto-load proposals from service */\r\n  @Input() autoLoad: boolean = true;\r\n  \r\n  /** Emitted when a proposal action is triggered */\r\n  @Output() proposalAction = new EventEmitter<{ action: string; proposal: Proposal }>();\r\n  \r\n  displayedColumns: string[] = [\r\n    'proposalNo',\r\n    'borrowerName',\r\n    'loanType',\r\n    'amountRequested',\r\n    'status',\r\n    'submissionDate',\r\n    'actions',\r\n  ];\r\n  isLoading = true;\r\n\r\n  private loanSummaryService = inject(LoanSummaryService);\r\n\r\n  ngOnInit(): void {\r\n    if (this.autoLoad && this.proposals.length === 0) {\r\n      this.loadProposals();\r\n    } else {\r\n      this.isLoading = false;\r\n    }\r\n  }\r\n\r\n  loadProposals(): void {\r\n    this.isLoading = true;\r\n    this.loanSummaryService.getProposals().subscribe({\r\n      next: (proposals) => {\r\n        this.proposals = proposals;\r\n        this.isLoading = false;\r\n      },\r\n      error: (error) => {\r\n        console.error('Error loading proposals:', error);\r\n        this.isLoading = false;\r\n      },\r\n    });\r\n  }\r\n\r\n  openProfilingLogs(): void {\r\n    this.proposalAction.emit({ action: 'openLogs', proposal: {} as Proposal });\r\n  }\r\n\r\n  getStatusColor(status: string): string {\r\n    switch (status) {\r\n      case 'Approved':\r\n        return 'status-green';\r\n      case 'Rejected':\r\n        return 'status-red';\r\n      case 'Under Review':\r\n        return 'status-yellow';\r\n      default:\r\n        return '';\r\n    }\r\n  }\r\n\r\n  formatCurrency(amount: number): string {\r\n    return this.loanSummaryService.formatCurrency(amount);\r\n  }\r\n}\r\n","<div class=\"proposal-inbox-container\">\r\n  <mat-card class=\"inbox-card\">\r\n    <mat-card-header>\r\n      <div class=\"header-content\">\r\n        <div class=\"header-left\">\r\n          <mat-card-title>\r\n            <mat-icon>inbox</mat-icon>\r\n            <span>Proposal Inbox</span>\r\n          </mat-card-title>\r\n          <mat-card-subtitle\r\n            >Review and manage loan proposals</mat-card-subtitle\r\n          >\r\n        </div>\r\n      </div>\r\n    </mat-card-header>\r\n\r\n    <mat-card-content>\r\n      @if (isLoading) {\r\n        <div class=\"loading-container\">\r\n          <mat-spinner diameter=\"40\"></mat-spinner>\r\n          <p>Loading proposals...</p>\r\n        </div>\r\n      } @else {\r\n        <div class=\"table-container\">\r\n          <table mat-table [dataSource]=\"proposals\" class=\"proposals-table\">\r\n            <!-- Proposal No Column -->\r\n            <ng-container matColumnDef=\"proposalNo\">\r\n              <th mat-header-cell *matHeaderCellDef>Proposal No</th>\r\n              <td mat-cell *matCellDef=\"let proposal\">\r\n                <span class=\"app-id\">{{ proposal.proposalNo }}</span>\r\n              </td>\r\n            </ng-container>\r\n\r\n            <!-- Borrower Name Column -->\r\n            <ng-container matColumnDef=\"borrowerName\">\r\n              <th mat-header-cell *matHeaderCellDef>Borrower Name</th>\r\n              <td mat-cell *matCellDef=\"let proposal\">\r\n                {{ proposal.borrowerName }}\r\n              </td>\r\n            </ng-container>\r\n\r\n            <!-- Loan Type Column -->\r\n            <ng-container matColumnDef=\"loanType\">\r\n              <th mat-header-cell *matHeaderCellDef>Loan Type</th>\r\n              <td mat-cell *matCellDef=\"let proposal\">\r\n                {{ proposal.loanType }}\r\n              </td>\r\n            </ng-container>\r\n\r\n            <!-- Amount Requested Column -->\r\n            <ng-container matColumnDef=\"amountRequested\">\r\n              <th mat-header-cell *matHeaderCellDef>Amount Requested</th>\r\n              <td mat-cell *matCellDef=\"let proposal\">\r\n                {{ formatCurrency(proposal.amountRequested) }}\r\n              </td>\r\n            </ng-container>\r\n\r\n            <!-- Status Column -->\r\n            <ng-container matColumnDef=\"status\">\r\n              <th mat-header-cell *matHeaderCellDef>Status</th>\r\n              <td mat-cell *matCellDef=\"let proposal\">\r\n                <span\r\n                  class=\"status-badge\"\r\n                  [ngClass]=\"getStatusColor(proposal.status)\"\r\n                >\r\n                  {{ proposal.status }}\r\n                </span>\r\n              </td>\r\n            </ng-container>\r\n\r\n            <!-- Submission Date Column -->\r\n            <ng-container matColumnDef=\"submissionDate\">\r\n              <th mat-header-cell *matHeaderCellDef>Submission Date</th>\r\n              <td mat-cell *matCellDef=\"let proposal\">\r\n                {{ proposal.submissionDate }}\r\n              </td>\r\n            </ng-container>\r\n\r\n            <!-- Actions Column -->\r\n            <ng-container matColumnDef=\"actions\">\r\n              <th mat-header-cell *matHeaderCellDef>Actions</th>\r\n              <td mat-cell *matCellDef=\"let proposal\">\r\n                <uc-ai-summary-button\r\n                  [proposal]=\"proposal\"\r\n                ></uc-ai-summary-button>\r\n              </td>\r\n            </ng-container>\r\n\r\n            <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n            <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\r\n          </table>\r\n        </div>\r\n      }\r\n    </mat-card-content>\r\n  </mat-card>\r\n</div>\r\n","/**\r\n * UC-UI Library - Feature Components\r\n * \r\n * Main feature components that compose the underwriter copilot UI.\r\n */\r\n\r\n// AI Summary Dialog Component - The main dialog that opens when clicking the AI Summary button\r\nexport { AiSummaryDialogComponent } from './ai-summary-dialog/ai-summary-dialog.component';\r\n\r\n// Service Card Component (used inside ai-summary-dialog for service selection)\r\nexport { ServiceCardComponent } from './ai-summary-dialog/service-card/service-card.component';\r\n\r\n// Loan Summary Component - Displays the full loan summary with all sections\r\nexport { LoanSummaryComponent } from './loan-summary/loan-summary.component';\r\n\r\n// Login Component\r\nexport { LoginComponent, LoginResult } from './login/login.component';\r\n\r\n// Proposal Inbox Component\r\nexport { ProposalInboxComponent } from './proposal-inbox/proposal-inbox.component';\r\n","/*\r\n * UC-UI Library - Public API\r\n * \r\n * This is the main entry point for the UC-UI library.\r\n * All public components, services, models, and utilities are exported from here.\r\n */\r\n\r\n// ============================================================================\r\n// Configuration\r\n// ============================================================================\r\nexport * from './lib/config';\r\n\r\n// ============================================================================\r\n// Models\r\n// ============================================================================\r\nexport * from './lib/models';\r\n\r\n// ============================================================================\r\n// Services\r\n// ============================================================================\r\nexport * from './lib/services';\r\n\r\n// ============================================================================\r\n// Mock/Demo Data (fallbacks used when a real backend response is unavailable)\r\n// ============================================================================\r\nexport * from './lib/mock-data';\r\n\r\n// ============================================================================\r\n// Components - Shared\r\n// ============================================================================\r\nexport * from './lib/components/shared';\r\n\r\n// ============================================================================\r\n// Components - Sections (Loan Summary Sections)\r\n// ============================================================================\r\nexport * from './lib/components/sections';\r\n\r\n// ============================================================================\r\n// Components - Features (Main Feature Components)\r\n// ============================================================================\r\nexport * from './lib/components/features';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","DEFAULT_COLORS","i4","i6","i7","i1.LoanSummaryService","i5","i2.LoanSummaryService","i8","i9","i10","i11","i12"],"mappings":"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"}