/**
 * src/billing/plans.ts
 * خطط الاشتراك وحدود الاستخدام — Plan definitions & usage limits
 */
import { createChildLogger } from '../utils/logger.js';
import { supabase } from '../utils/supabase.js';
const log = createChildLogger('billing:plans');
export const PLANS = {
    trial: {
        id: 'trial',
        name: 'Trial',
        name_ar: 'تجربة مجانية',
        description: 'Try المؤسس free for 14 days',
        description_ar: 'جرّب المؤسس مجاناً لمدة 14 يوم',
        limits: { messages: 100, agents: 1, documents: 5 },
        price_sar: 0,
        duration_days: 14,
        features: [
            'وكيل واحد',
            '100 رسالة',
            '5 مستندات',
            'دعم واتساب',
        ],
    },
    starter: {
        id: 'starter',
        name: 'Starter',
        name_ar: 'الأساسية',
        description: 'For small businesses getting started',
        description_ar: 'للمشاريع الصغيرة والبدايات',
        limits: { messages: 2000, agents: 1, documents: 20 },
        price_sar: 499,
        duration_days: 30,
        features: [
            'وكيل واحد',
            '2,000 رسالة شهرياً',
            '20 مستند',
            'دعم واتساب',
            'لوحة تحكم',
            'تحليلات أساسية',
        ],
    },
    growth: {
        id: 'growth',
        name: 'Growth',
        name_ar: 'النمو',
        description: 'For growing businesses with higher volume',
        description_ar: 'للأعمال المتنامية مع حجم رسائل أعلى',
        limits: { messages: 10000, agents: 3, documents: 100 },
        price_sar: 1499,
        duration_days: 30,
        popular: true,
        features: [
            '3 وكلاء',
            '10,000 رسالة شهرياً',
            '100 مستند',
            'دعم واتساب + ويب',
            'لوحة تحكم متقدمة',
            'تحليلات متقدمة',
            'أتمتة العمليات',
        ],
    },
    enterprise: {
        id: 'enterprise',
        name: 'Enterprise',
        name_ar: 'المؤسسات',
        description: 'Unlimited everything for large businesses',
        description_ar: 'بلا حدود — للشركات الكبيرة',
        limits: { messages: -1, agents: -1, documents: -1 },
        price_sar: 4999,
        duration_days: 30,
        features: [
            'وكلاء بلا حدود',
            'رسائل بلا حدود',
            'مستندات بلا حدود',
            'جميع القنوات',
            'لوحة تحكم مخصصة',
            'API كامل',
            'دعم أولوية',
            'مدير حساب مخصص',
        ],
    },
};
// ─── Plan Operations ─────────────────────────────────────────────────
/**
 * استرجاع تفاصيل خطة
 */
export function getPlan(planId) {
    return PLANS[planId] ?? null;
}
/**
 * قائمة جميع الخطط المتاحة
 */
export function listPlans() {
    return Object.values(PLANS);
}
/**
 * التحقق من أن المستأجر ضمن حدود خطته
 * @returns true إذا لم يتجاوز الحد
 */
export async function checkLimit(tenantId, resource) {
    // جلب خطة المستأجر
    const { data: tenant, error: tenantErr } = await supabase
        .from('tenants')
        .select('plan')
        .eq('id', tenantId)
        .single();
    if (tenantErr || !tenant) {
        log.error({ tenantId, error: tenantErr?.message }, 'Failed to get tenant for limit check');
        return { allowed: false, current: 0, limit: 0, remaining: 0, resource };
    }
    const plan = getPlan(tenant.plan);
    if (!plan) {
        log.error({ tenantId, plan: tenant.plan }, 'Unknown plan');
        return { allowed: false, current: 0, limit: 0, remaining: 0, resource };
    }
    const limit = plan.limits[resource];
    // -1 = بلا حدود
    if (limit === -1) {
        return { allowed: true, current: 0, limit: -1, remaining: -1, resource };
    }
    // حساب الاستخدام الحالي
    const current = await getCurrentUsage(tenantId, resource);
    return {
        allowed: current < limit,
        current,
        limit,
        remaining: Math.max(0, limit - current),
        resource,
    };
}
/**
 * الحصول على الاستخدام مقابل الحدود — للوحة التحكم
 */
export async function getUsageVsPlan(tenantId) {
    const { data: tenant, error } = await supabase
        .from('tenants')
        .select('plan, created_at')
        .eq('id', tenantId)
        .single();
    if (error || !tenant)
        return null;
    const plan = getPlan(tenant.plan);
    if (!plan)
        return null;
    const [messagesUsed, agentsUsed, documentsUsed] = await Promise.all([
        getCurrentUsage(tenantId, 'messages'),
        getCurrentUsage(tenantId, 'agents'),
        getCurrentUsage(tenantId, 'documents'),
    ]);
    // حساب فترة الفوترة
    const periodStart = getBillingPeriodStart(tenant.created_at, plan.duration_days);
    const periodEnd = new Date(periodStart);
    periodEnd.setDate(periodEnd.getDate() + plan.duration_days);
    return {
        plan,
        usage: {
            messages_used: messagesUsed,
            messages_limit: plan.limits.messages,
            agents_used: agentsUsed,
            agents_limit: plan.limits.agents,
            documents_used: documentsUsed,
            documents_limit: plan.limits.documents,
        },
        billing_period: {
            start: periodStart.toISOString(),
            end: periodEnd.toISOString(),
        },
    };
}
// ─── Internal Helpers ────────────────────────────────────────────────
/**
 * حساب الاستخدام الحالي لمورد معين
 */
async function getCurrentUsage(tenantId, resource) {
    switch (resource) {
        case 'messages': {
            // مجموع الرسائل من جدول العملاء
            const { data } = await supabase
                .from('customers')
                .select('message_count')
                .eq('tenant_id', tenantId);
            return data?.reduce((sum, c) => sum + (c.message_count ?? 0), 0) ?? 0;
        }
        case 'agents': {
            // عدد الوكلاء — حالياً وكيل واحد لكل مستأجر، مستقبلاً من جدول agents
            return 1;
        }
        case 'documents': {
            // عدد المستندات في مساحة العمل — من جدول documents أو حساب الملفات
            const { count } = await supabase
                .from('documents')
                .select('*', { count: 'exact', head: true })
                .eq('tenant_id', tenantId);
            return count ?? 0;
        }
        default:
            return 0;
    }
}
/**
 * حساب بداية فترة الفوترة الحالية
 */
function getBillingPeriodStart(createdAt, durationDays) {
    const created = new Date(createdAt);
    const now = new Date();
    const msSincePeriod = now.getTime() - created.getTime();
    const periodMs = durationDays * 24 * 60 * 60 * 1000;
    const periodsPassed = Math.floor(msSincePeriod / periodMs);
    return new Date(created.getTime() + periodsPassed * periodMs);
}
//# sourceMappingURL=plans.js.map