import type { IUserRepository } from '../domain/ports/user-repository'
import type { IRefreshTokenRepository } from '../domain/ports/refresh-token-repository'
import type { IPasswordHasher } from '../domain/ports/password-hasher'
import type { ITokenService } from '../domain/ports/token-service'
import { getPrisma } from './db/prisma'
import { PrismaUserRepository } from './repositories/prisma-user-repository'
import { PrismaRefreshTokenRepository } from './repositories/prisma-refresh-token-repository'
import { ArgonHasher } from './services/argon-hasher'
import { JwtService } from './services/jwt-service'
import type { Env } from './config/env'

export interface Container {
  userRepo: IUserRepository
  refreshTokenRepo: IRefreshTokenRepository
  passwordHasher: IPasswordHasher
  tokenService: ITokenService
}

export function createContainer(env: Env): Container {
  const db = getPrisma()
  return {
    userRepo: new PrismaUserRepository(db),
    refreshTokenRepo: new PrismaRefreshTokenRepository(db),
    passwordHasher: new ArgonHasher(),
    tokenService: new JwtService(env),
  }
}
