import type { LearnStarter } from './types';

export type LearnExamplePayload = {
  version: 3; source: 'learn'; title: string; projectModeId: string; files: Record<string,string>; entryFile: string;
  autoCompile: boolean; temporary: boolean; courseSlug?: string; lessonSlug?: string; blockId?: string; createdAt: number;
};
const PREFIX='learnitive:learn-example:v3:';
export function storeLearnExample(title:string,projectModeId:string,starter:LearnStarter,options:{temporary?:boolean;courseSlug?:string;lessonSlug?:string;blockId?:string}={}):string{
  const token=crypto.randomUUID();const entryFile=starter.entryFile||Object.keys(starter.files)[0]||'';if(!entryFile||!starter.files[entryFile])throw new Error('learn_starter_entry_required');
  const payload:LearnExamplePayload={version:3,source:'learn',title:title.slice(0,120),projectModeId,files:starter.files,entryFile,autoCompile:true,temporary:options.temporary!==false,...(options.courseSlug?{courseSlug:options.courseSlug}:{}),...(options.lessonSlug?{lessonSlug:options.lessonSlug}:{}),...(options.blockId?{blockId:options.blockId}:{}),createdAt:Date.now()};
  sessionStorage.setItem(`${PREFIX}${token}`,JSON.stringify(payload));return token;
}
export function consumeLearnExample(token:string):LearnExamplePayload|null{
  if(typeof window==='undefined'||!/^[a-z0-9-]{8,80}$/iu.test(token))return null;try{const key=`${PREFIX}${token}`,raw=sessionStorage.getItem(key);sessionStorage.removeItem(key);if(!raw)return null;const parsed=JSON.parse(raw) as Partial<LearnExamplePayload>;if(parsed.version!==3||parsed.source!=='learn'||!parsed.files||typeof parsed.entryFile!=='string'||typeof parsed.projectModeId!=='string')return null;const files:Record<string,string>={};for(const [path,content] of Object.entries(parsed.files)){if(!path||path.startsWith('/')||path.includes('..')||typeof content!=='string')return null;files[path]=content;}if(!files[parsed.entryFile])return null;return{version:3,source:'learn',title:String(parsed.title||'Learning example').slice(0,120),projectModeId:parsed.projectModeId,files,entryFile:parsed.entryFile,autoCompile:parsed.autoCompile!==false,temporary:parsed.temporary!==false,...(parsed.courseSlug?{courseSlug:parsed.courseSlug}:{}),...(parsed.lessonSlug?{lessonSlug:parsed.lessonSlug}:{}),...(parsed.blockId?{blockId:parsed.blockId}:{}),createdAt:Number(parsed.createdAt||Date.now())};}catch{return null;}}
