import { ipcMain } from 'electron';
import { createHandler } from '../database/LocalSystem.js';
import Chapter from '../database/models/Chapter.js';
import type { ChapterProps, CompanionContent } from '../database/models/Chapter.js';
import type { ActStory } from '../database/models/Act.js';

interface GetWholeChapterData {
    id: string;
    version: number;
    bookid: string;
}

interface SaveChapterContentData {
    chapterId: string;
    version: number;
    content: JSON;
    totalWordCount: number;
    currentTime: number;
}

interface AddChapterData {
    bookId: string;
    title: string;
    chapterOrder: number;
    chapterId?: string;
}

interface UpdateChapterData {
    chapterId: string;
    title: string;
    chapterOrder: number;
}

interface AddChapterInformationData {
    chapterId: string;
    actId: number;
    bookId: string;
    plotId: string | null;
    incidentId: string | null;
    chapterInfoId?: string;
}

interface GetChapterContentData {
    chapterId: string;
    version: number;
}

// GET /book/chapters - Get all chapters from a book
ipcMain.handle('db:book:chapters', createHandler<string, ChapterProps[]>(
        function(userId: string, bookId: string, lang: 'fr' | 'en'): ChapterProps[] {
            return Chapter.getAllChaptersFromABook(userId, bookId, lang);
        }
    )
);

// GET /chapter/whole - Get whole chapter
ipcMain.handle('db:chapter:whole', createHandler<GetWholeChapterData, ChapterProps>(
        function(userId: string, data: GetWholeChapterData, lang: 'fr' | 'en'): ChapterProps {
            return Chapter.getWholeChapter(userId, data.id, data.version, data.bookid, lang);
        }
    )
);

// GET /chapter/:id/story - Get chapter story
ipcMain.handle('db:chapter:story', createHandler<string, ActStory[]>(
        function(userId: string, chapterId: string, lang: 'fr' | 'en'): ActStory[] {
            return Chapter.getChapterStory(userId, chapterId, lang);
        }
    )
);

// GET /chapter/content/companion - Get companion content
ipcMain.handle('db:chapter:content:companion', createHandler<GetChapterContentData, CompanionContent>(
        function(userId: string, data: GetChapterContentData, lang: 'fr' | 'en'): CompanionContent {
            return Chapter.getCompanionContent(userId, data.chapterId, data.version, lang);
        }
    )
);

// GET /chapter/content - Get chapter content by version
ipcMain.handle('db:chapter:content:get', createHandler<GetChapterContentData, string>(
        function(userId: string, data: GetChapterContentData, lang: 'fr' | 'en'): string {
            return Chapter.getChapterContentByVersion(userId, data.chapterId, data.version, lang);
        }
    )
);

// POST /chapter/content - Save chapter content
ipcMain.handle('db:chapter:content:save', createHandler<SaveChapterContentData, boolean>(
        function(userId: string, data: SaveChapterContentData, lang: 'fr' | 'en'): boolean {
            return Chapter.saveChapterContent(
                userId,
                data.chapterId,
                data.version,
                data.content,
                data.totalWordCount,
                data.currentTime,
                lang
            );
        }
    )
);

// GET /chapter/last-chapter - Get last chapter
ipcMain.handle('db:chapter:last', createHandler<string, ChapterProps | null>(
        function(userId: string, bookId: string, lang: 'fr' | 'en'): ChapterProps | null {
            return Chapter.getLastChapter(userId, bookId, lang);
        }
    )
);

// POST /chapter/add - Add new chapter
ipcMain.handle('db:chapter:add', createHandler<AddChapterData, string>(
        function(userId: string, data: AddChapterData, lang: 'fr' | 'en'): string {
            return Chapter.addChapter(userId, data.bookId, data.title, 0, data.chapterOrder, lang, data.chapterId);
        }
    )
);

// DELETE /chapter/remove - Remove chapter
interface RemoveChapterData {
    chapterId: string;
    bookId: string;
    deletedAt: number;
}
ipcMain.handle('db:chapter:remove', createHandler<RemoveChapterData, boolean>(
        function(userId: string, data: RemoveChapterData, lang: 'fr' | 'en'): boolean {
            return Chapter.removeChapter(userId, data.bookId, data.chapterId, data.deletedAt, lang);
        }
    )
);

// POST /chapter/update - Update chapter
ipcMain.handle('db:chapter:update', createHandler<UpdateChapterData, boolean>(
        function(userId: string, data: UpdateChapterData, lang: 'fr' | 'en'): boolean {
            return Chapter.updateChapter(userId, data.chapterId, data.title, data.chapterOrder, lang);
        }
    )
);

// POST /chapter/resume/add - Add chapter information
ipcMain.handle('db:chapter:information:add', createHandler<AddChapterInformationData, string>(
        function(userId: string, data: AddChapterInformationData, lang: 'fr' | 'en'): string {
            return Chapter.addChapterInformation(
                userId,
                data.chapterId,
                data.actId,
                data.bookId,
                data.plotId,
                data.incidentId,
                lang,
                data.chapterInfoId
            );
        }
    )
);

// DELETE /chapter/resume/remove - Remove chapter information
interface RemoveChapterInfoData {
    chapterInfoId: string;
    bookId: string;
    deletedAt: number;
}
ipcMain.handle('db:chapter:information:remove', createHandler<RemoveChapterInfoData, boolean>(
        function(userId: string, data: RemoveChapterInfoData, lang: 'fr' | 'en'): boolean {
            return Chapter.removeChapterInformation(userId, data.bookId, data.chapterInfoId, data.deletedAt, lang);
        }
    )
);
