import { ApiProperty } from '@nestjs/swagger';
import { IsInt, Matches, Max, Min, Length } from 'class-validator';
import {
  LICENSE_EXPIRATION_DAYS,
  LICENSE_EXPIRATION_THRESHOLD_DAYS,
  TRIAL_LICENSE_EXPIRATION_DAYS,
} from '../../../constants';

export class CreateOrdersRequest {
  @ApiProperty()
  @Matches(/^[A-Z0-9]+$/)
  poNumber: string;

  @ApiProperty()
  @IsInt()
  @Min(1)
  @Max(9999)
  orderCount: number;
}

export class CreateOrdersResponse {}

export class IssueCardLicensesRequest {
  @ApiProperty()
  @IsInt()
  @Min(1)
  @Max(9999)
  createCount: number;
}

export class IssueCardLicensesResponse {
  @ApiProperty()
  cardLicenseKeys: string[];
}

export class ActivateCardLicensesRequest {
  @ApiProperty()
  @Matches(/^[A-Z0-9]+$/)
  @Length(20, 20)
  cardLicenseKey: string;
}

export class ActivateCardLicensesResponse {}

export class GetAllocatableLicensesRequest {}

export class AllocatableLicenseInfo {
  @ApiProperty()
  licenseId: number;
  @ApiProperty()
  expiryDate: Date;
}
export class GetAllocatableLicensesResponse {
  @ApiProperty({ type: [AllocatableLicenseInfo] })
  allocatableLicenses: AllocatableLicenseInfo[];
}

export class CancelOrderRequest {
  @ApiProperty()
  @Matches(/^[A-Z0-9]+$/)
  poNumber: string;
}

export class CancelOrderResponse {}

// ライセンス算出用に、その日の始まりの時刻（0:00:00.000）の日付を取得する
export class DateWithZeroTime extends Date {
  constructor(...args: any[]) {
    if (args.length === 0) {
      super(); // 引数がない場合、現在の日付で初期化
    } else {
      super(...(args as [string])); // 引数がある場合、引数をそのままDateクラスのコンストラクタに渡す
    }
    this.setHours(0, 0, 0, 0); // 時分秒を"0:00:00.000"に固定
  }
}

// ライセンスの算出用に、閾値となる時刻（23:59:59.999）の日付を取得する
export class ExpirationThresholdDate extends Date {
  constructor(...args: any[]) {
    if (args.length === 0) {
      super(); // 引数がない場合、現在の日付で初期化
    } else {
      super(...(args as [string])); // 引数がある場合、引数をそのままDateクラスのコンストラクタに渡す
    }
    this.setDate(this.getDate() + LICENSE_EXPIRATION_THRESHOLD_DAYS);
    this.setHours(23, 59, 59, 999); // 時分秒を"23:59:59.999"に固定
  }
}

// 新規トライアルライセンス発行時の有効期限算出用に、30日後の日付を取得する
export class NewTrialLicenseExpirationDate extends Date {
  constructor(...args: any[]) {
    if (args.length === 0) {
      super(); // 引数がない場合、現在の日付で初期化
    } else {
      super(...(args as [string])); // 引数がある場合、引数をそのままDateクラスのコンストラクタに渡す
    }
    this.setDate(this.getDate() + TRIAL_LICENSE_EXPIRATION_DAYS);
    this.setHours(23, 59, 59); // 時分秒を"23:59:59"に固定
    this.setMilliseconds(0);
  }
}

// 新規ライセンス割り当て時の有効期限算出用に、365日後の日付を取得する
export class NewAllocatedLicenseExpirationDate extends Date {
  constructor(...args: any[]) {
    if (args.length === 0) {
      super(); // 引数がない場合、現在の日付で初期化
    } else {
      super(...(args as [string])); // 引数がある場合、引数をそのままDateクラスのコンストラクタに渡す
    }
    this.setDate(this.getDate() + LICENSE_EXPIRATION_DAYS);
    this.setHours(23, 59, 59); // 時分秒を"23:59:59"に固定
    this.setMilliseconds(0);
  }
}
