import type { Company, CompanyAccessToggleResult, CompanyDetail, CompanyLookupResult, CompanyOption, CompanyAiAgentsToggleResult, CompanyRefacturationToggleResult, CompanyStats, CompanyTestToggleResult, CreateCompanyPayload, UpdateCompanyPayload, DormantAccountsData } from "@/domain/entities/company";
import type { GenerateMcpTokenPayload, McpCredential, McpTokenResult } from "@/domain/entities/mcp-token";
import type { CompanyRepository } from "@/domain/repositories/company.repository";
import type { BackendPaginatedData, PaginationQueryParams } from "@/shared/types";
import { api } from "@/infrastructure/api/api-client";

export class CompanyRepositoryImpl implements CompanyRepository {
  findAll(params: PaginationQueryParams) {
    return api.get<BackendPaginatedData<Company>>("/companies", { params });
  }

  findById(id: number) {
    return api.get<CompanyDetail>(`/companies/${id}`);
  }

  create(payload: CreateCompanyPayload) {
    return api.post<CompanyDetail>("/companies", payload);
  }

  update(id: number, payload: UpdateCompanyPayload) {
    return api.put<CompanyDetail>(`/companies/${id}`, payload);
  }

  delete(id: number) {
    return api.delete(`/companies/${id}`);
  }

  restore(id: number) {
    return api.post<void>(`/companies/${id}/restore`);
  }

  impersonate(id: number) {
    return api.post<{ token: string }>(`/companies/${id}/impersonate`);
  }

  generateMcpToken(id: number, payload?: GenerateMcpTokenPayload) {
    return api.post<McpTokenResult>(`/companies/${id}/mcp-token`, payload);
  }

  listMcpTokens(id: number) {
    return api.get<McpCredential[]>(`/companies/${id}/mcp-tokens`);
  }

  revokeMcpToken(id: number, credentialId: number) {
    return api.delete(`/companies/${id}/mcp-tokens/${credentialId}`);
  }

  toggleStatus(id: number) {
    return api.post<CompanyAccessToggleResult>(`/companies/${id}/toggle-status`);
  }

  toggleTest(id: number) {
    return api.post<CompanyTestToggleResult>(`/companies/${id}/toggle-test`);
  }

  toggleRefacturation(id: number) {
    return api.post<CompanyRefacturationToggleResult>(`/companies/${id}/toggle-refacturation`);
  }

  toggleAiAgents(id: number) {
    return api.post<CompanyAiAgentsToggleResult>(`/companies/${id}/toggle-ai-agents`);
  }

  getStats() {
    return api.get<CompanyStats>("/companies/stats");
  }

  lookup(siret: string) {
    return api.get<CompanyLookupResult>("/company-lookup", { params: { siret } });
  }

  getOptions() {
    return api.get<CompanyOption[]>("/companies/options");
  }

  findDormantAccounts(params: PaginationQueryParams) {
    return api.get<DormantAccountsData>("/dormant-accounts", { params });
  }

  restoreDormantAccount(companyId: number) {
    return api.post<void>(`/dormant-accounts/${companyId}/restore`);
  }
}
