import json
from pathlib import Path
from datetime import datetime
from app.core.config import settings
from app.utils.helpers import generate_ticket_no
from app.schemas.ticket import TicketCreateRequest


class TicketService:
    def __init__(self) -> None:
        self.file_path = Path(settings.tickets_file)
        self._ensure_file()

    def _ensure_file(self) -> None:
        self.file_path.parent.mkdir(parents=True, exist_ok=True)
        if not self.file_path.exists():
            with open(self.file_path, "w", encoding="utf-8") as f:
                json.dump([], f, indent=2)

    def _read_tickets(self) -> list:
        with open(self.file_path, "r", encoding="utf-8") as f:
            return json.load(f)

    def _write_tickets(self, tickets: list) -> None:
        with open(self.file_path, "w", encoding="utf-8") as f:
            json.dump(tickets, f, indent=2)

    def create_ticket(self, payload: TicketCreateRequest) -> dict:
        tickets = self._read_tickets()
        ticket_no = generate_ticket_no()

        record = {
            "ticket_no": ticket_no,
            "user_name": payload.user_name,
            "subject": payload.subject,
            "description": payload.description,
            "issue_category": payload.issue_category,
            "issue_subcategory": payload.issue_subcategory,
            "device_name": payload.device_name,
            "priority": payload.priority,
            "status": "Open",
            "created_at": datetime.now().isoformat()
        }

        tickets.append(record)
        self._write_tickets(tickets)

        return record

    def list_tickets(self) -> list:
        return self._read_tickets()