"""Warranty plugin main class.

Asset-general plugin: owns its warranties + warrantyassets tables, an API
surface, and a sidebar entry. Not tied to any one asset type - a warranty can
cover a PC, printer, network device, or equipment.
"""

import json
import logging
from pathlib import Path
from typing import List, Dict, Optional, Type

from flask import Flask, Blueprint

from shopdb.plugins.base import BasePlugin, PluginMeta

from .api import warranty_bp
from .models import Warranty, WarrantyAsset

logger = logging.getLogger(__name__)


class WarrantyPlugin(BasePlugin):
    """Warranty tracking plugin."""

    def __init__(self):
        self._manifest = self._load_manifest()

    def _load_manifest(self) -> Dict:
        manifest_path = Path(__file__).parent / 'manifest.json'
        if manifest_path.exists():
            with open(manifest_path, 'r') as f:
                return json.load(f)
        return {}

    @property
    def meta(self) -> PluginMeta:
        return PluginMeta(
            name=self._manifest.get('name', 'warranty'),
            version=self._manifest.get('version', '1.0.0'),
            description=self._manifest.get('description', 'Asset warranty tracking'),
            author=self._manifest.get('author', 'ShopDB Team'),
            dependencies=self._manifest.get('dependencies', []),
            core_version=self._manifest.get('core_version', '>=0.2.0,<1.0.0'),
            api_prefix=self._manifest.get('api_prefix', '/api/warranty'),
        )

    def get_blueprint(self) -> Optional[Blueprint]:
        return warranty_bp

    def get_models(self) -> List[Type]:
        return [Warranty, WarrantyAsset]

    def get_navigation_items(self) -> List[Dict]:
        return [
            {
                'name': 'Warranties',
                'icon': 'shield',
                'route': '/warranties',
                'position': 8,
            },
        ]

    def init_app(self, app: Flask, db_instance) -> None:
        logger.info(f"Warranty plugin initialized (v{self.meta.version})")
