package com.palmnest.service.property;

import com.palmnest.application.bean.Page;
import com.palmnest.application.bean.Pagenation;
import com.palmnest.application.dto.OrgComplexDTO;
import com.palmnest.application.dto.OrgDto;
import com.palmnest.application.dto.OutTreeDTO;
import com.palmnest.model.AppUserFloorRelation;
import com.palmnest.model.CompanyRelationOrg;
import com.palmnest.model.ScopeEntity;
import com.palmnest.model.User;
import com.palmnest.model.property.*;
import com.palmnest.service.GenericManager;
import org.hibernate.criterion.Criterion;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * 项目组织信息业务层接口
 *
 * @author yubing
 */
public interface PropertyManager extends GenericManager<Object, Integer> {

	/**
	 * 保存项目
	 *
	 * @param organizaiton 项目信息
	 * @param companyId    运营中心ID
	 * @return
	 */
	public boolean saveOrganization(User user, TbOrganization organizaiton, int companyId);

	/**
	 * 查询项目集合
	 */
	public List<TbOrganization> queryTbOrganizationList();

	/**
	 * 查询用户-楼宇-楼层关系List
	 */
	public List<AppUserFloorRelation> queryUserOrgFloorList();

	/**
	 * 根据ID 查询项目
	 */
	public TbOrganization getTbOrganizationById(Integer id);

	/**
	 * 根据项目编码 查询项目
	 *
	 * @param number 项目编码
	 */
	public TbOrganization getTbOrganizationByNumber(String number);

	/**
	 * 删除项目
	 */
	public void deleteTbOrganization(TbOrganization organization);

	/**
	 * 项目信息查询
	 *
	 * @param pageNo     当前页码
	 * @param filterList 过滤条件
	 * @return
	 */
	public Pagenation<TbOrganization> queryTbOrganizaitonPage(int pageNo, int pageSize,
															  List<Criterion> filterList);

	/**
	 * 批量导入项目资料信息
	 *
	 * @param stream     文件流
	 * @param controller 处理人
	 * @return
	 */
	public Map<String, Object> assiginBatchImportOrganization(InputStream stream, String controller);

	/**
	 * 批量存储企业综合资料信息
	 *
	 * @param datas
	 */
	public void saveBatchOrganization(List<OrgComplexDTO> datas);

	/**
	 * 楼栋信息查询
	 *
	 * @param pageNo   当前页码
	 * @param whereSQL 过滤条件
	 * @return 分页Pagenation
	 */
	public Page queryBuildListPage(int pageNo, int pageSize, String whereSQL);

	/**
	 * 根据ID 查询楼栋
	 */
	public TbBuild getTbBuildById(int buildId);

	/**
	 * 根据项目 查询楼栋集合
	 *
	 * @param organizationId
	 */
	public List<TbBuild> getTbBuildListByOrgaid(int organizationId);

	/**
	 * 物业组织-地址关系集合
	 *
	 * @param type
	 * @param orgId
	 */
	public List<BuildOrgRelation> getBuildOrgRelationList(String type, int orgId);

	/**
	 * @param queryType 查询类型（1-物业组织，2-部门团队）
	 * @param userId    管理员用户ID
	 * @param deptId    部门ID
	 * @param orgId     物业组织ID
	 */
	public List<OutTreeDTO> getOrganizationBuildTree(String queryType,
													 Integer userId, Integer deptId, Integer orgId);

	/**
	 * 查询指定运营中心所管辖项目树
	 *
	 * @param companyId 运营中心id
	 * @param userId    所选择修改用户的id
	 * @return
	 */
	public List<OutTreeDTO> getCompanyOrgTree(Integer companyId, Integer userId, User user);

	/**
	 * 查询系统用户管理的项目
	 *
	 * @param companyIdStr 物业组织ID
	 */
	public List<TbOrganization> getAppUserOrganizationRelation(
			String companyIdStr);

	/**
	 * 根据userid删除所有原本记录
	 *
	 * @param userId
	 */
	public void delectOrgFloorRelationByUserId(String userId);

