import { ExcelService } from '@lib/excel/src';
import { Injectable } from '@nestjs/common';
import { Response } from 'express';
import { EnrollDto, GetCommonUserListDto } from './user.dto';
import { UserRepository } from './user.repository';
import { maskString } from '@api/helpers/mask.helper';

@Injectable()
export class UserService {
  constructor(
    private userRepository: UserRepository,
    private excelService: ExcelService,
  ) {}

  /** 고객목록 */
  async getUserList(dto: GetCommonUserListDto) {
    const where = await this.userRepository.whereClause(dto);
    const orderBy = await this.userRepository.orderByClause(dto);

    const list = await this.userRepository.getList(
      where,
      orderBy,
      dto.page,
      false,
      dto.limit,
    );

    const count = await this.userRepository.count(where);

    return {
      count,
      list,
    };
  }

  /** 고객 목록 엑셀다운로드 */
  async downloadUserList(
    dto: GetCommonUserListDto,
    res: Response,
    role: string,
  ) {
    const where = await this.userRepository.whereClause(dto);
    const orderBy = await this.userRepository.orderByClause(dto);
    const data: any = await this.userRepository.getList(
      where,
      orderBy,
      dto.page,
      true,
    );

    const dataGenerator: any =
      role === 'sales'
        ? data.map((e) => ({
            ...e,
            user: {
              usrId: e.user.usrId,
              usrName: e.user.usrName ? maskString('name', e.user.usrName) : '',
              usrPhone: e.user.usrPhone
                ? maskString('phone', e.user.usrPhone)
                : '',
              usrBirth: e.user.usrBirth
                ? maskString('birth', e.user.usrBirth)
                : '',
              usrCreatedAt: e.user.usrCreatedAt,
            },
            member: {
              memId: e.member.memId,
              memLoginId: e.member.memLoginId,
              memName: e.member.memName
                ? maskString('name', e.member.memName)
                : '',
              memAgency: e.member.memAgency,
              memType: e.member.memType,
            },
          }))
        : data;

    const columns = this.buildUserExcelColumns(role);
    await this.excelService.generate(res, '목록', { dataGenerator, columns });
  }

  /** 고객 저장여부확인 */
  async enroll(dto: EnrollDto) {
    const doesExist = await this.userRepository.doexExist(dto);
    if (!doesExist) {
      const newUser = await this.userRepository.create(dto);
      return newUser;
    }
    return doesExist.usrId;
  }

  //*--------------------------------------------- excel ---------------------------------------------//
  /** 엑셀 다운로드 컬럼 */
  buildUserExcelColumns(role: string): { header: string; key: string }[] {
    if (role === 'sales') {
      return [
        { header: '영업채널명', key: 'salesAgencyChannel.sacName' },
        { header: '회원타입', key: 'member.memType' },
        { header: '기업명', key: 'agency.agcCorporateName' },
        { header: '회원아이디', key: 'member.memLoginId' },
        { header: '회원명', key: 'member.memName' },
        { header: '고객명', key: 'user.usrName' },
        { header: '고객연락처', key: 'user.usrPhone' },
        { header: '고객생년월일', key: 'user.usrBirth' },
        { header: '등록일', key: 'user.usrCreatedAt' },
      ];
    } else {
      return [
        { header: '영업대리점명', key: 'salesAgency.sagName' },
        { header: '영업채널명', key: 'salesAgencyChannel.sacName' },
        { header: '회원타입', key: 'member.memType' },
        { header: '기업명', key: 'agency.agcCorporateName' },
        { header: '회원아이디', key: 'member.memLoginId' },
        { header: '회원명', key: 'member.memName' },
        { header: '고객명', key: 'user.usrName' },
        { header: '고객연락처', key: 'user.usrPhone' },
        { header: '고객생년월일', key: 'user.usrBirth' },
        { header: '등록일', key: 'user.usrCreatedAt' },
      ];
    }
  }
}
