package pwc.taxtech.atms.service;

import java.util.List;

import pwc.taxtech.atms.dpo.EnterpriseAccountDto;
import pwc.taxtech.atms.dto.OperationResultDto;
import pwc.taxtech.atms.dto.epaccount.AccountMapDto;
import pwc.taxtech.atms.dto.epaccount.AccountMappingDto;
import pwc.taxtech.atms.dto.epaccount.EnterpriseAccountAndValidateInfo;
import pwc.taxtech.atms.dto.epaccount.EnterpriseAccountSetDto;
import pwc.taxtech.atms.entity.EnterpriseAccount;

public interface EnterpriseAccountService {

    /**
     * Get EnterpriseAccount
     * @param enterpriseAccountCode
     * @param accountSetId
     * @return EnterpriseAccount
     */
    EnterpriseAccount getEnterpriseAccount(String enterpriseAccountCode, String enterpriseAccountSetId);
    
	/**
	 * 获取标准科目列表
	 * @param enterpriseAccountSetId
	 * @return EnterpriseAccountAndValidateInfo
	 */
	EnterpriseAccountAndValidateInfo getListByEnterpriseAccountSetId(String enterpriseAccountSetId);
	
	/**
	 * 根据企业科目Id获取企业科目信息
	 * @param enterpriseAccountId
	 * @return The identifier.
	 */
	EnterpriseAccountDto getEnterpriseAccount(String enterpriseAccountId);
	
	/**
	 * 新增企业科目
	 * @param enterpriseAccountDto
	 * @return OperationResultDto<List<EnterpriseAccountDto>>
	 */
	OperationResultDto<List<EnterpriseAccountDto>> addEnterpriseAccount(EnterpriseAccountDto enterpriseAccountDto);
	
	
	/**
	 * 更新企业科目
	 * @param enterpriseAccountDto
	 * @return OperationResultDto<List<EnterpriseAccountDto>>
	 */
	OperationResultDto<List<EnterpriseAccountDto>> updateEnterpriseAccount(EnterpriseAccountDto enterpriseAccountDto);
	
	
	/**
	 * 手动对应或者取消的时候更新父级以及以上的状态, 对应父级科目
	 * @param enterpriseAccountCodeList - 当前操作的企业科目代码的列表
	 * @param enterpriseAccountSetId - 当前企业科目所在的企业账套Id
	 * @param industryId - 机构下的行业,主要用于区分标准科目
	 * @param orgId - 机构Id
	 * @param isToUpdateEvenExists - 是否覆盖
	 */
	void mapAccountUpdateParent(List<String> enterpriseAccountCodeList, String enterpriseAccountSetId, String industryId, String orgId, Boolean isToUpdateEvenExists);
	
	
	
	/**
	 * validate import excel format, data
	 * @param filePath
	 * @return
	 */
	OperationResultDto<List<EnterpriseAccountDto>> validateImportEnterpriseAccount(String filePath);
	
	/**
     * create enterprise account set and import list of enterprise accounts
     * @param enterpriseAccountSetName - Name of the enterprise account set
     * @param enterpriseAccountSetCode - Code of the enterprise account set
     * @param importData
     * @return
     */
	@SuppressWarnings("rawtypes")
	OperationResultDto addEnterpriseAccountSetAndImportData(String enterpriseAccountSetName, 
	        String enterpriseAccountSetCode, List<EnterpriseAccountDto> importData);
	
	/**
	 * Import enterprise accounts
	 * @param enterpriseAccountSetDto
	 * @param importData
	 * @return OperationResultDto
	 */
    @SuppressWarnings("rawtypes")
	OperationResultDto repeatImportEnterpriseAccountSet(EnterpriseAccountSetDto enterpriseAccountSetDto, List<EnterpriseAccountDto> importData);
	
	/**
	 * 删除重复企业科目
	 * @param enterpriseAccountSetDto
	 * @return
	 */
	@SuppressWarnings("rawtypes")
    OperationResultDto clearRepeatEnterpriseAccountList(EnterpriseAccountSetDto enterpriseAccountSetDto);

	List<AccountMappingDto> getAccountMappingOrg(String organizationId);

	List<EnterpriseAccountSetDto> getEnterpriseAccountSetListByOrgId(String orgId);

	List<EnterpriseAccountDto> getList(String epAccountSetId, String orgId, String filterType);

	OperationResultDto autoMap(String orgId, String accountSetId);

	OperationResultDto mapAccount(AccountMapDto accountMapDto);

	OperationResultDto clearMap(String[] epAccountIds, String orgId);

}