	/**
	 * 查询物业组织
	 *
	 * @param organizationIdsStr
	 */
	public List<Map<String, Object>> getOrganizationList(
			String organizationIdsStr);

	/**
	 * 获取存在项目的城市集合
	 */
	public List<Map<String, Object>> getOrgExistCityList();

	/**
	 * 获取项目集合信息
	 *
	 * @param cityCode 城市编码
	 */
	public List<TbOrganization> getOrgByCityCode(String cityCode);

	/**
	 * 根据父节点查询所有子节点
	 *
	 * @param parentCode
	 */
	public List<VirtualArchitecture> getVirtualArchitectureList(
			String parentCode);

	/**
	 * 根据项目ID和类型查询 该项目下的子节点
	 *
	 * @param organizationId
	 * @param type
	 */
	public List<VirtualArchitecture> getVirtualArchitectureList(
			int organizationId, String type);

	/**
	 * 根据项目ID和类型查询 该项目下的子节点
	 *
	 * @param organizationId
	 * @param type
	 */
	public List<Map<String, Object>> getAddVirtualArchitectureList(
			int organizationId, String type);

	/**
	 * 批量导入企业资料信息
	 *
	 * @param organizationId 项目ID
	 * @param stream         文件流
	 */
	public Map<String, Object> assiginBatchImportArchitecture(
			String organizationId, InputStream stream, String controller);

	/**
	 * 批量存储企业资料信息
	 *
	 * @param datas
	 */
	public void saveBatchArchitecture(List<VirtualArchitecture> datas);

	/**
	 * 获取最大的虚拟组织ID
	 *
	 * @return Integer
	 */
	public Integer getMaxvirtualArchId();

	/**
	 * 获取客户编码
	 *
	 * @param organizationId
	 * @return
	 */
	public String getVirtualCustomerNo(int organizationId);

	/**
	 * 根据ID 查询虚拟组织
	 *
	 * @param vaitualId
	 * @return
	 */
	public VirtualArchitecture getVirtualArchitectureById(int vaitualId);

	/**
	 * 根据项目ID 查询虚拟组织集合
	 *
	 * @param organizationId 项目ID
	 */
	public List<VirtualArchitecture> getVirtualArchitectureList(
			int organizationId);

	/**
	 * 查询虚拟组织
	 *
	 * @param code       当前节点编码
	 * @param parentCode 父节点编码
	 */
	public VirtualArchitecture getVirtualArchBycode(String code,
													String parentCode);

	/**
	 * 根据签约的客户编号查询企业信息
	 *
	 * @param customerNumber 客户编号
	 */
	public VirtualArchitecture getVirtualArchitectureByCustomerNumber(
			String customerNumber);

	/**
	 * 根据企业编号或名称和项目权限集合查询信息
	 *
	 * @param paramValue
	 * @param organizationIds
	 */
	public List<Map<String, Object>> getVirtualarchitectureList(
			String paramValue, String organizationIds);

	/**
	 * 根据项目ID和类型和编码和名称条件查询 企业信息
	 */
	public List<Map<String, Object>> getVirtualArchitectureList(
			int organizationId, String type, String paramValue);

	/**
	 * 查询企业集合信息
	 *
	 * @param pageSize 每页数据条数
	 * @param pageNo   页码
	 * @param whereSQL 过滤的SQL
	 */
	public Page getVirtualArchitecturePage(int pageSize,
										   int pageNo, String whereSQL);

	/**
	 * 查询企业集合信息
	 *
	 * @param id 企业Id
	 */
	Map<String, Object> getVirtualArchitectureMap(String id);

	/**
	 * 保存或者更新企业信息
	 *
	 * @param virtualArch
	 */
	public Map<String, String> saveOrUpdateVirtualArch(VirtualArchitecture virtualArch, String status, String agent_id, String[] relationId, String[] rangeId);

	/**
	 * 保存或者更新企业信息
	 *
	 * @param virtual
	 */
	public void deleteVirtualArch(VirtualArchitecture virtual);

