/* eslint-disable no-console */

import { Company } from '@/modules/company/company.model';
import { Types } from 'mongoose';
import { CompanyType } from '@/shared/constants/enum.constant';
import {
  addOrUpdatePermission,
  getSeedPermissionsForCompanyType,
} from '@/modules/permissions/permissions.service';
import { Role } from '@/modules/roles/roles.model';

export const updateAllCompanySeedPermissions = async (): Promise<void> => {
  const companies = await Company.find({
    companyType: { $ne: CompanyType.SUPERADMIN },
  });

  if (!companies || companies.length === 0) {
    console.warn('⚠️ No companies found');
    return;
  }

  const updatePromises = companies.map(async (company) => {
    try {
      const role = await Role.findOne({ company: company._id });
      if (!role) {
        console.warn(`⚠️ No role found for company: ${company.name}`);
        return;
      }

      const allPermissions = getSeedPermissionsForCompanyType(
        company.companyType,
      );

      await addOrUpdatePermission(
        company._id as Types.ObjectId,
        role._id as Types.ObjectId,
        allPermissions.map((group) => ({
          group: group.group,
          groupAccess: group.groupAccess,
          permissions: group.permissions,
        })),
      );
    } catch (err) {
      console.error(
        `❌ Failed to update permissions for company ${company.name}:`,
        err,
      );
    }
  });
  console.log('✅ Permissions updated for companies');

  await Promise.all(updatePromises);
};
