import { BadRequestException, Injectable } from '@nestjs/common';
import type {
  CreatePortfolioTransactionDto,
  UpdatePortfolioTransactionDto,
} from './dto/portfolio-transaction.dto';
import type { CreatePortfolioDto, UpdatePortfolioDto } from './dto/portfolio.dto';
import { PortfolioRepository } from './portfolio.repository';

@Injectable()
export class PortfolioService {
  constructor(private readonly repository: PortfolioRepository) {}

  list(ownerId: string) {
    return this.repository.list(ownerId);
  }

  create(ownerId: string, input: CreatePortfolioDto) {
    return this.repository.create(ownerId, input);
  }

  update(ownerId: string, id: string, input: UpdatePortfolioDto) {
    return this.repository.update(ownerId, id, input);
  }

  delete(ownerId: string, id: string) {
    return this.repository.delete(ownerId, id);
  }

  listTransactions(ownerId: string, portfolioId: string) {
    return this.repository.listTransactions(ownerId, portfolioId);
  }

  createTransaction(ownerId: string, portfolioId: string, input: CreatePortfolioTransactionDto) {
    this.validateTransaction(input);
    return this.repository.createTransaction(ownerId, portfolioId, input);
  }

  updateTransaction(ownerId: string, id: string, input: UpdatePortfolioTransactionDto) {
    return this.repository.updateTransaction(ownerId, id, input);
  }

  deleteTransaction(ownerId: string, id: string) {
    return this.repository.deleteTransaction(ownerId, id);
  }

  private validateTransaction(input: CreatePortfolioTransactionDto): void {
    if (input.type === 'deposit' || input.type === 'withdrawal') {
      if (!input.cashAmount || !input.cashCurrency) {
        throw new BadRequestException('Cash transactions require cashAmount and cashCurrency.');
      }
      return;
    }

    if (!input.asset || !input.qty || !input.price || !input.currency) {
      throw new BadRequestException('Coin transactions require asset, qty, price and currency.');
    }
  }
}
