import { PolicyDisplayStatus, PolicyStatus } from './schema/policy.schema';

const DAY_MS = 24 * 60 * 60 * 1000;

export function derivePolicyStatus(status: PolicyStatus, expiryDate: number, now = +new Date()): PolicyDisplayStatus {
    if (status === PolicyStatus.CANCELLED) return PolicyDisplayStatus.CANCELLED;
    return expiryDate < now ? PolicyDisplayStatus.EXPIRED : PolicyDisplayStatus.ACTIVE;
}

/** Days until expiry (negative once expired); null for cancelled policies. */
export function daysLeft(status: PolicyStatus, expiryDate: number, now = +new Date()): number | null {
    return status === PolicyStatus.CANCELLED ? null : Math.ceil((expiryDate - now) / DAY_MS);
}

/** Expects customer_id, category_id, insurer_id and assigned_to populated. Commission is only included when `showCommission`. */
export function formatPolicy(p: any, showCommission: boolean) {
    const c = p.customer_id, cat = p.category_id, ins = p.insurer_id, a = p.assigned_to;
    return {
        _id: p._id,
        policy_number: p.policy_number,
        status: derivePolicyStatus(p.status, p.expiry_date),
        days_left: daysLeft(p.status, p.expiry_date),
        customer: c?._id ? { _id: c._id, name: c.name, phone_no: c.phone_no, country_code: c.country_code } : null,
        product: { _id: p.product_id?._id ?? p.product_id, name: p.product_name },
        category: cat?._id ? { _id: cat._id, name: cat.name } : null,
        insurer: ins?._id ? { _id: ins._id, name: ins.name } : null,
        assigned_to: a?._id ? { _id: a._id, name: a.name, user_type: a.user_type, agent_code: a.agent_code ?? null } : null,
        gross_premium: p.gross_premium,
        net_premium: p.net_premium,
        gst_rate: p.gst_rate,
        gst_amount: p.gst_amount,
        premium_frequency: p.premium_frequency,
        sum_insured: p.sum_insured,
        sum_insured_note: p.sum_insured_note,
        insured_members: p.insured_members || [],
        vehicle_registration: p.vehicle_registration,
        issue_date: p.issue_date,
        expiry_date: p.expiry_date,
        schedule_file: p.schedule_file,
        lead_id: p.lead_id,
        cancel_reason: p.cancel_reason,
        cancelled_at: p.cancelled_at,
        created_at: p.created_at,
        ...(showCommission ? {
            commission: {
                type: p.commission_type,
                value: p.commission_value,
                amount: p.commission_amount,
                status: p.commission_status,
                paid_at: p.commission_paid_at
            }
        } : {})
    };
}

export const POLICY_POPULATE = [
    { path: 'customer_id', select: 'name phone_no country_code' },
    { path: 'category_id', select: 'name' },
    { path: 'insurer_id', select: 'name' },
    { path: 'assigned_to', select: 'name user_type agent_code' }
];
