import { Entity, PrimaryGeneratedColumn, Column, Index, CreateDateColumn } from 'typeorm';

@Entity('city_block_ipv4')
export class CityBlockIpv4 {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({
    name: 'network',
    type: 'int',
    unsigned: true,
  })
  @Index()
  network: number;

  @Column({ name: 'prefix_len', type: 'int', default: 32 })
  prefixLen: number;

  @Column({
    name: 'end_ip',
    type: 'bigint',
    unsigned: true,
    nullable: true,
  })
  @Index()
  endIp: bigint;

  @Column({ name: 'geoname_id', nullable: true, type: 'int' })
  geonameId: number;

  @Column({ name: 'registered_country_geoname_id', nullable: true, type: 'int' })
  registeredCountryGeonameId: number;

  @Column({ name: 'represented_country_geoname_id', nullable: true, type: 'int' })
  representedCountryGeonameId: number;

  @Column({ name: 'is_anonymous_proxy', nullable: true, default: false, type: 'boolean' })
  isAnonymousProxy: boolean;

  @Column({ name: 'is_satellite_provider', nullable: true, default: false, type: 'boolean' })
  isSatelliteProvider: boolean;

  @Column({ name: 'postal_code', nullable: true, type: 'varchar' })
  postalCode: string;

  @Column({
    name: 'latitude',
    type: 'decimal',
    precision: 10,
    scale: 7,
    nullable: true,
    transformer: {
      to: value => value,
      from: value => parseFloat(value),
    },
  })
  latitude: number;

  @Column({
    name: 'longitude',
    type: 'decimal',
    precision: 10,
    scale: 7,
    nullable: true,
    transformer: {
      to: value => value,
      from: value => parseFloat(value),
    },
  })
  longitude: number;

  @Column({ name: 'accuracy_radius', nullable: true, type: 'float' })
  accuracyRadius: number;

  @Column({ name: 'is_anycast', nullable: false, default: false, type: 'boolean' })
  isAnycast: boolean;

  @Column({ name: 'data_hash', type: 'varchar', length: 64, nullable: true })
  @Index()
  dataHash: string;

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

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

@Entity('city_block_ipv6')
export class CityBlockIpv6 {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ name: 'network', type: 'varbinary', length: 16 })
  @Index()
  network: Buffer;

  @Column({ name: 'prefix_len', type: 'int' })
  prefixLen: number;

  @Column({ name: 'end_ip', type: 'varbinary', length: 16, nullable: true })
  @Index()
  endIp: Buffer;

  @Column({ name: 'geoname_id', type: 'int', nullable: true })
  geonameId: number;

  @Column({ name: 'registered_country_geoname_id', type: 'int', nullable: true })
  registeredCountryGeonameId: number;

  @Column({ name: 'represented_country_geoname_id', type: 'int', nullable: true })
  representedCountryGeonameId: number;

  @Column({
    name: 'latitude',
    type: 'decimal',
    precision: 10,
    scale: 7,
    nullable: true,
    transformer: {
      to: value => value,
      from: value => parseFloat(value),
    },
  })
  latitude: number;

  @Column({
    name: 'longitude',
    type: 'decimal',
    precision: 10,
    scale: 7,
    nullable: true,
    transformer: {
      to: value => value,
      from: value => parseFloat(value),
    },
  })
  longitude: number;

  @Column({ name: 'accuracy_radius', type: 'float', nullable: true })
  accuracyRadius: number;

  @Column({ name: 'postal_code', type: 'varchar', length: 50, nullable: true })
  postalCode: string;

  @Column({ name: 'is_anonymous_proxy', type: 'boolean', nullable: true })
  isAnonymousProxy: boolean;

  @Column({ name: 'is_satellite_provider', type: 'boolean', nullable: true })
  isSatelliteProvider: boolean;

  @Column({ name: 'is_anycast', type: 'boolean', nullable: true })
  isAnycast: boolean;

  @Column({ name: 'data_hash', type: 'varchar', length: 64, nullable: true })
  @Index()
  dataHash: string;

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

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