import { typeParser } from '@lib/utils/type-parser';
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { Expose, Transform } from 'class-transformer';
import {
  IsEnum,
  IsIn,
  IsInt,
  IsObject,
  IsOptional,
  IsString,
} from 'class-validator';

export enum AdminAlarmDetailKind {
  신규계정업로드 = 'AGENCY_FC_CREATE_UPLOAD',
  계정수정업로드 = 'AGENCY_FC_ACCOUNT_UPDATE_UPLOAD',
  상태변경업로드 = 'AGENCY_FC_SUBSCRIBE_UPLOAD',
  조직권한업로드 = 'AGENCY_FC_ORG_UPLOAD',
}

export enum AdminAlarmKind {
  신규계정업로드 = '신규계정 업로드',
  계정수정업로드 = '계정수정 업로드',
  상태변경업로드 = '상태변경 업로드',
  조직권한업로드 = '조직·권한 업로드',
  최초구독처리 = '최초구독 처리',
  구독해지처리 = '구독해지 처리',
  재구독처리 = '재구독 처리',
  재분석처리 = '재분석 처리',
  기타 = '기타',
}

export type AdminAlarmDetailRow = {
  rowNumber: number;
  memLoginId: string;
  action: string;
  status: '성공' | '실패';
  reason?: string;
  orgCode?: string;
  orgManager?: 'Y' | 'N';
};

export type AdminAlarmDetail = {
  kind: AdminAlarmDetailKind;
  agencyName: string;
  requestedCount: number;
  successCount: number;
  failCount: number;
  rows: AdminAlarmDetailRow[];
};

export enum AdminAlarmType {
  엑셀 = 'AAD001',
  구독 = 'AAD002',
  분석 = 'AAD003',
}

export enum AdminAlarmResultType {
  성공 = 'ALT001',
  실패 = 'ALT002',
}

export class AdminAlarm {
  @Expose()
  @ApiProperty({ description: '알람id' })
  @Transform(({ value }) => typeParser.int(value))
  @IsInt()
  aadId!: number;

  @Expose()
  @ApiProperty({
    description: `알림타입(엑셀 : AAD001 | 구독 : AAD002)`,
    enum: AdminAlarmType,
  })
  @IsEnum(AdminAlarmType)
  aadType!: AdminAlarmType;

  @Expose()
  @ApiProperty({ description: '알림 세부유형', enum: AdminAlarmKind })
  @IsEnum(AdminAlarmKind)
  alarmKind!: AdminAlarmKind;

  @Expose()
  @ApiProperty({
    description: `알림결과타입(성공:ALT001 | 실패:ALT002)`,
    enum: AdminAlarmResultType,
  })
  @IsEnum(AdminAlarmResultType)
  aadResultType!: AdminAlarmResultType;

  @Expose()
  @ApiProperty({ description: '알람메세지' })
  @IsString()
  aadMessage!: string;

  @Expose()
  @ApiProperty({ description: '알람확인여부(1:확인, 0: 미확인)' })
  @IsIn([0, 1])
  aadChecked!: number;

  @Expose()
  @ApiPropertyOptional({ description: '리다이렉트시 id' })
  @IsString()
  @IsOptional()
  aadRedirectPage?: string;

  @Expose()
  @ApiPropertyOptional({ description: '업로드 유형별 알림 상세' })
  @IsObject()
  @IsOptional()
  aadDetail?: AdminAlarmDetail;

  @Expose()
  @ApiPropertyOptional({ description: '알람수정일시' })
  @IsString()
  @IsOptional()
  aadUpdatedAt?: string;

  @Expose()
  @ApiProperty({ description: '알람생성일시' })
  @IsString()
  aadCreatedAt!: string;
}
