import {database} from '@/db/store';
export const membershipOwner='vanessa.magni01@gmail.com';
export const trialDuration=30*24*60*60*1000;
// Payfast schedules dates in South African time; use the following date so a full 30 days is never shortened.
export function trialBillingDate(endsAt:number){return new Date(Math.ceil((endsAt+2*60*60*1000)/(24*60*60*1000))*24*60*60*1000).toISOString().slice(0,10);}
export function trialBillingTime(endsAt:number){return new Date(trialBillingDate(endsAt)+'T00:00:00+02:00').getTime();}
export async function membershipAccess(email:string,now=Date.now()){
 if(email===membershipOwner)return {allowed:true,kind:'owner',trial:null,paidUntil:null};
 const db=database();
 const trial=await db.prepare('SELECT started_at,ends_at FROM membership_trials WHERE user_email=?').bind(email).first<{started_at:number;ends_at:number}>();
 const paid=await db.prepare("SELECT MAX(paid_until) AS until FROM payment_subscriptions WHERE user_email=? AND plan='personal' AND mode='live' AND status IN ('active','cancelled') AND paid_until>?").bind(email,now).first<{until:number|null}>();
 const cardSetup=await db.prepare("SELECT token,status FROM payment_subscriptions WHERE user_email=? AND plan='personal' AND mode='live' AND amount_cents=0 ORDER BY token IS NULL,created_at DESC LIMIT 1").bind(email).first<{token:string|null;status:string}>();
 const endsAt=trial?(cardSetup?trialBillingTime(trial.ends_at):trial.ends_at):null;
 const trialInfo=trial?{startedAt:trial.started_at,endsAt:endsAt!,daysLeft:Math.min(30,Math.max(0,Math.ceil((endsAt!-now)/(24*60*60*1000))))}:null;
 if(paid?.until)return {allowed:true,kind:'paid',trial:trialInfo,paidUntil:paid.until};
 if(trial&&endsAt!>now&&cardSetup&&!cardSetup.token)return {allowed:false,kind:'not_started',trial:trialInfo,paidUntil:null};
 if(trial&&endsAt!>now)return {allowed:true,kind:'trial',trial:trialInfo,paidUntil:null};
 return {allowed:false,kind:trial?'expired':'not_started',trial:trialInfo,paidUntil:null};
}
export async function startTrial(email:string,now=Date.now()){
 await database().prepare('INSERT OR IGNORE INTO membership_trials(user_email,started_at,ends_at) VALUES(?,?,?)').bind(email,now,now+trialDuration).run();
 return membershipAccess(email,now);
}
export function membershipError(access:Awaited<ReturnType<typeof membershipAccess>>){return {error:access.kind==='expired'?'Your 30-day trial has ended. Choose a personal membership to continue. Your saved information is kept.':'Start your free 30-day trial to open your private workspace.',access};}
