export enum InvoiceSettingKey {
    invoice_number = 'invoice_number',
    invoice_date = 'invoice_date',
    due_date = 'due_date',
    period = 'period',
    status = 'status',

    service_to_prn = 'service_to_prn',
    service_to_log = 'service_to_log',
    service_to_city = 'service_to_city',
    name = 'name',
    email = 'email',
    phoneNumber = 'phoneNumber',
    address = 'address',

    trip_id = 'trip_id',
    date_time = 'date_time',
    service_type = 'service_type',
    pickupTimeDropOffTime = 'pickupTimeDropOffTime',
    pickupLocationDropOffLocation = 'pickupLocationDropOffLocation',
    addOnWithQuantityAndPrice = 'addOnWithQuantityAndPrice',
    carUsed = 'carUsed',
    appointmentType = 'appointmentType',
    amount = 'amount',

    // Invoice To (fixed display fields)
    invoice_to_name = 'invoice_to_name',
    invoice_to_email = 'invoice_to_email',
    invoice_to_phone = 'invoice_to_phone',
}

export interface InvoiceFieldConfig {
    visible: boolean;
    label: string;
    is_fixed: boolean;
}

// Suggested server response contract
export interface InvoiceSettingsResponse {
    fields: Record<string, InvoiceFieldConfig>;
    comments?: string;
    client_tax?: any;
}

// Optional metadata to drive UI grouping and ordering
export type InvoiceFieldSection =
    | 'invoice_details'
    | 'service_to_fixed'
    | 'service_to_manageable'
    | 'invoice_to'
    | 'table_fixed'
    | 'table_manageable';

export interface InvoiceFieldWithMeta extends InvoiceFieldConfig {
    section: InvoiceFieldSection;
    order: number;
}

export interface InvoiceSettingsPostPayload {
    client_id: number;
    notes?: string;
    fields: Record<string, InvoiceFieldWithMeta>;
    client_tax?: any;
}

export const cleanFieldData = (fields: Record<string, any>): Record<string, InvoiceFieldConfig> => {
    return Object.fromEntries(
        Object.entries(fields || {}).map(([key, field]: [string, any]) => [
            key,
            {
                visible: Boolean(field?.visible),
                label: field?.label || '',
                is_fixed: Boolean(field?.is_fixed),
            },
        ]),
    );
};

export const DEFAULT_FIELDS: Record<string, InvoiceFieldWithMeta> = {
    // Invoice details
    invoice_number: { visible: true, label: 'Invoice Number', is_fixed: true, section: 'invoice_details', order: 1 },
    invoice_date: { visible: true, label: 'Invoice Date', is_fixed: true, section: 'invoice_details', order: 2 },
    due_date: { visible: true, label: 'Due Date', is_fixed: true, section: 'invoice_details', order: 3 },
    period: { visible: true, label: 'Period', is_fixed: true, section: 'invoice_details', order: 4 },
    status: { visible: true, label: 'Status', is_fixed: true, section: 'invoice_details', order: 5 },

    // Service To
    service_to_prn: { visible: true, label: 'PRN', is_fixed: true, section: 'service_to_fixed', order: 1 },
    service_to_log: { visible: true, label: 'LOG Number', is_fixed: true, section: 'service_to_fixed', order: 2 },
    service_to_city: { visible: true, label: 'City', is_fixed: true, section: 'service_to_fixed', order: 3 },
    name: { visible: true, label: 'Name', is_fixed: false, section: 'service_to_manageable', order: 1 },
    email: { visible: true, label: 'Email', is_fixed: false, section: 'service_to_manageable', order: 2 },
    phoneNumber: { visible: true, label: 'Phone Number', is_fixed: false, section: 'service_to_manageable', order: 3 },
    address: { visible: true, label: 'Address', is_fixed: false, section: 'service_to_manageable', order: 4 },

    // Table fixed
    trip_id: { visible: true, label: 'Trip ID', is_fixed: true, section: 'table_fixed', order: 1 },
    date_time: { visible: true, label: 'Date & Time', is_fixed: true, section: 'table_fixed', order: 2 },
    service_type: { visible: true, label: 'Service Type', is_fixed: true, section: 'table_fixed', order: 3 },

    pickupTimeDropOffTime: {
        visible: true,
        label: 'Pickup Time & Drop Off Time',
        is_fixed: false,
        section: 'table_manageable',
        order: 1,
    },
    pickupLocationDropOffLocation: {
        visible: true,
        label: 'Pickup Location & Drop Off Location',
        is_fixed: true,
        section: 'table_manageable',
        order: 2,
    },
    addOnWithQuantityAndPrice: {
        visible: true,
        label: 'Add On with quantity and price',
        is_fixed: false,
        section: 'table_manageable',
        order: 3,
    },
    carUsed: { visible: true, label: 'Car Used', is_fixed: false, section: 'table_manageable', order: 4 },
    appointmentType: { visible: true, label: 'Appointment Type', is_fixed: false, section: 'table_manageable', order: 5 },
    amount: { visible: true, label: 'Amount', is_fixed: true, section: 'table_fixed', order: 99 },

    // Invoice To
    invoice_to_name: { visible: true, label: 'Name', is_fixed: true, section: 'invoice_to', order: 1 },
    invoice_to_email: { visible: true, label: 'Email', is_fixed: true, section: 'invoice_to', order: 2 },
    invoice_to_phone: { visible: true, label: 'Phone', is_fixed: true, section: 'invoice_to', order: 3 },
};

export const getSectionKeys = (
    section: InvoiceFieldSection,
    fields: Record<string, InvoiceFieldWithMeta> = DEFAULT_FIELDS,
): string[] => {
    return Object.keys(fields)
        .filter((key) => fields[key].section === section)
        .sort((a, b) => (fields[a].order ?? 0) - (fields[b].order ?? 0));
};
