// app/api/telegram/lib/ticket-handler.ts
import { bot, memory, getLiterals } from './config';
import { Markup } from 'telegraf';
import { eventBus, EVENTS } from '../../events/eventBus';

import { prisma } from '@/lib/prisma';

export enum TicketState {
  INITIAL = 'INITIAL',
  CREATE_TICKET = 'CREATE_TICKET',
  VIEW_TICKETS = 'VIEW_TICKETS'
}

export async function setupTicketHandler() {
  bot.command('ticket', async (ctx) => {
    if (!ctx.from) return;
    
    try {
      const user = await memory.getOrCreateUser(ctx.from);
      
      // First find if user already has a state
      const userBotState = await prisma.userBotState.findFirst({
        where: { 
          telegramUserId: user.id 
        }
      });
      
      if (userBotState) {
        // Update existing state
        await prisma.userBotState.update({
          where: { 
            id: userBotState.id 
          },
          data: { 
            state: TicketState.INITIAL 
          }
        });
      } else {
        // Create new state
        await prisma.userBotState.create({
          data: {
            telegramUserId: user.id,
            state: TicketState.INITIAL
          }
        });
      }
      
      const ticketMenu = Markup.inlineKeyboard([
        [Markup.button.callback('ثبت تیکت جدید', 'ticket_create')],
        [Markup.button.callback('مشاهده تیکت‌های قبلی', 'ticket_view')]
      ]);
      
      await ctx.reply('به بخش تیکت‌ها خوش آمدید. چه کاری می‌خواهید انجام دهید؟', ticketMenu);
    } catch (error) {
      console.error('Error in ticket command:', error);
      await ctx.reply('خطایی رخ داد. لطفاً مجدداً تلاش کنید.');
    }
  });
}

export async function handleTicketCallbacks(ctx: any, data: string, user: any) {
  try {
    // Get the user's current state
    const userBotState = await prisma.userBotState.findFirst({
      where: { telegramUserId: user.id }
    });

    if (!userBotState) {
      await ctx.answerCbQuery('خطایی رخ داد. لطفاً مجدداً تلاش کنید.');
      return;
    }

    if (data === 'ticket_create') {
      // Update user state to create ticket
      await prisma.userBotState.update({
        where: { id: userBotState.id }, // Use the id for unique identification
        data: { state: TicketState.CREATE_TICKET }
      });
      
      await ctx.answerCbQuery('');
      await ctx.reply('لطفاً پیام تیکت خود را وارد کنید:');
    } 
    else if (data === 'ticket_view') {
      await ctx.answerCbQuery('');
      
      // Fetch user's tickets
      const tickets = await prisma.userTicket.findMany({
        where: { telegramUserId: user.id },
        orderBy: { createdAt: 'desc' }
      });
      
      if (tickets.length === 0) {
        await ctx.reply('شما هنوز تیکتی ثبت نکرده‌اید.');
        return;
      }
      
      // Update user state
      await prisma.userBotState.update({
        where: { id: userBotState.id }, // Use the id for unique identification
        data: { state: TicketState.VIEW_TICKETS }
      });
      
      // Create a message with all tickets
      let ticketMessage = '📋 تیکت‌های شما:\n\n';
      
      tickets.forEach((ticket, index) => {
        const status = ticket.checked ? '✅ پاسخ داده شده' : '⏳ در انتظار بررسی';
        const date = new Date(ticket.createdAt).toLocaleDateString('fa-IR');
        const time = new Date(ticket.createdAt).toLocaleTimeString('fa-IR');
        
        ticketMessage += `${index + 1}. ${date} ${time}\n`;
        ticketMessage += `وضعیت: ${status}\n`;
        ticketMessage += `متن: ${ticket.content.substring(0, 50)}${ticket.content.length > 50 ? '...' : ''}\n\n`;
      });
      
      const backButton = Markup.inlineKeyboard([
        Markup.button.callback('بازگشت به منوی تیکت‌ها', 'ticket_back')
      ]);
      
      await ctx.reply(ticketMessage, backButton);
    }
    else if (data === 'ticket_back') {
      await ctx.answerCbQuery('');
      
      // Set user state back to initial
      await prisma.userBotState.update({
        where: { id: userBotState.id }, // Use the id for unique identification
        data: { state: TicketState.INITIAL }
      });
      
      const ticketMenu = Markup.inlineKeyboard([
        [Markup.button.callback('ثبت تیکت جدید', 'ticket_create')],
        [Markup.button.callback('مشاهده تیکت‌های قبلی', 'ticket_view')]
      ]);
      
      await ctx.editMessageText('به بخش تیکت‌ها خوش آمدید. چه کاری می‌خواهید انجام دهید؟', ticketMenu);
    }
  } catch (error) {
    console.error('Error in ticket callbacks:', error);
    await ctx.answerCbQuery('خطایی رخ داد. لطفاً مجدداً تلاش کنید.');
  }
}

// Function to handle text input for creating tickets
export async function handleTicketInput(ctx: any, messageText: string, user: any) {
  try {
    // Get the user's current state
    const userBotState = await prisma.userBotState.findFirst({
      where: { telegramUserId: user.id }
    });

    if (!userBotState) {
      await ctx.reply('خطایی رخ داد. لطفاً مجدداً تلاش کنید.');
      return;
    }
    
    // Create new ticket
    const ticket = await prisma.userTicket.create({
      data: {
        telegramUserId: user.id,
        content: messageText,
        checked: false
      }
    });
    eventBus.emit(EVENTS.TICKET_CREATED, ticket);



    // Reset user state
    await prisma.userBotState.update({
      where: { id: userBotState.id }, 
      data: { state: TicketState.INITIAL }
    });
    
    const ticketMenu = Markup.inlineKeyboard([
      [Markup.button.callback('ثبت تیکت جدید', 'ticket_create')],
      [Markup.button.callback('مشاهده تیکت‌های قبلی', 'ticket_view')]
    ]);
    
    await ctx.reply('✅ تیکت شما با موفقیت ثبت شد. به زودی بررسی خواهد شد.', ticketMenu);
  } catch (error) {
    console.error('Error creating ticket:', error);
    await ctx.reply('خطایی در ثبت تیکت رخ داد. لطفاً مجدداً تلاش کنید.');
  }
}