const Category = require('../models/Category');
const SubCategory = require('../models/SubCategory');

exports.getAllCategories = async (req, res) => {
  try {
    const categories = await Category.getAll();
    res.json(categories);
  } catch (error) {
    console.error('Get all categories error:', error);
    res.status(500).json({ message: 'Kategoriler alınırken hata oluştu' });
  }
};

exports.getActiveCategories = async (req, res) => {
  try {
    const categories = await Category.getActive();
    res.json(categories);
  } catch (error) {
    console.error('Get active categories error:', error);
    res.status(500).json({ message: 'Kategoriler alınırken hata oluştu' });
  }
};

exports.getCategoryById = async (req, res) => {
  try {
    const category = await Category.getById(req.params.id);
    if (!category) {
      return res.status(404).json({ message: 'Kategori bulunamadı' });
    }
    res.json(category);
  } catch (error) {
    console.error('Get category error:', error);
    res.status(500).json({ message: 'Kategori alınırken hata oluştu' });
  }
};

exports.getCategoryBySlug = async (req, res) => {
  try {
    const category = await Category.getBySlug(req.params.slug);
    if (!category) {
      return res.status(404).json({ message: 'Kategori bulunamadı' });
    }
    res.json(category);
  } catch (error) {
    console.error('Get category by slug error:', error);
    res.status(500).json({ message: 'Kategori alınırken hata oluştu' });
  }
};

exports.getCategoryWithSubCategories = async (req, res) => {
  try {
    const category = await Category.getWithSubCategories(req.params.id);
    if (!category) {
      return res.status(404).json({ message: 'Kategori bulunamadı' });
    }
    res.json(category);
  } catch (error) {
    console.error('Get category with subcategories error:', error);
    res.status(500).json({ message: 'Kategori alınırken hata oluştu' });
  }
};

exports.createCategory = async (req, res) => {
  try {
    const { name, slug, description, image_url, status, display_order } = req.body;

    if (!name || !slug) {
      return res.status(400).json({ message: 'Ad ve slug alanları zorunludur' });
    }

    // Check if slug already exists in subcategories
    const subCategoryWithSlug = await SubCategory.getBySlug(slug);
    if (subCategoryWithSlug) {
      return res.status(400).json({ message: 'Bu slug alt kategoride kullanılıyor. Lütfen farklı bir slug seçin.' });
    }

    const categoryId = await Category.create({
      name,
      slug,
      description,
      image_url,
      status,
      display_order
    });

    res.status(201).json({
      message: 'Kategori başarıyla oluşturuldu',
      categoryId
    });
  } catch (error) {
    console.error('Create category error:', error);
    if (error.code === 'ER_DUP_ENTRY') {
      return res.status(400).json({ message: 'Bu slug zaten kullanımda' });
    }
    res.status(500).json({ message: 'Kategori oluşturulurken hata oluştu' });
  }
};

exports.updateCategory = async (req, res) => {
  try {
    const { name, slug, description, image_url, status, display_order } = req.body;

    if (!name || !slug) {
      return res.status(400).json({ message: 'Ad ve slug alanları zorunludur' });
    }

    // Check if slug already exists in subcategories
    const subCategoryWithSlug = await SubCategory.getBySlug(slug);
    if (subCategoryWithSlug) {
      return res.status(400).json({ message: 'Bu slug alt kategoride kullanılıyor. Lütfen farklı bir slug seçin.' });
    }

    const updated = await Category.update(req.params.id, {
      name,
      slug,
      description,
      image_url,
      status,
      display_order
    });

    if (!updated) {
      return res.status(404).json({ message: 'Kategori bulunamadı' });
    }

    res.json({ message: 'Kategori başarıyla güncellendi' });
  } catch (error) {
    console.error('Update category error:', error);
    if (error.code === 'ER_DUP_ENTRY') {
      return res.status(400).json({ message: 'Bu slug zaten kullanımda' });
    }
    res.status(500).json({ message: 'Kategori güncellenirken hata oluştu' });
  }
};

exports.deleteCategory = async (req, res) => {
  try {
    const deleted = await Category.delete(req.params.id);

    if (!deleted) {
      return res.status(404).json({ message: 'Kategori bulunamadı' });
    }

    res.json({ message: 'Kategori başarıyla silindi' });
  } catch (error) {
    console.error('Delete category error:', error);
    res.status(500).json({ message: 'Kategori silinirken hata oluştu' });
  }
};
