import type { AlqoveClient } from '../client';
import type { PaginationMeta, PaginationLinks } from './returns';
import type { Review, PaginatedReviewsResponse } from './reviews';

export type ReportReason =
  | 'inappropriate'
  | 'spam'
  | 'not_about_purchase'
  | 'personal_info'
  | 'other';

export type ReviewReportState = 'open' | 'resolved';
export type ReviewAdminAction = 'keep' | 'hide';

export interface ReviewReportNestedReview {
  id: string;
  store_id: string;
  store_name: string;
  reviewer_name: string;
  rating: number;
  title: string | null;
  body: string;
  state: 'visible' | 'hidden';
  created_at: string;
}

export interface ReviewReport {
  id: string;
  review_id: string;
  reason: ReportReason;
  reason_text: string | null;
  state: ReviewReportState;
  action: ReviewAdminAction | null;
  resolution_note: string | null;
  resolved_at: string | null;
  created_at: string;
  updated_at: string;
  reporter: { id: string; name: string };
  resolved_by: { id: string; name: string } | null;
  review: ReviewReportNestedReview;
}

export interface CreateReviewReportInput {
  reason: ReportReason;
  reason_text?: string;
}

export interface ResolveReviewReportInput {
  action: ReviewAdminAction;
  resolution_note: string;
}

export interface HideReviewInput {
  reason: string;
}

export interface RestoreReviewInput {
  reason: string;
}

export interface PaginatedReviewReportsResponse {
  data: ReviewReport[];
  meta: PaginationMeta;
  links: PaginationLinks;
}

export function createReviewReportEndpoints(client: AlqoveClient) {
  return {
    report: (reviewId: string, input: CreateReviewReportInput) =>
      client.post<{ data: ReviewReport }>(`/v1/reviews/${reviewId}/reports`, input),
    adminList: (
      params: { state?: ReviewReportState | 'all'; page?: number; per_page?: number } = {},
    ) => {
      const qs = new URLSearchParams();
      if (params.state) qs.set('state', params.state);
      if (params.page) qs.set('page', String(params.page));
      if (params.per_page) qs.set('per_page', String(params.per_page));
      const suffix = qs.toString() ? `?${qs}` : '';
      return client.get<PaginatedReviewReportsResponse>(`/v1/admin/review-reports${suffix}`);
    },
    adminResolve: (reportId: string, input: ResolveReviewReportInput) =>
      client.post<{ data: ReviewReport }>(
        `/v1/admin/review-reports/${reportId}/resolve`,
        input,
      ),
    adminHideReview: (reviewId: string, input: HideReviewInput) =>
      client.post<{ data: Review }>(`/v1/admin/reviews/${reviewId}/hide`, input),
    adminRestoreReview: (reviewId: string, input: RestoreReviewInput) =>
      client.post<{ data: Review }>(`/v1/admin/reviews/${reviewId}/restore`, input),
    adminStoreReviews: (
      storeId: string,
      params: { state?: 'visible' | 'hidden' | 'all'; page?: number; per_page?: number } = {},
    ) => {
      const qs = new URLSearchParams();
      if (params.state) qs.set('state', params.state);
      if (params.page) qs.set('page', String(params.page));
      if (params.per_page) qs.set('per_page', String(params.per_page));
      const suffix = qs.toString() ? `?${qs}` : '';
      return client.get<PaginatedReviewsResponse>(`/v1/admin/stores/${storeId}/reviews${suffix}`);
    },
  };
}
