import { Injectable } from '@nestjs/common';
import { CreateDocumentDto } from './dto/create-document.dto';
import { UpdateDocumentDto } from './dto/update-document.dto';
import { InjectRepository } from '@nestjs/typeorm';
import { Document } from './entities/document.entity';
import { Repository } from 'typeorm';
import * as fs from 'fs';
import * as path from 'path';

@Injectable()
export class DocumentsService {

  constructor(
    @InjectRepository(Document)
    private documentRepository: Repository<Document>
  ){}

  async create(createDocumentDto: CreateDocumentDto[]) {

    // Lire le fichier
    const jsonData = JSON.parse(
      fs.readFileSync('public/amplitude_docs/files.json', 'utf8'),
    );

    const files: {typeDocId: number, path: string}[] = jsonData.files;
    
    let inserted = 0;

    for (const filePath of files) {
      // Vérifier si le document existe déjà (évite doublons)
      const exist = await this.documentRepository.findOne({
        where: { path: filePath.path },
      });

      if (!exist) {
        const fileName = path.basename(filePath.path);
    
        await this.documentRepository.save({
          typedocument: {id: filePath.typeDocId},
          path: filePath.path,
          libelle: fileName
        });
        inserted++;
      }
    }

    return {
      message: `Import terminé`,
      totalInserted: inserted,
    };
  
    
    return await this.documentRepository.save(createDocumentDto);
    
  }

  async findAll() {
    const documents = await this.documentRepository.find();
        return documents;
  }

  async findByParams(filters: {
  typeDocument?: string;
  dateComptable?: string;
  codeAgence?: string;
  devise?: string;
  numeroCompte?: string;
  cleCompte?: string;
}) {

  const query = this.documentRepository.createQueryBuilder('document')
          .leftJoinAndSelect('document.typedocument', 'typedocument');

  if (filters.typeDocument) {
    query.andWhere('document.typedocument = :typeDocument', {
      typeDocument: filters.typeDocument,
    });
  }

  if (filters.dateComptable) {
    query.andWhere('document.date_comptable = :dateComptable', {
      dateComptable: filters.dateComptable,
    });
  }

  if (filters.codeAgence) {
    query.andWhere('document.code_agence = :codeAgence', {
      codeAgence: filters.codeAgence,
    });
  }

  if (filters.devise) {
    query.andWhere('document.devise = :devise', {
      devise: filters.devise,
    });
  }

  if (filters.numeroCompte) {
    query.andWhere('document.numero_compte = :numeroCompte', {
      numeroCompte: filters.numeroCompte,
    });
  }

  if (filters.cleCompte) {
    query.andWhere('document.cle_compte = :cleCompte', {
      cleCompte: filters.cleCompte,
    });
  }

  return query.getMany();
}

  findOne(id: number) {
    return `This action returns a #${id} document`;
  }

  update(id: number, updateDocumentDto: UpdateDocumentDto) {
    return `This action updates a #${id} document`;
  }

  remove(id: number) {
    return `This action removes a #${id} document`;
  }
}
