import 'package:superport_v2/core/common/models/paginated_result.dart';

import '../entities/stock_transaction.dart';
import '../entities/stock_transaction_input.dart';

/// 재고 트랜잭션 저장소 인터페이스.
abstract class StockTransactionRepository {
  /// 재고 트랜잭션 목록을 조회한다.
  Future<PaginatedResult<StockTransaction>> list({
    StockTransactionListFilter? filter,
  });

  /// 재고 트랜잭션 단건을 조회한다.
  Future<StockTransaction> fetchDetail(
    int id, {
    List<String> include = const ['lines', 'customers', 'approval'],
  });

  /// 재고 트랜잭션을 생성한다.
  Future<StockTransaction> create(StockTransactionCreateInput input);

  /// 재고 트랜잭션을 수정한다.
  Future<StockTransaction> update(int id, StockTransactionUpdateInput input);

  /// 재고 트랜잭션을 삭제한다.
  Future<void> delete(int id);

  /// 삭제된 재고 트랜잭션을 복구한다.
  Future<StockTransaction> restore(int id);

  /// 재고 트랜잭션을 상신(submit)한다.
  ///
  /// [note]는 상태 전이 사유를 서버에 전달할 때 사용된다.
  Future<StockTransaction> submit(int id, {String? note});

  /// 재고 트랜잭션을 완료 처리한다.
  ///
  /// [note]는 상태 전이 사유를 서버에 전달할 때 사용된다.
  Future<StockTransaction> complete(int id, {String? note});

  /// 재고 트랜잭션을 승인 처리한다.
  ///
  /// [note]는 상태 전이 사유를 서버에 전달할 때 사용된다.
  Future<StockTransaction> approve(int id, {String? note});

  /// 재고 트랜잭션을 반려 처리한다.
  ///
  /// [note]는 상태 전이 사유를 서버에 전달할 때 사용된다.
  Future<StockTransaction> reject(int id, {String? note});

  /// 재고 트랜잭션을 취소 처리한다.
  ///
  /// [note]는 상태 전이 사유를 서버에 전달할 때 사용된다.
  Future<StockTransaction> cancel(int id, {String? note});
}

/// 재고 트랜잭션 라인 저장소 인터페이스.
abstract class TransactionLineRepository {
  /// 라인을 추가한다.
  Future<void> addLines(
    int transactionId,
    List<TransactionLineCreateInput> lines,
  );

  /// 라인 정보를 일괄 수정한다.
  Future<void> updateLines(
    int transactionId,
    List<TransactionLineUpdateInput> lines,
  );

  /// 단일 라인을 삭제한다.
  Future<void> deleteLine(int lineId);

  /// 삭제된 라인을 복구한다.
  Future<void> restoreLine(int lineId);
}

/// 재고 트랜잭션 고객 연결 저장소 인터페이스.
abstract class TransactionCustomerRepository {
  /// 고객 연결을 추가한다.
  Future<void> addCustomers(
    int transactionId,
    List<TransactionCustomerCreateInput> customers,
  );

  /// 고객 연결 정보를 수정한다.
  Future<void> updateCustomers(
    int transactionId,
    List<TransactionCustomerUpdateInput> customers,
  );

  /// 고객 연결을 삭제한다.
  Future<void> deleteCustomer(int customerLinkId);
}
