import type { NextApiRequest, NextApiResponse } from 'next';
import mysql from 'mysql2/promise';
import bcryptjs from 'bcryptjs';
import jwt from 'jsonwebtoken';

const pool = mysql.createPool({
  host: process.env.DB_HOST || 'localhost',
  user: process.env.DB_USER || 'root',
  password: process.env.DB_PASSWORD || '',
  database: process.env.DB_NAME || 'perfume_shop',
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0,
});

type ResponseData = {
  success?: boolean;
  message?: string;
  valid?: boolean;
  error?: string;
};

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse<ResponseData>
) {
  // GET - Ověř token
  if (req.method === 'GET') {
    const { token } = req.query;

    if (!token || typeof token !== 'string') {
      return res.status(400).json({ error: 'Token je povinný' });
    }

    try {
      const jwtSecret = process.env.JWT_SECRET;
      if (!jwtSecret) {
        throw new Error('JWT_SECRET is not configured');
      }

      // Ověř JWT token
      const decoded = jwt.verify(token, jwtSecret) as any;

      // Zkontroluj jestli token je typu password_reset
      if (decoded.type !== 'password_reset') {
        return res.status(400).json({
          valid: false,
          error: 'Neplatný typ tokenu',
        });
      }

      return res.status(200).json({
        success: true,
        valid: true,
        message: 'Token je platný',
      });
    } catch (error: any) {
      if (error.name === 'TokenExpiredError') {
        return res.status(400).json({
          valid: false,
          error: 'Reset odkaz vypršel. Požádejte o nový.',
        });
      }

      if (error.name === 'JsonWebTokenError') {
        return res.status(400).json({
          valid: false,
          error: 'Neplatný reset odkaz',
        });
      }

      return res.status(400).json({
        valid: false,
        error: 'Chyba při ověřování tokenu',
      });
    }
  }

  // POST - Reset hesla
  if (req.method === 'POST') {
    const { token, password } = req.body;

    // Validation
    if (!token || !password) {
      return res.status(400).json({ error: 'Token a heslo jsou povinné' });
    }

    if (password.length < 8) {
      return res.status(400).json({ error: 'Heslo musí mít alespoň 8 znaků' });
    }

    try {
      const jwtSecret = process.env.JWT_SECRET;
      if (!jwtSecret) {
        throw new Error('JWT_SECRET is not configured');
      }

      // Ověř token
      const decoded = jwt.verify(token, jwtSecret) as any;

      // Zkontroluj jestli token je typu password_reset
      if (decoded.type !== 'password_reset') {
        return res.status(400).json({
          error: 'Neplatný typ tokenu',
        });
      }

      const userId = decoded.id;

      const connection = await pool.getConnection();

      try {
        // Hash nové heslo
        const saltRounds = 10;
        const passwordHash = await bcryptjs.hash(password, saltRounds);

        // Aktualizuj heslo a smaž reset token
        const [result]: any = await connection.query(
          'UPDATE users SET password_hash = ?, reset_token = NULL, reset_token_expires = NULL WHERE id = ?',
          [passwordHash, userId]
        );

        // Zkontroluj jestli je uživatel updatován
        if (result.affectedRows === 0) {
          return res.status(400).json({
            error: 'Uživatel nebyl nalezen',
          });
        }

        return res.status(200).json({
          success: true,
          message: 'Heslo bylo úspěšně resetováno. Prosím přihlaste se novým heslem.',
        });
      } finally {
        connection.release();
      }
    } catch (error: any) {
      console.error('Reset password error:', error);

      // JWT errors
      if (error.name === 'TokenExpiredError') {
        return res.status(400).json({
          error: 'Reset odkaz vypršel. Požádejte o nový.',
        });
      }

      if (error.name === 'JsonWebTokenError') {
        return res.status(400).json({
          error: 'Neplatný reset odkaz',
        });
      }

      return res.status(500).json({
        error: 'Chyba při resetování hesla. Prosím zkuste znovu.',
      });
    }
  }

  return res.status(405).json({ error: 'Metoda není povolena' });
}
