import { BadRequestException, Controller, Get, Param, Post, Query, UseGuards, } from "@nestjs/common"; import { ApiBearerAuth, ApiOperation, ApiParam, ApiQuery, ApiTags, } from "@nestjs/swagger"; import { LocalActorAuthGuard } from "src/auth/guards/actor-local.guard"; import { RolesGuard } from "src/auth/guards/role.guard"; import { Roles } from "src/decorators/roles.decorator"; import { RoleEnum } from "src/Types&Enums/role.enum"; import { ClaimRequestManagementService } from "src/claim-request-management/claim-request-management.service"; import { isFanavaranClientKey, listFanavaranClientProfiles, normalizeFanavaranClientKey, resolveFanavaranClientKey, } from "src/core/config/fanavaran-client.config"; @ApiTags("fanavaran") @Controller("v2/fanavaran") @ApiBearerAuth() @UseGuards(LocalActorAuthGuard, RolesGuard) @Roles(RoleEnum.ADMIN, RoleEnum.FIELD_EXPERT) export class FanavaranController { constructor( private readonly claimRequestManagementService: ClaimRequestManagementService, ) {} @Get("clients") @ApiOperation({ summary: "List supported Fanavaran insurance clients", description: "Returns configured Fanavaran tenants (parsian, tejaratno) and which client is active for this deployment.", }) listClients() { const activeClient = resolveFanavaranClientKey(); return { activeClient, clients: listFanavaranClientProfiles().map((profile) => ({ key: profile.key, defaults: profile.defaults, isActive: profile.key === activeClient, })), }; } @Get(":client/claim-cases/:claimCaseId/base-claim/preview") @ApiOperation({ summary: "Preview Fanavaran base claim create payload", description: "Builds the GEN.03 third-party-car-financial-claims payload from local claimCases + blameCases without creating a Fanavaran claim.", }) @ApiParam({ name: "client", description: "Fanavaran tenant key", enum: ["parsian", "tejaratno"], }) @ApiParam({ name: "claimCaseId", description: "Claim case MongoDB ObjectId", }) @ApiQuery({ name: "debug", required: false, description: "When true, returns payload plus mapping debug steps", }) async preview( @Param("client") client: string, @Param("claimCaseId") claimCaseId: string, @Query("debug") debug?: string, ) { const clientKey = this.parseClientParam(client); return await this.claimRequestManagementService.previewFanavaranSubmitV2( claimCaseId, clientKey, { debug: debug === "1" || debug === "true" }, ); } @Post(":client/claim-cases/:claimCaseId/base-claim/submit") @ApiOperation({ summary: "Submit Fanavaran base claim create request", description: "Authenticates with the selected tenant credentials and submits the GEN.03 base claim create request. Stores returned Id as claimId and ClaimNo when present.", }) @ApiParam({ name: "client", description: "Fanavaran tenant key", enum: ["parsian", "tejaratno"], }) @ApiParam({ name: "claimCaseId", description: "Claim case MongoDB ObjectId", }) async submit( @Param("client") client: string, @Param("claimCaseId") claimCaseId: string, ) { const clientKey = this.parseClientParam(client); return await this.claimRequestManagementService.submitFanavaranV2( claimCaseId, clientKey, ); } @Get(":client/claim-cases/:claimCaseId/damage-case/preview") @ApiOperation({ summary: "Preview Fanavaran damage-case payload", description: "Builds the GEN.12 damaged vehicle/person case payload without calling Fanavaran. Requires selected damaged parts; submit requires a Fanavaran claimId.", }) @ApiParam({ name: "client", description: "Fanavaran tenant key", enum: ["parsian", "tejaratno"], }) @ApiParam({ name: "claimCaseId", description: "Claim case MongoDB ObjectId", }) async previewDamageCase( @Param("client") client: string, @Param("claimCaseId") claimCaseId: string, ) { const clientKey = this.parseClientParam(client); return await this.claimRequestManagementService.previewFanavaranDamageCaseV2( claimCaseId, clientKey, ); } @Post(":client/claim-cases/:claimCaseId/damage-case/submit") @ApiOperation({ summary: "Submit Fanavaran damage-case request", description: "Submits the GEN.12 dmg-cases request for the already-created Fanavaran claim and stores returned Id as local dmgCaseId.", }) @ApiParam({ name: "client", description: "Fanavaran tenant key", enum: ["parsian", "tejaratno"], }) @ApiParam({ name: "claimCaseId", description: "Claim case MongoDB ObjectId", }) async submitDamageCase( @Param("client") client: string, @Param("claimCaseId") claimCaseId: string, ) { const clientKey = this.parseClientParam(client); return await this.claimRequestManagementService.submitFanavaranDamageCaseV2( claimCaseId, clientKey, ); } @Get(":client/claim-cases/:claimCaseId/attachments/preview") @ApiOperation({ summary: "Preview Fanavaran attachment upload plan", description: "Lists local required-document and captured damage images that would be sent to GEN.07. Shows which images are already recorded as uploaded to Fanavaran.", }) @ApiParam({ name: "client", description: "Fanavaran tenant key", enum: ["parsian", "tejaratno"], }) @ApiParam({ name: "claimCaseId", description: "Claim case MongoDB ObjectId", }) async previewAttachments( @Param("client") client: string, @Param("claimCaseId") claimCaseId: string, ) { const clientKey = this.parseClientParam(client); return await this.claimRequestManagementService.previewFanavaranAttachmentsV2( claimCaseId, clientKey, ); } @Post(":client/claim-cases/:claimCaseId/attachments/submit") @ApiOperation({ summary: "Submit missing Fanavaran attachments", description: "Uploads every local image that does not already have a recorded successful GEN.07 Fanavaran file upload. Uses one multipart request per image.", }) @ApiParam({ name: "client", description: "Fanavaran tenant key", enum: ["parsian", "tejaratno"], }) @ApiParam({ name: "claimCaseId", description: "Claim case MongoDB ObjectId", }) async submitAttachments( @Param("client") client: string, @Param("claimCaseId") claimCaseId: string, ) { const clientKey = this.parseClientParam(client); return await this.claimRequestManagementService.submitFanavaranAttachmentsV2( claimCaseId, clientKey, ); } @Get(":client/claim-cases/:claimCaseId/expertise/preview") @ApiOperation({ summary: "Preview Fanavaran expertise payload", description: "Builds the GEN.08 expertise payload from the active damage expert reply, price-drop data, and Fanavaran lookup mappings without calling Fanavaran.", }) @ApiParam({ name: "client", description: "Fanavaran tenant key", enum: ["parsian", "tejaratno"], }) @ApiParam({ name: "claimCaseId", description: "Claim case MongoDB ObjectId", }) async previewExpertise( @Param("client") client: string, @Param("claimCaseId") claimCaseId: string, ) { const clientKey = this.parseClientParam(client); return await this.claimRequestManagementService.previewFanavaranExpertiseV2( claimCaseId, clientKey, ); } @Post(":client/claim-cases/:claimCaseId/expertise/submit") @ApiOperation({ summary: "Submit Fanavaran expertise request", description: "Submits the GEN.08 expertise payload for a claim with existing Fanavaran claimId and dmgCaseId. Stores returned Id as local expertiseId.", }) @ApiParam({ name: "client", description: "Fanavaran tenant key", enum: ["parsian", "tejaratno"], }) @ApiParam({ name: "claimCaseId", description: "Claim case MongoDB ObjectId", }) async submitExpertise( @Param("client") client: string, @Param("claimCaseId") claimCaseId: string, ) { const clientKey = this.parseClientParam(client); return await this.claimRequestManagementService.submitFanavaranExpertiseV2( claimCaseId, clientKey, ); } private parseClientParam(client: string) { if (!isFanavaranClientKey(client)) { throw new BadRequestException( `Invalid Fanavaran client "${client}". Expected one of: parsian, tejaratno`, ); } return normalizeFanavaranClientKey(client); } }