from datetime import datetime, timezone
import enum

from Copilot.SituationLayer.Core.IncidentEvents import IncidentEvents
from Copilot.SituationLayer.Core.Incident import IncidentSeverity

from extensions import db


class IncidentModel(db.Model):

    __tablename__ = "incidents"

    id = db.Column(
        db.String(36),
        primary_key=True
    )

    incident_type = db.Column(
        db.Enum(
            IncidentEvents,
            values_callable=lambda x: [e.value for e in x]
        ),
        nullable=False,
        index=True
    )

    severity = db.Column(
        db.Enum(
            IncidentSeverity,
            values_callable=lambda x: [e.value for e in x]
        ),
        nullable=False,
        index=True
    )

    machine_id = db.Column(
        db.Integer,
        db.ForeignKey("machines.id"),
        nullable=False,
        index=True
    )

    trigger_parameter_id = db.Column(
        db.String(36),
        db.ForeignKey("parameters.id"),
        nullable=False,
        index=True
    )

    trigger_value = db.Column(
        db.Float,
        nullable=False
    )

    trigger_timestamp = db.Column(
        db.DateTime,
        nullable=False,
        index=True
    )

    summary = db.Column(
        db.Text
    )

    payload = db.Column(
        db.JSON,
        nullable=False
    )

    created_at = db.Column(
        db.DateTime,
        default=datetime.utcnow
    )



class IncidentStatusEnum(enum.Enum):
    CREATED = "created"
    CONFIRMED = "confirmed"
    ANALYZING = "analyzing"
    COMPLETED = "completed"
    FAILED = "failed"





class IncidentAnalysisModel(db.Model):
    __tablename__ = "incident_analyses"

    id = db.Column(
        db.String(36),
        primary_key=True
    )

    incident_id = db.Column(
        db.String(36),
        db.ForeignKey(
            "incidents.id",
            ondelete="CASCADE"
        ),
        nullable=False,
        index=True
    )

    status = db.Column(
        db.Enum(
            IncidentStatusEnum,
            values_callable=lambda x: [e.value for e in x]
        ),
        nullable=False,
        index=True,
        default=IncidentStatusEnum.COMPLETED
    )

    analysis_json = db.Column(
        db.JSON,
        nullable=False
    )

    llm_context = db.Column(
        db.JSON,
        nullable=True
    )

    created_at = db.Column(
        db.DateTime,
        default=datetime.utcnow,
        nullable=False
    )