import {
  IsEnum,
  IsInt,
  IsNotEmpty
} from "class-validator";
import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from "typeorm";
import { PermissionAction } from '../enums/PermissionAction';
import { PermissionTarget } from '../enums/PermissionTargets';
import { ResponsePermission } from '../responses/ResponsePermission';
import { Principal } from './Principal';
/**
 * Defines the Permission entity.
 * Permissions can be granted to principals.
 * The permissions possible targets and actions are defined in enums.
*/
@Entity()
export class Permission {
  /**
   * Autogenerated unique id (primary key).
   */
  @PrimaryGeneratedColumn()
  @IsInt()
  id: number;

  /**
   * The permission's principal.
   */
  @ManyToOne(() => Principal, principal => principal.permissions)
  principal: Principal;

  /**
   * The permission's target.
   * This get's stored as the enum value's string representation for compatability reasons.
   */
  @Column({ type: 'varchar' })
  @IsNotEmpty()
  @IsEnum(PermissionTarget)
  target: PermissionTarget;

  /**
   * The permission's action.
   * This get's stored as the enum value's string representation for compatability reasons.
   */
  @Column({ type: 'varchar' })
  @IsEnum(PermissionAction)
  action: PermissionAction;

  /**
   * Turn this into a string for exporting and jwts.
   * Mainly used to shrink the size of jwts (otherwise the would contain entire objects).
   */
  public toString(): string {
    return this.target + ":" + this.action;
  }

  /**
   * Turns this entity into it's response class.
   */
  public toResponse(): ResponsePermission {
    return new ResponsePermission(this);
  }
}