import { Injectable } from '@nestjs/common';
import { CreateMultiFileUploadDto } from './dto/create-multi-file-upload.dto';
import { UpdateMultiFileUploadDto } from './dto/update-multi-file-upload.dto';
import { InjectRepository } from '@nestjs/typeorm';
import { MultiFileUploadEntity } from './entities/multi-file-upload.entity';
import { Repository } from 'typeorm';
import { MultiFileUploadRepository } from './multi-file-upload.repository';
import { CreatePortfolioImageDto } from './dto/create-portfolio-image.dto';
import { Image } from './entities/portfolio-image.entity';
import { UpdatePortfolioImageDto } from './dto/update-portfolio-image.dto';

@Injectable()
export class MultiFileUploadService {
  constructor(
    @InjectRepository(MultiFileUploadEntity)
    private readonly multiFileUpload: Repository<MultiFileUploadEntity>,
    private readonly multiFileUploadRepo: MultiFileUploadRepository,
    @InjectRepository(Image)
    private readonly portfolioImageRepository: Repository<Image>,
  ) {}

  async create(
    createMultiFileUploadDto: CreateMultiFileUploadDto,
    CreatePortfolioImageDto: CreatePortfolioImageDto,
  ): Promise<Image[]> {
    const createMultiFile: MultiFileUploadEntity = new MultiFileUploadEntity();

    Object.assign(createMultiFile, createMultiFileUploadDto);

    const saveData = await this.multiFileUpload.save(createMultiFile);

    const portfolio = await this.multiFileUpload.findOneBy({
      id: createMultiFile.id,
    });

    const portfolioImages: Image[] = [];

    for (const attachment of CreatePortfolioImageDto.portfolio_images) {
      const portfolioImage: Image = new Image();
      portfolioImage.portfolio_images = attachment;
      portfolioImage.portfolio = portfolio; // Set the portfolio association

      const savedImage = await this.portfolioImageRepository.save(
        portfolioImage,
      );

      portfolioImages.push(savedImage);
    }

    return portfolioImages;
  }

  async update(
    id: string,
    updateMultiFileUploadDto: UpdateMultiFileUploadDto,
    updatePortfolioImageDto: UpdatePortfolioImageDto,
  ): Promise<Image[]> {
    const updateFiles = await this.multiFileUpload.findOneBy({ id });

    Object.assign(updateFiles, updateMultiFileUploadDto);

    const updateMultiFileUpload = await this.multiFileUpload.save(updateFiles);

    const updatedPortfolioImages: Image[] = [];

    if (updatePortfolioImageDto) {
      // Loop through the updated images in updatePortfolioImageDto
      for (const attachment of updatePortfolioImageDto.portfolio_images) {
        if (attachment) {
          const portfolioImage: Image = new Image();
          portfolioImage.portfolio_images = attachment;
          portfolioImage.portfolio = updateMultiFileUpload; // Set the portfolio association

          // Save the updated image
          const savedImage = await this.portfolioImageRepository.save(
            portfolioImage,
          );

          updatedPortfolioImages.push(savedImage);
        }
      }
    }

    // Return the array of updated portfolio images
    return updatedPortfolioImages;
  }

  // While deleting user or any data using api then use softDelete instead of delete when there is separate column named deleted_at
  remove(id: string) {
    return this.multiFileUpload.softDelete(id);
  }

  findAll() {
    return this.multiFileUploadRepo.findAll();
  }

  findOne(id: string) {
    return this.multiFileUploadRepo.findOne(id);
  }
}
