import {
  Client,
  Employee,
  Project,
  ProjectInternalStatus,
  ProjectMember,
  ProjectStatus,
  TaskStage,
} from '@prisma/client';
import { pickDeliveryRules } from '../lib/deliveryRules';
import { projectRoleFromDb } from '../lib/roles';

const statusFromDb: Record<ProjectStatus, string> = {
  Active: 'Active',
  OnHold: 'On Hold',
  Completed: 'Completed',
};

const stageFromDb: Record<TaskStage, string> = {
  Backlog: 'Inbox',
  InProgress: 'In Progress',
  CodeReviewQA: 'Code Review & QA',
  Done: 'Done',
};

type ProjectFull = Project & {
  members: (ProjectMember & { employee?: Pick<Employee, 'id' | 'name' | 'code'> })[];
  internalStatuses: ProjectInternalStatus[];
  admin?: Pick<Employee, 'id' | 'name' | 'code'>;
  client?: Pick<Client, 'id' | 'code' | 'name'> | null;
  _count?: { tasks: number };
};

export function serializeProject(p: ProjectFull) {
  return {
    id: p.id,
    code: p.code,
    humanCode: p.humanCode,
    name: p.name,
    description: p.description,
    startDate: p.startDate ? p.startDate.toISOString().slice(0, 10) : null,
    endDate: p.endDate ? p.endDate.toISOString().slice(0, 10) : null,
    adminId: p.adminId,
    admin: p.admin
      ? { id: p.admin.id, name: p.admin.name, code: p.admin.code }
      : undefined,
    status: statusFromDb[p.status],
    color: p.color,
    tags: p.tags,
    clientId: p.clientId,
    client: p.client
      ? { id: p.client.id, code: p.client.code, name: p.client.name }
      : null,
    ...pickDeliveryRules(p),
    members: p.members.map((m) => ({
      id: m.id,
      employeeId: m.employeeId,
      projectRole: projectRoleFromDb(m.projectRole),
      employee: m.employee
        ? { id: m.employee.id, name: m.employee.name, code: m.employee.code }
        : undefined,
    })),
    internalStatuses: p.internalStatuses
      .slice()
      .sort((a, b) => a.sortOrder - b.sortOrder)
      .map((s) => ({
        id: s.id,
        text: s.text,
        color: s.color,
        stage: stageFromDb[s.stage],
        active: s.active,
        sortOrder: s.sortOrder,
      })),
    taskCount: p._count?.tasks,
    createdAt: p.createdAt.toISOString(),
    updatedAt: p.updatedAt.toISOString(),
  };
}
