import { Table, TableForeignKey } from "typeorm";
import { getDefaultByORM, getTypeByORM, isIncrementPrimary, isUUIDPrimary } from "../ormHelper";

export const invite_table = new Table({
  name: "invite",
  columns: [
    { name: "mail", ...getTypeByORM("varchar"), isPrimary: true },
    { name: "token", ...getTypeByORM("varchar") },
    { name: "username", ...getTypeByORM("varchar") },
    { name: "firstname", ...getTypeByORM("varchar") },
    { name: "lastname", ...getTypeByORM("varchar") },
    { name: "secret", ...getTypeByORM("varchar") },
  ],
});
export const role_table = new Table({
  name: "role",
  columns: [
    { name: "id", ...getTypeByORM("int"), ...isIncrementPrimary },
    { name: "role", ...getTypeByORM("varchar"), isUnique: true },
  ],
});

export const role_permission_table = new Table({
  name: "role_permission",
  columns: [
    { name: "roleId", ...getTypeByORM("int"), isPrimary: true },
    { name: "permission", ...getTypeByORM("varchar"), isPrimary: true },
  ],
  foreignKeys: [
    new TableForeignKey({
      columnNames: ["roleId"],
      referencedColumnNames: ["id"],
      referencedTableName: "role",
      onDelete: "CASCADE",
      onUpdate: "RESTRICT",
    }),
  ],
});

export const user_table = new Table({
  name: "user",
  columns: [
    { name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
    { name: "mail", ...getTypeByORM("varchar"), isUnique: true },
    { name: "username", ...getTypeByORM("varchar"), isUnique: true },
    { name: "firstname", ...getTypeByORM("varchar") },
    { name: "lastname", ...getTypeByORM("varchar") },
    { name: "secret", ...getTypeByORM("varchar") },
    { name: "static", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) },
    { name: "isOwner", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) },
  ],
});

export const user_roles_table = new Table({
  name: "user_roles",
  columns: [
    { name: "userId", ...getTypeByORM("uuid"), isPrimary: true },
    { name: "roleId", ...getTypeByORM("int"), isPrimary: true },
  ],
  foreignKeys: [
    new TableForeignKey({
      columnNames: ["userId"],
      referencedColumnNames: ["id"],
      referencedTableName: "user",
      onDelete: "CASCADE",
      onUpdate: "RESTRICT",
    }),
    new TableForeignKey({
      columnNames: ["roleId"],
      referencedColumnNames: ["id"],
      referencedTableName: "role",
      onDelete: "CASCADE",
      onUpdate: "RESTRICT",
    }),
  ],
});

export const user_permission_table = new Table({
  name: "user_permission",
  columns: [
    { name: "userId", ...getTypeByORM("uuid"), isPrimary: true },
    { name: "permission", ...getTypeByORM("varchar"), isPrimary: true },
  ],
  foreignKeys: [
    new TableForeignKey({
      columnNames: ["userId"],
      referencedColumnNames: ["id"],
      referencedTableName: "user",
      onDelete: "CASCADE",
      onUpdate: "RESTRICT",
    }),
  ],
});

export const refresh_table = new Table({
  name: "refresh",
  columns: [
    { name: "token", ...getTypeByORM("varchar"), isPrimary: true },
    { name: "expiry", ...getTypeByORM("datetime", false, 6) },
    { name: "userId", ...getTypeByORM("uuid"), isPrimary: true },
  ],
  foreignKeys: [
    new TableForeignKey({
      columnNames: ["userId"],
      referencedColumnNames: ["id"],
      referencedTableName: "user",
      onDelete: "CASCADE",
      onUpdate: "RESTRICT",
    }),
  ],
});

export const webapi_table = new Table({
  name: "webapi",
  columns: [
    { name: "id", ...getTypeByORM("int"), ...isIncrementPrimary },
    { name: "token", ...getTypeByORM("varchar"), isUnique: true },
    { name: "title", ...getTypeByORM("varchar"), isUnique: true },
    { name: "createdAt", ...getTypeByORM("datetime", false, 6), default: getDefaultByORM("currentTimestamp", 6) },
    { name: "lastUsage", ...getTypeByORM("datetime", true, 6), default: getDefaultByORM("null") },
    { name: "expiry", ...getTypeByORM("date", true), default: getDefaultByORM("null") },
  ],
});

export const webapi_permission_table = new Table({
  name: "webapi_permission",
  columns: [
    { name: "webapiId", ...getTypeByORM("int"), isPrimary: true },
    { name: "permission", ...getTypeByORM("varchar"), isPrimary: true },
  ],
  foreignKeys: [
    new TableForeignKey({
      columnNames: ["webapiId"],
      referencedColumnNames: ["id"],
      referencedTableName: "webapi",
      onDelete: "CASCADE",
      onUpdate: "RESTRICT",
    }),
  ],
});

export const reset_table = new Table({
  name: "reset",
  columns: [
    { name: "mail", ...getTypeByORM("varchar"), isPrimary: true },
    { name: "token", ...getTypeByORM("varchar") },
    { name: "username", ...getTypeByORM("varchar") },
    { name: "secret", ...getTypeByORM("varchar") },
  ],
});

export const setting_table = new Table({
  name: "setting",
  columns: [
    { name: "topic", ...getTypeByORM("varchar"), isPrimary: true },
    { name: "key", ...getTypeByORM("varchar"), isPrimary: true },
    { name: "value", ...getTypeByORM("text") },
  ],
});