from abc import ABCMeta, abstractmethod
from datetime import datetime

from production.model import ProductionOrder
from typing import (
    List,
    Dict,
)


class ProductionRepository(object):
    __metaclass__ = ABCMeta

    @abstractmethod
    def save_order(self, order):
        # type: (ProductionOrder) -> None

        raise NotImplementedError()

    def get_all_orders(self):
        # type: () -> List[ProductionOrder]

        raise NotImplementedError()

    def get_orders_to_purge(self, limit_date):
        # type: (datetime) -> List[ProductionOrder]

        raise NotImplementedError()

    def purge_orders(self, orders):
        # type: (List[ProductionOrder]) -> None

        raise NotImplementedError()

    def stop(self):
        # type: () -> None

        raise NotImplementedError()

    @abstractmethod
    def save_pick_list_order(
        self,
        order_id,           # type: int
        order_id_count,     # type: str
        jit,                # type: str
        course,             # type: str
        receipt,            # type: str
        status,             # type: bool
    ):
        # type: (...) -> None

        raise NotImplementedError()

    def get_all_pick_list_orders(
        self,
        orders_list,  # type: List[str]
    ):
        # type: (...) -> Dict

        raise NotImplementedError()

    def get_data_pick_list_order(
        self,
        pick_list_order_id,  # type: int
    ):
        # type: (...) -> str

        raise NotImplementedError()
