#include "regionmaplayoutpixmapitem.h"

void RegionMapLayoutPixmapItem::draw() {
    if (!region_map) return;

    QImage image(region_map->pixelWidth(), region_map->pixelHeight(), QImage::Format_RGBA8888);

    QPainter painter(&image);
    for (int i = 0; i < region_map->tilemapSize(); i++) {
        QImage bottom_img = this->tile_selector->tileImg(region_map->getTile(i));
        QImage top_img(8, 8, QImage::Format_RGBA8888);
        if (region_map->squareHasMap(i)) {
            top_img.fill(Qt::gray);
        } else {
            top_img.fill(Qt::black);
        }
        int x = i % region_map->tilemapWidth();
        int y = i / region_map->tilemapWidth();
        QPoint pos = QPoint(x * 8, y * 8);
        painter.setOpacity(1);
        painter.drawImage(pos, bottom_img);
        painter.save();
        if (region_map->squareInLayout(x, y)) {
            painter.setOpacity(0.55);
        } else {
            painter.setOpacity(0.8);
        }
        
        painter.drawImage(pos, top_img);
        painter.restore();
    }
    painter.end();

    this->setPixmap(QPixmap::fromImage(image));
    this->drawSelection();
}

void RegionMapLayoutPixmapItem::select(int x, int y) {
    int index = this->region_map->getMapSquareIndex(x, y);
    SelectablePixmapItem::select(x, y, 0, 0);
    this->selectedTile = index;
    this->updateSelectedTile();

    emit selectedTileChanged(index);
}

void RegionMapLayoutPixmapItem::select(int index) {
    int x = index % this->region_map->tilemapWidth();
    int y = index / this->region_map->tilemapWidth();
    SelectablePixmapItem::select(x, y, 0, 0);
    this->selectedTile = index;
    this->updateSelectedTile();

    emit selectedTileChanged(index);
}

void RegionMapLayoutPixmapItem::highlight(int x, int y, int red) {
    this->highlightedTile = red;
    SelectablePixmapItem::select(x + this->region_map->padLeft(), y + this->region_map->padTop(), 0, 0);
    draw();
}

void RegionMapLayoutPixmapItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
    QPoint pos = this->getCellPos(event->pos());
    if (this->region_map->squareInLayout(pos.x(), pos.y())) {
        SelectablePixmapItem::mousePressEvent(event);
        this->updateSelectedTile();
        emit selectedTileChanged(this->selectedTile);
    }
}

void RegionMapLayoutPixmapItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
    mousePressEvent(event);
}

void RegionMapLayoutPixmapItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *) {}

void RegionMapLayoutPixmapItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event) {
    QPoint pos = this->getCellPos(event->pos());
    int tileId = this->region_map->getMapSquareIndex(pos.x(), pos.y());
    emit this->hoveredTileChanged(tileId);
}

void RegionMapLayoutPixmapItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *) {
    emit this->hoveredTileCleared();
}

void RegionMapLayoutPixmapItem::updateSelectedTile() {
    QPoint origin = this->getSelectionStart();
    this->selectedTile = this->region_map->getMapSquareIndex(origin.x(), origin.y());
    this->highlightedTile = -1;
    draw();
}