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

export interface ReviewPhoto {
  url: string;
  thumb_url: string;
}

export interface Review {
  id: string;
  order_item_id: string;
  order_id: string;
  store_id: string;
  reviewer_user_id: string;
  rating: number;
  rating_item_as_described: number;
  rating_shipping_speed: number;
  rating_communication: number;
  rating_packaging: number;
  title: string | null;
  body: string;
  state: 'visible' | 'hidden';
  edited_at: string | null;
  hidden_by_admin_id: string | null;
  hidden_at: string | null;
  hide_reason: string | null;
  is_editable: boolean;
  photos: ReviewPhoto[];
  created_at: string;
  updated_at: string;
}

export interface ReviewSummary {
  id: string;
  store_id: string;
  buyer: { name: string };
  rating: number;
  rating_item_as_described: number;
  rating_shipping_speed: number;
  rating_communication: number;
  rating_packaging: number;
  title: string | null;
  body: string;
  state: 'visible';
  edited_at: string | null;
  is_editable: boolean;
  photos: ReviewPhoto[];
  created_at: string;
}

export interface SellerReviewReportStatus {
  count: number;
  latest_outcome: 'keep' | 'hide' | null;
  latest_state: 'open' | 'resolved' | null;
}

export interface SellerReview extends Review {
  report_status: SellerReviewReportStatus;
}

export interface PaginatedSellerReviewsResponse {
  data: SellerReview[];
  meta: PaginationMeta;
  links: PaginationLinks;
}

export interface RatingSummary {
  average_rating: number | null;
  review_count: number;
  distribution: { '1': number; '2': number; '3': number; '4': number; '5': number };
  dimensions: {
    item_as_described: number | null;
    shipping_speed: number | null;
    communication: number | null;
    packaging: number | null;
  };
}

export interface ReviewAttachmentUploadResponse {
  id: string;
  url: string | null;
  thumb_url: string | null;
}

export interface NewReviewInput {
  rating: number;
  rating_item_as_described?: number;
  rating_shipping_speed?: number;
  rating_communication?: number;
  rating_packaging?: number;
  title?: string;
  body: string;
  attachment_ids?: string[];
}

export interface EditReviewInput {
  rating: number;
  rating_item_as_described?: number;
  rating_shipping_speed?: number;
  rating_communication?: number;
  rating_packaging?: number;
  title?: string;
  body: string;
  attachment_ids?: string[];
}

export interface PaginatedReviewsResponse {
  data: Review[];
  meta: PaginationMeta;
  links: PaginationLinks;
}

export interface PaginatedReviewSummariesResponse {
  data: ReviewSummary[];
  meta: PaginationMeta;
  links: PaginationLinks;
}

export function createReviewEndpoints(client: AlqoveClient) {
  return {
    create: (orderItemId: string, input: NewReviewInput) =>
      client.post<{ data: Review }>(`/v1/order-items/${orderItemId}/reviews`, input),
    update: (reviewId: string, input: EditReviewInput) =>
      client.patch<{ data: Review }>(`/v1/reviews/${reviewId}`, input),
    myReviews: (params: { page?: number; per_page?: number } = {}) => {
      const qs = new URLSearchParams();
      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/me/reviews${suffix}`);
    },
    storeReviews: (storeId: string, params: { page?: number; per_page?: number } = {}) => {
      const qs = new URLSearchParams();
      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<PaginatedReviewSummariesResponse>(`/v1/stores/${storeId}/reviews${suffix}`);
    },
    storeRatingSummary: (storeId: string) =>
      client.get<{ data: RatingSummary }>(`/v1/stores/${storeId}/rating-summary`),
    sellerRatingSummary: (storeId: string) =>
      client.get<{ data: RatingSummary }>(`/v1/stores/${storeId}/seller/rating-summary`),
    sellerReviews: (storeId: string, params: { page?: number; per_page?: number } = {}) => {
      const qs = new URLSearchParams();
      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<PaginatedSellerReviewsResponse>(`/v1/stores/${storeId}/seller/reviews${suffix}`);
    },
    uploadAttachment: async (
      orderItemId: string,
      file: File,
    ): Promise<ReviewAttachmentUploadResponse> => {
      const form = new FormData();
      form.append('file', file);
      const res = await client.postFormData<{ data: ReviewAttachmentUploadResponse }>(
        `/v1/order-items/${orderItemId}/review-attachments`,
        form,
      );
      return res.data;
    },
  };
}
