"""$Name plugin main class.

$description
"""

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 shopdb.core.models import AssetType
from shopdb.extensions import db

from .models import $Name
from .api import ${name}_bp

logger = logging.getLogger(__name__)


class ${Name}Plugin(BasePlugin):
    """$Name plugin.

    $description
    """

    def __init__(self):
        manifest_path = Path(__file__).parent / 'manifest.json'
        with open(manifest_path) as f:
            self._manifest = json.load(f)

    @property
    def meta(self) -> PluginMeta:
        return PluginMeta(
            name=self._manifest['name'],
            version=self._manifest['version'],
            description=self._manifest['description'],
            author=self._manifest.get('author', ''),
            dependencies=self._manifest.get('dependencies', []),
            core_version=self._manifest.get('core_version', '>=0.1.0'),
            api_prefix=self._manifest.get('api_prefix'),
        )

    def get_blueprint(self) -> Optional[Blueprint]:
        return ${name}_bp

    def get_models(self) -> List[Type]:
        return [$Name]

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

    def on_install(self, app: Flask) -> None:
        with app.app_context():
            self._ensure_asset_type()
            logger.info('$Name plugin installed')

    def _ensure_asset_type(self) -> None:
        existing = AssetType.query.filter_by(assettype='$name').first()
        if not existing:
            asset_type = AssetType(
                assettype='$name',
                pluginname='$name',
                tablename='$name',
                description=self.meta.description,
            )
            db.session.add(asset_type)
            db.session.commit()
            logger.debug('Created asset type: $name')
