import { ApiProperty } from '@nestjs/swagger';
import { Transform } from 'class-transformer';
import { ArrayUnique, IsArray, IsBoolean, IsIn, IsInt, IsMongoId, IsOptional, IsString, Max, MaxLength, Min, MinLength } from 'class-validator';

const trim = ({ value }: { value: unknown }) => (typeof value === 'string' ? value.trim() : value);

export class CreateInsurerDto {
    @ApiProperty({ example: 'Bajaj Allianz General Insurance' })
    @IsString()
    @MinLength(2)
    @MaxLength(100)
    @Transform(trim)
    name: string;

    @ApiProperty({ required: false, example: '1800-209-5858' })
    @IsOptional()
    @IsString()
    @MaxLength(30)
    @Transform(trim)
    claims_helpline?: string;

    @ApiProperty({ required: false, type: [String], description: 'Category ids this insurer underwrites' })
    @IsOptional()
    @IsArray()
    @ArrayUnique()
    @IsMongoId({ each: true })
    category_ids?: string[];
}

export class UpdateInsurerDto {
    @ApiProperty({ required: false })
    @IsOptional()
    @IsString()
    @MinLength(2)
    @MaxLength(100)
    @Transform(trim)
    name?: string;

    @ApiProperty({ required: false })
    @IsOptional()
    @IsString()
    @MaxLength(30)
    @Transform(trim)
    claims_helpline?: string;

    @ApiProperty({ required: false, type: [String], description: 'Replaces the insurer\'s categories' })
    @IsOptional()
    @IsArray()
    @ArrayUnique()
    @IsMongoId({ each: true })
    category_ids?: string[];

    @ApiProperty({ required: false, description: 'false deactivates the insurer' })
    @IsOptional()
    @IsBoolean()
    is_active?: boolean;
}

export class InsurerListDto {
    @ApiProperty({ required: false, default: 1 })
    @IsOptional()
    @Transform(({ value }) => Number(value))
    @IsInt()
    @Min(1)
    page: number = 1;

    @ApiProperty({ required: false, default: 10 })
    @IsOptional()
    @Transform(({ value }) => Number(value))
    @IsInt()
    @Min(1)
    @Max(100)
    limit: number = 10;

    @ApiProperty({ required: false, description: 'Search by name or claims helpline' })
    @IsOptional()
    @IsString()
    search?: string;

    @ApiProperty({ required: false, enum: ['true', 'false'], description: 'Filter by status' })
    @IsOptional()
    @IsIn(['true', 'false'])
    is_active?: string;

    @ApiProperty({ required: false, description: 'Only insurers underwriting this category' })
    @IsOptional()
    @IsMongoId()
    category_id?: string;
}