	/**
	 * 同步项目到一键服务平台
	 *
	 * @param organization
	 * @return
	 */
	public boolean assignAnsyOrganization(TbOrganization organization);

	/**
	 * 获取含有项目的城市列表
	 *
	 * @return
	 * @throws Exception
	 */
	public List<Map<String, Object>> getCityList() throws Exception;


	/**
	 * 保存或修改项目信息
	 *
	 * @param tbOrganization
	 * @return
	 * @throws Exception
	 */
	public Map<String, Object> saveUpdateOrganization(TbOrganization tbOrganization) throws Exception;


	/**
	 * 更新项目的审核状态
	 *
	 * @param organization
	 * @return
	 */
	public String updateOrganizationStatus(TbOrganization organization);

	/**
	 * 新增项目信息
	 * 来自微信用户的申请
	 */
	public String saveOrganizationFromApply(TbOrganization organization);

	/**
	 * 新增企业信息
	 * 来自微信用户的申请
	 */
	public String saveVirtualFromApply(VirtualArchitecture virtual);

	/**
	 * 根据企业名称和项目ID查询企业信息
	 *
	 * @param organizationId
	 * @param type
	 * @param paramValue
	 * @return
	 */
	public List<Map<String, Object>> getVirtualarchitectureList(String organizationId, String type, String paramValue);

	/**
	 * 根据城市名称筛选过滤
	 *
	 * @param paramValue
	 * @return
	 */
	public List<Map<String, Object>> getProvincecityByCityList(String paramValue, String orgIds);

	/**
	 * 根据项目名称或城市名称查询项目
	 *
	 * @param paramValue
	 * @param cityCode
	 * @return
	 */
	public List<Map<String, Object>> getOrganizationListByName(String paramValue, String cityCode, String orgIds);

	/**
	 * 根据省份查询
	 *
	 * @param province
	 * @return
	 */
	public List<Map<String, Object>> getProvincecityList(String province);

	/**
	 * 根据省份查询
	 *
	 * @param city
	 * @param province
	 * @return
	 */
	public Map<String, Object> getCityList(String city, String province);

	/**
	 * 根据名称和类型查询身份或者城市对象
	 *
	 * @param paramName
	 * @param type
	 * @return
	 */
	public ProvinceCity findProvinceCityByName(String paramName, String type);

	/**
	 * 查询省份或者城市集合信息
	 *
	 * @param type 1-表示省份，2-表示城市
	 * @param code 省份编码
	 * @return
	 */
	public List<ProvinceCity> getProvinceCityList(String type, String code);

	/**
	 * 根据项目以及楼宇名称查找楼宇
	 */
	public List<TbBuild> getBuildByOrgIdAndBuildName(int organizationId, String buildName);

	public CompanyRelationOrg getCompanyByOrgId(Integer orgId);

	/**
	 * 根据服务之窗项目id查询对应超级前台项目id
	 *
	 * @param id
	 * @return
	 */
	Integer getSuperDeskOrgId(Integer id);

	/**
	 * 存储企业和代理企业关系
	 *
	 * @param virtualArchitectureAgent
	 */
	void saveVirtualArchAgent(VirtualArchitectureAgent virtualArchitectureAgent);

	/**
	 * 根据id删除企业和代理企业关系
	 *
	 * @param id
	 */
	void deleteVirtualArchAgentById(Integer id);

	/**
	 * 根据代理企业id删除企业和代理企业关系
	 *
	 * @param agentId
	 */
	void deleteVirtualArchAgentByAgentId(Integer agentId);

	/**
	 * 存储企业和房间号关系
	 *
	 * @param virtualArchitectureRange
	 */
	void saveVirtualArchRange(VirtualArchitectureRange virtualArchitectureRange);

	/**
	 * 根据id删除企业和房间号关系
	 *
	 * @param id
	 */
	void deleteVirtualArchRangeById(Integer id);

	/**
	 * 根据用户经纬度获取最近项目
	 *
	 * @param scopeEntity
	 * @return
	 */
	List<OrgDto> getScopeOrgList(ScopeEntity scopeEntity, String developId);
}
