import { BlogRepository } from '../../infrastructure/repositories/BlogRepository.js';

export class BlogController {
  constructor() {
    this.blogRepository = new BlogRepository();
  }

  async getAll(req, res) {
    try {
      const blogs = await this.blogRepository.findAll();
      res.json({
        success: true,
        data: blogs
      });
    } catch (error) {
      res.status(500).json({
        success: false,
        error: error.message
      });
    }
  }

  async getById(req, res) {
    try {
      const blog = await this.blogRepository.findById(req.params.id);
      if (!blog) {
        return res.status(404).json({
          success: false,
          error: 'Blog not found'
        });
      }
      res.json({
        success: true,
        data: blog
      });
    } catch (error) {
      res.status(500).json({
        success: false,
        error: error.message
      });
    }
  }

  async create(req, res) {
    try {
      const { title, content, published } = req.body;

      if (!title || !content) {
        return res.status(400).json({
          success: false,
          error: 'Title and content are required'
        });
      }

      const blog = await this.blogRepository.create({
        title,
        content,
        published: published || false,
        authorId: req.user.id
      });

      res.status(201).json({
        success: true,
        data: blog,
        message: 'Blog created successfully'
      });
    } catch (error) {
      res.status(500).json({
        success: false,
        error: error.message
      });
    }
  }

  async update(req, res) {
    try {
      const { title, content, published } = req.body;

      const updateData = {};
      if (title) updateData.title = title;
      if (content) updateData.content = content;
      if (typeof published !== 'undefined') updateData.published = published;

      const blog = await this.blogRepository.update(req.params.id, updateData);

      res.json({
        success: true,
        data: blog,
        message: 'Blog updated successfully'
      });
    } catch (error) {
      res.status(500).json({
        success: false,
        error: error.message
      });
    }
  }

  async delete(req, res) {
    try {
      await this.blogRepository.delete(req.params.id);

      res.json({
        success: true,
        message: 'Blog deleted successfully'
      });
    } catch (error) {
      res.status(500).json({
        success: false,
        error: error.message
      });
    }
  }
}
