import TaxiMapService from '../services/taxiMapService.js';

class TaxiMapController {
  constructor() {
    this.taxiMapService = new TaxiMapService();
    
    // Bind all methods to the class instance
    this.getMapTypes = this.getMapTypes.bind(this);
    this.getMaps = this.getMaps.bind(this);
    this.getMapById = this.getMapById.bind(this);
    this.getDefaultMap = this.getDefaultMap.bind(this);
    this.createMap = this.createMap.bind(this);
    this.updateMap = this.updateMap.bind(this);
    this.deleteMap = this.deleteMap.bind(this);
    this.setDefaultMap = this.setDefaultMap.bind(this);
  }

  async getMapTypes(req, res) {
    try {
      const mapTypes = await this.taxiMapService.getMapTypes();
      res.json({ success: true, data: mapTypes });
    } catch (error) {
      console.error('Error getting map types:', error);
      res.status(500).json({ success: false, message: 'Fehler beim Laden der Map-Typen' });
    }
  }

  async getMaps(req, res) {
    try {
      const maps = await this.taxiMapService.getMaps();
      res.json({ success: true, data: maps });
    } catch (error) {
      console.error('Error getting maps:', error);
      res.status(500).json({ success: false, message: 'Fehler beim Laden der Maps' });
    }
  }

  async getMapById(req, res) {
    try {
      const { mapId } = req.params;
      const map = await this.taxiMapService.getMapById(mapId);
      
      if (!map) {
        return res.status(404).json({ success: false, message: 'Map nicht gefunden' });
      }
      
      res.json({ success: true, data: map });
    } catch (error) {
      console.error('Error getting map by ID:', error);
      res.status(500).json({ success: false, message: 'Fehler beim Laden der Map' });
    }
  }


  async getDefaultMap(req, res) {
    try {
      const map = await this.taxiMapService.getDefaultMap();
      
      if (!map) {
        return res.status(404).json({ success: false, message: 'Keine Standard-Map gefunden' });
      }
      
      res.json({ success: true, data: map });
    } catch (error) {
      console.error('Error getting default map:', error);
      res.status(500).json({ success: false, message: 'Fehler beim Laden der Standard-Map' });
    }
  }

  async createMap(req, res) {
    try {
      const mapData = req.body;
      const map = await this.taxiMapService.createMap(mapData);
      res.status(201).json({ success: true, data: map });
    } catch (error) {
      console.error('Error creating map:', error);
      res.status(500).json({ success: false, message: 'Fehler beim Erstellen der Map' });
    }
  }

  async updateMap(req, res) {
    try {
      const { mapId } = req.params;
      const updateData = req.body;
      const map = await this.taxiMapService.updateMap(mapId, updateData);
      res.json({ success: true, data: map });
    } catch (error) {
      console.error('Error updating map:', error);
      if (error.message === 'Map not found') {
        return res.status(404).json({ success: false, message: 'Map nicht gefunden' });
      }
      res.status(500).json({ success: false, message: 'Fehler beim Aktualisieren der Map' });
    }
  }

  async deleteMap(req, res) {
    try {
      const { mapId } = req.params;
      await this.taxiMapService.deleteMap(mapId);
      res.json({ success: true, message: 'Map erfolgreich gelöscht' });
    } catch (error) {
      console.error('Error deleting map:', error);
      if (error.message === 'Map not found') {
        return res.status(404).json({ success: false, message: 'Map nicht gefunden' });
      }
      res.status(500).json({ success: false, message: 'Fehler beim Löschen der Map' });
    }
  }

  async setDefaultMap(req, res) {
    try {
      const { mapId } = req.params;
      await this.taxiMapService.setDefaultMap(mapId);
      res.json({ success: true, message: 'Standard-Map erfolgreich gesetzt' });
    } catch (error) {
      console.error('Error setting default map:', error);
      if (error.message === 'Map not found') {
        return res.status(404).json({ success: false, message: 'Map nicht gefunden' });
      }
      res.status(500).json({ success: false, message: 'Fehler beim Setzen der Standard-Map' });
    }
  }
}

export default TaxiMapController;
