import {
  BaseEntity,
  Column,
  Entity,
  Index,
  JoinColumn,
  ManyToOne,
  PrimaryGeneratedColumn,
} from 'typeorm';
import { ProductEntity } from '../../product/entities/product.entity';
import { UserEntity } from '../../user/entities/user.entity';

export enum LogClient {
  panel = 'panel',
  site = 'site',
  app = 'app',
  system = 'system',
}

@Index('fk_logs_users1_idx', ['operatorUserId'], {})
@Entity('logs')
export class LogEntity extends BaseEntity {
  @PrimaryGeneratedColumn({ type: 'int', name: 'id' })
  id: number;

  @Column('char', { name: 'operatorUserId', length: 36, nullable: true })
  operatorUserId: string | null;

  @Column('varchar', { name: 'type', length: 45 })
  type: string;

  @Column('varchar', { name: 'action', length: 45 })
  action: string;

  @Column('varchar', { name: 'affectedId', length: 45, nullable: true })
  affectedId: string | null;

  @Column('text', { name: 'params', nullable: true })
  params: string | null;

  @Column('varchar', { name: 'message', length: 255 })
  message: string;

  @Column('enum', {
    name: 'client',
    enum: LogClient,
    default: () => LogClient.site,
  })
  client: LogClient;

  @Column('varchar', { name: 'ip', nullable: true, length: 45 })
  ip: string | null;

  @Column('datetime', { name: 'createdAt' })
  createdAt: Date;

  @Column('datetime', { name: 'updatedAt' })
  updatedAt: Date;

  /**
   * Relations
   */
  @ManyToOne(() => UserEntity, (users) => users.operatorlogs, {
    onDelete: 'NO ACTION',
    onUpdate: 'NO ACTION',
  })
  @JoinColumn([{ name: 'operatorUserId', referencedColumnName: 'id' }])
  operatorUser: UserEntity;

  @ManyToOne(() => UserEntity, (users) => users.affectedLogs, {
    onDelete: 'NO ACTION',
    onUpdate: 'NO ACTION',
  })
  @JoinColumn([{ name: 'affectedId', referencedColumnName: 'id' }])
  affectedUser: UserEntity;

  @ManyToOne(() => ProductEntity, (products) => products.logs, {
    onDelete: 'NO ACTION',
    onUpdate: 'NO ACTION',
  })
  @JoinColumn([{ name: 'affectedId', referencedColumnName: 'id' }])
  affectedProduct: ProductEntity;
}
