import 'dotenv/config';
import { PrismaPg } from '@prisma/adapter-pg';
import { PrismaClient } from '../src/generated/prisma/client';
import { seedEscalates } from './seeds/escalate.seed';
import { seedCommentTypes } from './seeds/comment-type.seed';
import { seedIssueStatuses } from './seeds/issue-status.seed';
import { seedIndicators } from './seeds/indicator.seed';
import { seedMeetingSummaryStatuses } from './seeds/meeting-summary-status';
import { seedPermissions } from './seeds/permission.seed';
import { seedRoles } from './seeds/role.seed';
import { seedStakeholders } from './seeds/stakeholder.seed';
import { seedUsers } from './seeds/user.seed';
import { seedMeetingRequests } from './seeds/meeting-request.seed';
import { seedMeetings } from './seeds/meeting.seed';
import { seedWorkingGroupIssues } from './seeds/working-group-issue.seed';

async function main() {
  const connectionString = process.env.DATABASE_URL;

  if (!connectionString) {
    throw new Error('DATABASE_URL is missing in .env');
  }

  const adapter = new PrismaPg({ connectionString });
  const prisma = new PrismaClient({ adapter });

  try {
    const roleSeed = await seedRoles(prisma);
    const permissionSeed = await seedPermissions(prisma, roleSeed.rolesByName);
    const userSeed = await seedUsers(prisma, roleSeed.rolesByName);
    const stakeholderSeed = await seedStakeholders(prisma, userSeed);
    const issueStatusSeed = await seedIssueStatuses(
      prisma,
      userSeed.ownerUserId,
    );
    const indicatorSeed = await seedIndicators(prisma);
    const escalateSeed = await seedEscalates(prisma, userSeed.ownerUserId);
    const meetingSummaryStatusSeed = await seedMeetingSummaryStatuses(prisma);
    const workingGroupIssueSeed = await seedWorkingGroupIssues(
      prisma,
      userSeed,
    );
    const meetingRequestSeed = await seedMeetingRequests(prisma, userSeed);
    const meetingSeed = await seedMeetings(
      prisma,
      userSeed,
      meetingSummaryStatusSeed.statusIdByCode,
    );
    const commentTypeSeed = await seedCommentTypes(prisma);

    console.log(`\nDefault roles: ${roleSeed.roleNames.join(', ')}`);
    console.log(
      `Default stakeholder types: ${stakeholderSeed.stakeholderTypeNames.join(', ')}`,
    );
    console.log(
      `Default stakeholders: ${stakeholderSeed.stakeholderNames.join(', ') || 'none'}`,
    );
    console.log(
      `Default issue statuses: ${issueStatusSeed.statusNames.join(', ')}`,
    );
    console.log(
      `Default issue categories: ${issueStatusSeed.categoryNames.join(', ')}`,
    );
    console.log(
      `Default indicators: ${indicatorSeed.indicatorNames.join(', ')}`,
    );
    console.log(
      `Default escalation targets: ${escalateSeed.escalateNames.join(', ')}`,
    );
    console.log(
      `Default meeting summary statuses: ${meetingSummaryStatusSeed.statusCodes.join(', ')}`,
    );
    console.log(
      `Seeded ${workingGroupIssueSeed.seededTitles.length} working group issues.`,
    );
    console.log(
      `Seeded ${meetingRequestSeed.seededTitles.length} meeting requests.`,
    );
    console.log(
      `Seeded ${meetingSeed.seededMeetings} meetings and ${meetingSeed.seededSummaries} meeting summaries.`,
    );
    console.log(
      `Default comment types: ${commentTypeSeed.commentTypeNames.join(', ')}`,
    );
    console.log(
      `Seeded ${permissionSeed.permissionCount} standard permissions for the role matrix.`,
    );
    console.log(
      `Role "${permissionSeed.superAdminRole}" -> "${permissionSeed.superAdminPermission}" (full access). Assign standard permissions to other roles via the API.`,
    );
  } finally {
    await prisma.$disconnect();
  }
}

main().catch((err) => {
  console.error(err);
  process.exit(1);
});
