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 { BackendPaginatedData, PaginationQueryParams } from "@/shared/types";

export interface CompanyRepository {
  findAll(params: PaginationQueryParams): Promise<BackendPaginatedData<Company>>;
  findById(id: number): Promise<CompanyDetail>;
  create(data: CreateCompanyPayload): Promise<CompanyDetail>;
  update(id: number, data: UpdateCompanyPayload): Promise<CompanyDetail>;
  delete(id: number): Promise<void>;
  restore(id: number): Promise<void>;
  impersonate(id: number): Promise<{ token: string }>;
  generateMcpToken(id: number, payload?: GenerateMcpTokenPayload): Promise<McpTokenResult>;
  listMcpTokens(id: number): Promise<McpCredential[]>;
  revokeMcpToken(id: number, credentialId: number): Promise<void>;
  toggleStatus(id: number): Promise<CompanyAccessToggleResult>;
  toggleTest(id: number): Promise<CompanyTestToggleResult>;
  toggleRefacturation(id: number): Promise<CompanyRefacturationToggleResult>;
  toggleAiAgents(id: number): Promise<CompanyAiAgentsToggleResult>;
  getStats(): Promise<CompanyStats>;
  lookup(siret: string): Promise<CompanyLookupResult>;
  getOptions(): Promise<CompanyOption[]>;
  /** Dormant free accounts (freemium spec 6.4): told, closed, restored. */
  findDormantAccounts(params: PaginationQueryParams): Promise<DormantAccountsData>;
  /** Restores a closed account; the id is a companies.id. */
  restoreDormantAccount(companyId: number): Promise<void>;
}
