import api from '../config/api';
import { Material, MaterialCategory, MaterialUnit, MaterialRequest, MaterialOrder } from '../types';

export const materialService = {
  // ─── Material CRUD ──────────────────────────────────────────────────────
  async list(): Promise<Material[]> {
    const response = await api.get('/materials');
    return response.data.data || response.data || [];
  },

  async getById(id: number): Promise<Material> {
    const response = await api.get(`/materials/${id}`);
    return response.data.data || response.data;
  },

  async create(data: {
    material_name: string;
    material_code: string;
    category_id?: number;
    unit_id?: number;
    description?: string;
    stock_quantity?: number;
  }): Promise<Material> {
    const response = await api.post('/materials', data);
    return response.data;
  },

  async update(id: number, data: {
    material_name?: string;
    material_code?: string;
    category_id?: number;
    unit_id?: number;
    description?: string;
    status?: string;
    stock_quantity?: number;
  }): Promise<void> {
    await api.put(`/materials/${id}`, data);
  },

  async remove(id: number): Promise<void> {
    await api.delete(`/materials/${id}`);
  },

  // ─── Categories ─────────────────────────────────────────────────────────
  async listCategories(): Promise<MaterialCategory[]> {
    const response = await api.get('/materials/categories');
    return response.data.data || response.data || [];
  },

  async createCategory(name: string): Promise<MaterialCategory> {
    const response = await api.post('/materials/categories', { name });
    const d = response.data;
    return { id: d.id, company_id: 0, name } as MaterialCategory;
  },

  async updateCategory(id: number, name: string): Promise<void> {
    await api.put(`/materials/categories/${id}`, { name });
  },

  async removeCategory(id: number): Promise<void> {
    await api.delete(`/materials/categories/${id}`);
  },

  // ─── Units ──────────────────────────────────────────────────────────────
  async listUnits(): Promise<MaterialUnit[]> {
    const response = await api.get('/materials/units');
    return response.data.data || response.data || [];
  },

  async createUnit(name: string): Promise<MaterialUnit> {
    const response = await api.post('/materials/units', { name });
    const d = response.data;
    return { id: d.id, name } as MaterialUnit;
  },

  async removeUnit(id: number): Promise<void> {
    await api.delete(`/materials/units/${id}`);
  },

  // ─── Job Materials ──────────────────────────────────────────────────────
  async listAll(status?: string): Promise<MaterialRequest[]> {
    const params = status ? { status } : {};
    const response = await api.get('/materials/all', { params });
    return response.data.data || response.data || [];
  },

  async jobMaterials(jobId: number): Promise<MaterialRequest[]> {
    const response = await api.get(`/materials/job/${jobId}`);
    return response.data.data || response.data || [];
  },

  async request(data: { job_id: number; material_id: number; quantity: number; remarks?: string }): Promise<MaterialRequest> {
    const response = await api.post('/materials/request', data);
    return response.data;
  },

  async approve(id: number, approved_quantity?: number): Promise<void> {
    await api.post(`/materials/${id}/approve`, { approved_quantity });
  },

  async assignToPerson(id: number, assigned_to: number): Promise<void> {
    await api.post(`/materials/${id}/assign`, { assigned_to });
  },

  async returnToStock(id: number): Promise<void> {
    await api.post(`/materials/${id}/return`);
  },

  async removeMaterialFromJob(id: number): Promise<void> {
    await api.delete(`/materials/${id}/unlink`);
  },

  // ─── Purchase Orders ────────────────────────────────────────────────────
  async createOrder(data: {
    job_id?: number;
    expected_delivery_date?: string;
    remarks?: string;
    items: { material_id: number; quantity: number; unit_price?: number; remarks?: string }[];
  }): Promise<MaterialOrder> {
    const response = await api.post('/materials/orders', data);
    return response.data;
  },

  async listOrders(): Promise<MaterialOrder[]> {
    const response = await api.get('/materials/orders');
    return response.data.data || response.data || [];
  },

  async getOrder(id: number): Promise<MaterialOrder> {
    const response = await api.get(`/materials/orders/${id}`);
    return response.data.data || response.data;
  },

  async updateOrderStatus(id: number, order_status: string): Promise<void> {
    await api.put(`/materials/orders/${id}/status`, { order_status });
  },
};
