/**
 * @fileoverview Project mapper
 *
 * Maps between DeepSource API models and domain Project aggregates.
 */

import { Project } from '../../domain/aggregates/project/project.aggregate.js';
import { DeepSourceProject } from '../../models/projects.js';
import {
  ProjectRepository,
  ProjectStatus,
  VcsProvider,
  ProjectConfiguration,
} from '../../domain/aggregates/project/project.types.js';

/**
 * Maps a DeepSource API project to a domain Project aggregate
 *
 * @param apiProject - The API project model
 * @returns The domain Project aggregate
 */
export function mapProjectToDomain(apiProject: DeepSourceProject): Project {
  const repository: ProjectRepository = {
    url: apiProject.repository.url,
    provider: apiProject.repository.provider as VcsProvider,
    login: apiProject.repository.login,
    isPrivate: apiProject.repository.isPrivate,
  };

  // Determine status based on activation
  const status: ProjectStatus = apiProject.repository.isActivated ? 'ACTIVE' : 'INACTIVE';

  return Project.fromPersistence({
    key: apiProject.key,
    name: apiProject.name,
    repository,
    configuration: {
      isActivated: apiProject.repository.isActivated,
      autoFix: false, // Default, as not provided by API
      pullRequestIntegration: true, // Default, as not provided by API
      issueReporting: true, // Default, as not provided by API
    },
    status,
    createdAt: new Date(), // Not provided by API, use current date
    updatedAt: new Date(), // Not provided by API, use current date
  });
}

/**
 * Maps a domain Project aggregate to persistence format
 *
 * @param project - The domain Project aggregate
 * @returns The persistence model
 */
export function mapProjectToPersistence(project: Project): {
  key: string;
  name: string;
  repository: ProjectRepository;
  configuration: ProjectConfiguration;
  status: ProjectStatus;
  createdAt: Date;
  updatedAt: Date;
} {
  return project.toPersistence();
}

/**
 * Maps multiple API projects to domain aggregates
 *
 * @param apiProjects - Array of API project models
 * @returns Array of domain Project aggregates
 */
export function mapProjectsToDomainList(apiProjects: DeepSourceProject[]): Project[] {
  return apiProjects.map((project) => mapProjectToDomain(project));
}

// For backward compatibility, export a namespace with the old static methods
export const ProjectMapper = {
  toDomain: mapProjectToDomain,
  toPersistence: mapProjectToPersistence,
  toDomainList: mapProjectsToDomainList,
};
