import { Document, Types } from 'mongoose';
import { IPaginateModel } from '@/shared/interfaces/model.interface';
import { AuditFields } from '@/shared/types/common';
import { ACTIONS } from '@/shared/constants';

export type PermissionAction = (typeof ACTIONS)[keyof typeof ACTIONS];

export type GroupAccessType = 'No Access' | 'Full Access' | 'Partial Access';

export interface IModulePermission {
  id: string;
  key: string;
  moduleName: string;
  access?: PermissionAction[] | GroupAccessType;
}

export interface NewPermissionGroup
  extends Partial<Pick<AuditFields, 'createdBy' | 'updatedBy'>> {
  group: string;
  groupAccess: GroupAccessType;
  permissions: IModulePermission[];
}

export interface IPermissionBase {
  name: string;
  description: string;
  group: string;
  groupAccess: GroupAccessType;
  permissions: IModulePermission[];
  company: Types.ObjectId;
  inherited: boolean
}

export interface IPermission extends IPermissionBase, AuditFields {}

export interface IPermissionDoc extends IPermission, Document {}

export interface IPermissionModel extends IPaginateModel<IPermissionDoc> {
  isPermissionNameTaken(name: string): Promise<boolean>;
}

export type NewCreatedPermission = NewPermissionGroup[];
