import { Schema, model } from 'mongoose';

import {
  IPermissionDoc,
  IPermissionModel,
} from '@/modules/permissions/permissions.interface.js';
import { paginate, toJSON } from '@/shared/utils/plugins/index.js';
import { PermissionAction } from '@/shared/constants/enum.constant';

const validateActions = (value: string): boolean =>
  value === 'No Access' ||
  value === 'Full Access' ||
  value === 'Partial Access' ||
  (Array.isArray(value) && value.every((v) => PermissionAction.includes(v)));

const ChildPermissionSchema = new Schema(
  {
    id: { type: String, required: true },
    key: { type: String, required: true },
    moduleName: { type: String, required: true },
    access: {
      type: Schema.Types.Mixed,
      required: true,
      validate: [validateActions, 'Invalid access format'],
    },
  },
  { _id: false },
);

// ✅ Main permission schema
const permissionSchema = new Schema<IPermissionDoc>(
  {
    group: { type: String, required: true },
    groupAccess: {
      type: Schema.Types.Mixed,
      required: true,
      validate: [validateActions, 'Invalid group access format'],
    },
    permissions: { type: [ChildPermissionSchema], default: [] },

    createdBy: { type: Schema.Types.ObjectId, ref: 'User' },
    updatedBy: { type: Schema.Types.ObjectId, ref: 'User' },
    company: { type: Schema.Types.ObjectId, ref: 'Company' },
    inherited: { type: Boolean, default: false },

  },
  {
    timestamps: true,
  },
);

// Plugins
permissionSchema.plugin(toJSON);
permissionSchema.plugin(paginate);

// Model export
export const Permissions = model<IPermissionDoc, IPermissionModel>(
  'Permission',
  permissionSchema,
);
