import { Injectable } from '@nestjs/common';

type UnspamRequestParams = {
  viewcont?: string;
  start?: string;
  end?: string;
};

type MailLogParams = {
  startdate?: string;
  enddate?: string;
  type?: string;
  status?: string;
  fromaddr?: string;
  toaddr?: string;
  subject?: string;
  ipaddr?: string;
  page?: string;
  linenum?: string;
};

@Injectable()
export class EverdigmMailClient {
  private readonly baseUrl =
    process.env.EVERDIGM_MAIL_API_BASE_URL?.trim().replace(/\/+$/, '') ||
    'http://api:3001';

  async fetchUnspamRequests(params: UnspamRequestParams): Promise<unknown> {
    const url = new URL('/everdigm-mail/unspam-requests', this.baseUrl);
    const search = new URLSearchParams();

    if (params.viewcont) search.set('viewcont', params.viewcont);
    if (params.start) search.set('start', params.start);
    if (params.end) search.set('end', params.end);

    url.search = search.toString();

    const response = await fetch(url, { method: 'GET' });
    const text = await response.text();
    let payload: unknown = text;
    try {
      payload = text ? JSON.parse(text) : null;
    } catch {
      payload = text;
    }

    if (!response.ok) {
      throw new Error(`Everdigm mail API failed (${response.status}): ${text}`);
    }

    return payload;
  }

  async fetchSpamDetail(mid: string): Promise<unknown> {
    const normalizedMid = mid.trim();
    if (!normalizedMid) {
      throw new Error('mid is required');
    }

    const url = new URL(`/everdigm-mail/spam/${encodeURIComponent(normalizedMid)}`, this.baseUrl);
    const response = await fetch(url, { method: 'GET' });
    const text = await response.text();
    let payload: unknown = text;
    try {
      payload = text ? JSON.parse(text) : null;
    } catch {
      payload = text;
    }

    if (!response.ok) {
      throw new Error(`Everdigm mail API failed (${response.status}): ${text}`);
    }

    return payload;
  }

  async submitSpamAction(params: {
    mode?: string;
    action?: string;
    mids: string;
    isspamdb?: string;
  }): Promise<unknown> {
    const modeValue = (params.mode ?? params.action ?? '').trim();
    if (!modeValue) {
      throw new Error('mode/action is required');
    }
    const midsValue = params.mids.trim();
    if (!midsValue) {
      throw new Error('mids is required');
    }

    const url = new URL('/everdigm-mail/spam/action', this.baseUrl);
    const body: Record<string, string> = {
      mode: modeValue,
      mids: midsValue,
    };
    if (params.isspamdb !== undefined) {
      body.isspamdb = params.isspamdb;
    }

    const response = await fetch(url, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(body),
    });
    const text = await response.text();
    let payload: unknown = text;
    try {
      payload = text ? JSON.parse(text) : null;
    } catch {
      payload = text;
    }

    if (!response.ok) {
      throw new Error(`Everdigm mail API failed (${response.status}): ${text}`);
    }

    return payload;
  }

  async fetchMailLogs(params: MailLogParams): Promise<unknown> {
    const url = new URL('/everdigm-mail/mail-logs', this.baseUrl);
    const search = new URLSearchParams();

    if (params.startdate) search.set('startdate', params.startdate);
    if (params.enddate) search.set('enddate', params.enddate);
    if (params.type) search.set('type', params.type);
    if (params.status) search.set('status', params.status);
    if (params.fromaddr) search.set('fromaddr', params.fromaddr);
    if (params.toaddr) search.set('toaddr', params.toaddr);
    if (params.subject) search.set('subject', params.subject);
    if (params.ipaddr) search.set('ipaddr', params.ipaddr);
    if (params.page) search.set('page', params.page);
    if (params.linenum) search.set('linenum', params.linenum);

    url.search = search.toString();

    const response = await fetch(url, { method: 'GET' });
    const text = await response.text();
    let payload: unknown = text;
    try {
      payload = text ? JSON.parse(text) : null;
    } catch {
      payload = text;
    }

    if (!response.ok) {
      throw new Error(`Everdigm mail API failed (${response.status}): ${text}`);
    }

    return payload;
  }
}
