import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne, JoinColumn, Index } from 'typeorm';
import { UserEntity } from '../../../user/entity/users.entity';

export enum ApiKeyTier {
  FREE = 'free',
  BUSINESS = 'business',
}

@Entity('api_keys')
export class ApiKey {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Index({ unique: true })
  @Column()
  key: string;

  @Column()
  name: string;

  @Column('simple-array')
  permissions: string[];

  @Column({ name: 'is_active', default: true })
  isActive: boolean;

  @ManyToOne(() => UserEntity, user => user.apiKeys)
  @JoinColumn({ name: 'user_id' })
  user: UserEntity;

  @Column({ name: 'user_id' })
  userId: string;

  @Column({
    name: 'rate_limit',
    type: 'int',
    default: 100,
    comment: 'Custom rate limit for this API key',
  })
  rateLimit: number;

  @CreateDateColumn({ name: 'created_at' })
  createdAt: Date;

  @UpdateDateColumn({ name: 'updated_at' })
  updatedAt: Date;

  @Column({ name: 'last_used_at', type: 'timestamp', nullable: true })
  lastUsedAt: Date;

  @Column({ name: 'usage_count', default: 0 })
  usageCount: number;
  @Column({
    type: 'enum',
    enum: ApiKeyTier,
    default: ApiKeyTier.FREE,
  })
  tier: ApiKeyTier;

  @Column({ name: 'minute_limit', default: 100 })
  minuteLimit: number;

  @Column({ name: 'daily_limit', default: 1000 })
  dailyLimit: number;

  @Column({ name: 'monthly_limit', default: 10000 })
  monthlyLimit: number;

  // Tracking usage
  @Column({ name: 'minute_usage', default: 0 })
  minuteUsage: number;

  @Column({ name: 'daily_usage', default: 0 })
  dailyUsage: number;

  @Column({ name: 'monthly_usage', default: 0 })
  monthlyUsage: number;

  @Column({ name: 'last_minute_reset', type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })
  lastMinuteReset: Date;

  @Column({ name: 'last_daily_reset', type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })
  lastDailyReset: Date;

  @Column({ name: 'last_monthly_reset', type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })
  lastMonthlyReset: Date;
}
