package com.palmnest.dao.property;

import com.palmnest.application.bean.Page;
import com.palmnest.dao.GenericDao;
import com.palmnest.model.AppUserFloorRelation;
import com.palmnest.model.AppUserOrgnizationRelation;
import com.palmnest.model.CompanyRelationOrg;
import com.palmnest.model.ScopeEntity;
import com.palmnest.model.property.*;

import java.util.List;
import java.util.Map;

/**
 * 项目组织数据持久层接口
 *
 * @author yubing
 * @since 2017-1-9
 */
public interface PropertyDao extends GenericDao<Object, Integer> {

	/**
	 * 查询可用的所有项目
	 */
	public List<TbOrganization> queryTbOrganizationList();

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

	/**
	 * 查询项目
	 *
	 * @param id 项目ID
	 * @return
	 */
	public TbOrganization getTbOrganizationById(Integer id);

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

	/**
	 * 查询社区集合列表
	 *
	 * @param organizationName 社区名称
	 */
	public List<TbOrganization> queryTbOrganizationListByName(String organizationName);

	/**
	 * @param organizationID
	 */
	public List<TbBuild> getTbBuildListByOrgaid(int organizationID);

	/**
	 * 查询楼栋信息
	 */
	public TbBuild getTbBuildById(int id);

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

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

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

	/**
	 * @param
	 * @return
	 */
	public void delectOrgFloorRelationByUserId(String userId);

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

	/**
	 * 查询虚拟组织集合
	 *
	 * @param organizationId 项目ID
	 * @return
	 */
	public List<Map<String, Object>> getVirtualListBySelectCompany(int organizationId);

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

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

	/**
	 * 所有楼栋信息
	 * 查询楼栋地址集合
	 */
	public List<Map<String, Object>> getBuildList();

	/**
	 * 查询指定运营中心管辖项目
	 */
	public List<Map<String, Object>> getOrgListByCompany(Integer companyId);

	/**
	 * 查询指定用户所管辖项目
	 */
	public List<Map<String, Object>> getOrgListByUser(Long companyId);

	/**
	 * 根据物业组织-关联查询楼栋地址集合
	 *
	 * @param companyId 物业组织ID
	 */
	public List<Map<String, Object>> getBuildList(int companyId);

	/**
	 * 根据物业组织部门-关联查询楼栋地址集合
	 *
	 * @param deptId 物业组织部门ID
	 */
	public List<Map<String, Object>> getBuildListByDept(int deptId);

	/**
	 * 删除物业组织-楼栋之间的关联
	 *
	 * @param orgId
	 * @param orgType
	 */
	public void deleteBuildOrg(int orgId, String orgType);

	/**
	 * 删除项目公司关系
	 *
	 * @param orgId
	 */
	public void deleteCompanyOrg(int orgId);

	/**
	 * 查询物业组织集合
	 *
	 * @param companyIdStr
	 * @return
	 */
	public List<Map<String, Object>> getAppUserOrganizationRelation(String companyIdStr);

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

	/**
	 * 查询当前用户所管辖项目列表
	 *
	 * @param userId
	 * @return
	 */
	public List<AppUserOrgnizationRelation> getAppUserOrgRelationList(int userId);

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


	public List<Map<String, Object>> getAddVirtualArchitectureList(
			int organizationId, String type);

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

	/**
	 * 根据codeNumber查询项目是否存在
	 *
	 * @param codeNumber
	 * @return
	 */
	public TbOrganization getOrganization(String codeNumber);

	/**
	 * 查询公司是否存在
	 *
	 * @param codeNumber
	 * @return
	 */
	public VirtualArchitecture getVirtualArchitecture(String codeNumber);

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

	/**
	 * 根据企业客户编号——查询非virtualId的企业信息
	 *
	 * @param customerNumber 客户编号
	 * @param virtualId      企业ID
	 * @return
	 */
	public VirtualArchitecture getVirtualArchitectureByCustomerNumber(String customerNumber, int virtualId);

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

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

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

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

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

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

	/**
	 * 根据项目organizationId查询最大id的企业编号
	 *
	 * @return
	 */
	public String findCustomerNumberMaxId(String cityNameEng);

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

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

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

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

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

	/**
	 * 根据省份名称查询省份对象
	 *
	 * @param province
	 * @return
	 */
	public Map<String, Object> getProvincecityByName(String province);


	/**
	 * 根据省份名称和城市名称过滤城市
	 *
	 * @param province
	 * @return
	 */
	public List<Map<String, Object>> getCityList(String provinceCode);

	/**
	 * 根据省份名称和城市名称过滤城市
	 *
	 * @param province
	 * @return
	 */
	public List<Map<String, Object>> getCityList(String provinceCode, String city);

	/**
	 * 根据省份名称和城市名称过滤城市
	 *
	 * @param province
	 * @return
	 */
	public Map<String, Object> getCityObect(String provinceCode, String city);

	/**
	 * 根据名称和类型查询身份或者城市对象
	 *
	 * @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);

	/**
	 * 查询虚拟组织集合
	 *
	 * @param organizationId 项目ID
	 * @return
	 */
	public List<Map<String, Object>> getVirtualListBySettleMonth(int organizationId, String companyName);


	/**
	 * 查询虚拟组织集合
	 *
	 * @param organizationId 项目ID
	 * @return
	 */
	public List<Map<String, Object>> getVirtualListBySettleMonthAir(int organizationId, String companyName);

	Integer getSuperDeskOrgId(Integer id);

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

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

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

	void saveVirtualArchAgent(Integer id, Integer agent_id);

	List<TbOrganization> getScopeOrgList(ScopeEntity scopeEntity, String developId);
}
