from flask import abort

from database import db
from models.issue import Issue
from models.project_issue import ProjectIssue


def list_project_issues(project_id):
    """Lista as issues do projeto, mais recentes primeiro (join via ProjectIssue)."""
    return (
        Issue.query.join(ProjectIssue, ProjectIssue.issue_id == Issue.id)
        .filter(ProjectIssue.project_id == project_id)
        .order_by(Issue.created_at.desc())
        .all()
    )


def create_issue(project_id, title, description):
    """Cria a issue e grava o vínculo (project_id, issue_id). Retorna a issue."""
    issue = Issue(title=title, description=description)
    db.session.add(issue)
    db.session.flush()  # garante issue.id antes do vínculo

    db.session.add(ProjectIssue(project_id=project_id, issue_id=issue.id))
    db.session.commit()
    return issue


def get_issue(issue_id):
    """Retorna a issue ou 404."""
    return db.get_or_404(Issue, issue_id)


def update_issue(issue_id, title, description):
    """Atualiza title/description da issue e salva. Retorna a issue."""
    issue = get_issue(issue_id)
    issue.title = title
    issue.description = description
    db.session.commit()
    return issue
