/**
 * Premise Service
 * Service quản lý mặt bằng bưu cục
 */

import apiClient from '@/infrastructure/apiClient';
import apiPath from '@/infrastructure/apiPath';

export default {
    /**
     * Tìm kiếm mặt bằng
     * @param {Object} searchModel - { Pagination, Sort, Search }
     * @returns {Promise<Object>} { TotalRecord, Data }
     */
    async search(searchModel) {
        try {
            const response = await apiClient.post(apiPath.premise.search, searchModel);
            return response.data;
        } catch (error) {
            console.error('Error searching premises:', error);
            throw error;
        }
    },

    /**
     * Lấy chi tiết mặt bằng theo ID
     * @param {number} id - ID mặt bằng
     * @returns {Promise<Object>} Premise detail (kèm Financial, Contacts, Scores)
     */
    async getById(id) {
        try {
            const response = await apiClient.get(`${apiPath.premise.getById}${id}`);
            return response.data;
        } catch (error) {
            console.error('Error getting premise by id:', error);
            throw error;
        }
    },

    /**
     * Tạo mới hoặc cập nhật mặt bằng
     * Id = 0: tạo mới (status tự động = Surveying), Id > 0: cập nhật
     * Request format: multipart/form-data
     * @param {FormData} formData - FormData chứa tất cả fields, Contacts[], Scores[], NewMediaFiles[], NewMediaTypes[], DeleteMediaIds[]
     * @returns {Promise<Object>} { Result, Message }
     */
    async createOrUpdate(formData) {
        try {
            const response = await apiClient.post(apiPath.premise.createOrUpdate, formData, {
                headers: { 'Content-Type': 'multipart/form-data' },
            });
            return response.data;
        } catch (error) {
            console.error('Error creating/updating premise:', error);
            throw error;
        }
    },

    /**
     * Xóa mặt bằng
     * @param {number} id - ID mặt bằng
     * @returns {Promise<Object>} { Result, Message }
     */
    async delete(id) {
        try {
            const response = await apiClient.delete(`${apiPath.premise.delete}${id}`);
            return response.data;
        } catch (error) {
            console.error('Error deleting premise:', error);
            throw error;
        }
    },

    /**
     * Chuyển trạng thái mặt bằng
     * Luồng: Surveying(1) → Evaluating(2) → Negotiating(3) → Approved(4) → Rented(5)
     *                                          ↘ Rejected(6) ↘ Closed(7)
     * @param {Object} model - { Id, Status, UpdatedBy, UpdatedByUserName }
     * @returns {Promise<Object>} { Result, Message }
     */
    async changeStatus(model) {
        try {
            const response = await apiClient.post(apiPath.premise.changeStatus, model);
            return response.data;
        } catch (error) {
            console.error('Error changing premise status:', error);
            throw error;
        }
    },

    /**
     * Xóa ảnh mặt bằng
     * @param {number} id - ID của PremiseMedia (lấy từ Medias[].Id trong GetById)
     * @returns {Promise<Object>} { Result, Message }
     */
    async deleteMedia(id) {
        try {
            const response = await apiClient.delete(`${apiPath.premise.deleteMedia}${id}`);
            return response.data;
        } catch (error) {
            console.error('Error deleting premise media:', error);
            throw error;
        }
    },

    /**
     * Cập nhật thông tin tài chính mặt bằng
     * @param {Object} model - Financial model { PremiseId, AskingRent, NegotiatedRent, ... }
     * @returns {Promise<Object>} { Result, Message }
     */
    async updateFinancial(model) {
        try {
            const response = await apiClient.post(apiPath.premise.updateFinancial, model);
            return response.data;
        } catch (error) {
            console.error('Error updating premise financial:', error);
            throw error;
        }
    },
};
