"use server";
// import { BASE_API_URL } from "@/config/api";
import { BASE_API_URL } from "../../../config/api";
// import { ServerFetchError, serverFetchJson, serverFetchWithNoContent } from "@/app/utils/fetchUtil";
import { revalidateTag } from "next/cache";
import { cache } from "react";
import { PoResult, StockInLine } from ".";
//import { serverFetchJson } from "@/app/utils/fetchUtil";
import { serverFetchJson } from "../../utils/fetchUtil";
import { QcItemResult } from "../settings/qcItem";
import { RecordsRes } from "../utils";
// import { BASE_API_URL } from "@/config/api";

export interface PostStockInLineResponse<T> {
  id: number | null;
  name: string;
  code: string;
  type?: string;
  message: string | null;
  errorPosition: string | keyof T;
  entity: T | T[];
  // entity: StockInLine | StockInLine[]
}

export interface StockInLineEntry {
  id?: number;
  itemId: number;
  purchaseOrderId: number;
  purchaseOrderLineId: number;
  acceptedQty: number;
  status?: string;
  expiryDate?: string;
}

export interface PurchaseQcResult {
  qcItemId: number;
  failQty: number;
  isPassed: boolean;
}
export interface StockInInput {
  status: string;
  productLotNo?: string;
  receiptDate: string;
  acceptedQty: number;
  acceptedWeight?: number;
  productionDate?: string;
  expiryDate: string;
}
export interface PurchaseQCInput {
  status?: string;
  qcAccept: boolean;
  acceptQty: number;
  sampleRate?: number;
  sampleWeight?: number;
  totalWeight?: number;
  qcResult: PurchaseQcResult[];
}
export interface EscalationInput {
  status: string;
  handler: string;
  acceptedQty: number; // this is the qty to be escalated
  // escalationQty: number
}
export interface PutawayInput {
  status: string;
  acceptedQty: number;
  warehouseId: number;
  // handler: string
  // stockInLine: StockInLineEntry[]
}

export type ModalFormInput = Partial<
  PurchaseQCInput & StockInInput & EscalationInput & PutawayInput
>;

export const testFetch = cache(async (id: number) => {
  return serverFetchJson<PoResult>(`${BASE_API_URL}/po/detail/${id}`, {
    next: { tags: ["po"] },
  });
});

export const fetchStockInLineInfo = cache(async (stockInLineId: number) => {
  return serverFetchJson<StockInLine>(
    `${BASE_API_URL}/stockInLine/${stockInLineId}`,
    {
      next: { tags: ["stockInLine"] },
    },
  );
});

export const createStockInLine = async (data: StockInLineEntry) => {
  console.log(data)
  const stockInLine = await serverFetchJson<
    PostStockInLineResponse<StockInLineEntry>
  >(`${BASE_API_URL}/stockInLine/create`, {
    method: "POST",
    body: JSON.stringify(data),
    headers: { "Content-Type": "application/json" },
  });
  // revalidateTag("po");
  return stockInLine;
};

export const updateStockInLine = async (
  data: StockInLineEntry & ModalFormInput,
) => {
  const stockInLine = await serverFetchJson<
    PostStockInLineResponse<StockInLineEntry & ModalFormInput>
  >(`${BASE_API_URL}/stockInLine/update`, {
    method: "POST",
    body: JSON.stringify(data),
    headers: { "Content-Type": "application/json" },
  });
  // revalidateTag("po");
  return stockInLine;
};

export const startPo = async (poId: number) => {
  const po = await serverFetchJson<PostStockInLineResponse<PoResult>>(
    `${BASE_API_URL}/po/start/${poId}`,
    {
      method: "POST",
      body: JSON.stringify({ poId }),
      headers: { "Content-Type": "application/json" },
    },
  );
  revalidateTag("po");
  return po;
};

export const checkPolAndCompletePo = async (poId: number) => {
  const po = await serverFetchJson<PostStockInLineResponse<PoResult>>(
    `${BASE_API_URL}/po/check/${poId}`,
    {
      method: "POST",
      body: JSON.stringify({ poId }),
      headers: { "Content-Type": "application/json" },
    },
  );
  revalidateTag("po");
  return po;
};

export const fetchPoInClient = cache(async (id: number) => {
  return serverFetchJson<PoResult>(`${BASE_API_URL}/po/detail/${id}`, {
    next: { tags: ["po"] },
  });
});

export const fetchPoListClient = cache(
  async (queryParams?: Record<string, any>) => {
    if (queryParams) {
      const queryString = new URLSearchParams(queryParams).toString();
      return serverFetchJson<RecordsRes<PoResult[]>>(
        `${BASE_API_URL}/po/list?${queryString}`,
        {
          method: "GET",
          next: { tags: ["po"] },
        },
      );
    } else {
      return serverFetchJson<RecordsRes<PoResult[]>>(
        `${BASE_API_URL}/po/list`,
        {
          method: "GET",
          next: { tags: ["po"] },
        },
      );
    }
  },
);

export const testing = cache(async (queryParams?: Record<string, any>) => {
  if (queryParams) {
    const queryString = new URLSearchParams(queryParams).toString();
    return serverFetchJson<RecordsRes<PoResult[]>>(
      `${BASE_API_URL}/po/testing?${queryString}`,
      {
        method: "GET",
        next: { tags: ["po"] },
      },
    );
  } else {
    return serverFetchJson<RecordsRes<PoResult[]>>(
      `${BASE_API_URL}/po/testing`,
      {
        method: "GET",
        next: { tags: ["po"] },
      },
    );
  }
});

export interface GoodsReceiptStatusRow {
  supplierId: number | null;
  supplierCode: string | null;
  supplierName: string;
  purchaseOrderCode: string | null;
  statistics: string;
  expectedNoOfDelivery: number;
  noOfOrdersReceivedAtDock: number;
  noOfItemsInspected: number;
  noOfItemsWithIqcIssue: number;
  noOfItemsCompletedPutAwayAtStore: number;
  // When true, this PO should be hidden from the dashboard table,
  // but still counted in the overall statistics (訂單已處理).
  hideFromDashboard?: boolean;
}

export const fetchGoodsReceiptStatus = cache(async (date?: string) => {
  const url = date
    ? `${BASE_API_URL}/dashboard/goods-receipt-status?date=${date}`
    : `${BASE_API_URL}/dashboard/goods-receipt-status`;

  return await serverFetchJson<GoodsReceiptStatusRow[]>(url, { method: "GET" });
});
