package jp.agentec.sinaburocast.service;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeMap;

import javax.annotation.Resource;

import jp.agentec.sinaburocast.action.admin.member.MemberSearchAction;
import jp.agentec.sinaburocast.common.SinaburoConstant;
import jp.agentec.sinaburocast.csv.OrganizationCsv;
import jp.agentec.sinaburocast.dto.OrganizationDto;
import jp.agentec.sinaburocast.dxo.OrganizationDxo;
import jp.agentec.sinaburocast.entity.AdminUser;
import jp.agentec.sinaburocast.entity.Organization;
import jp.agentec.sinaburocast.entity.PointDonation;
import jp.agentec.sinaburocast.form.admin.support.OrganizationSearchForm;

import org.apache.velocity.tools.generic.DateTool;
import org.seasar.framework.beans.util.Beans;
import org.seasar.framework.container.annotation.tiger.Component;
import org.seasar.framework.container.annotation.tiger.InstanceType;
import org.seasar.framework.util.StringUtil;

@Component(instance=InstanceType.SINGLETON)
public class OrganizationService extends AbstractService<Organization> {


	public static final String ID_SEQ_NAME = "organization_id_seq";

	public PointDonationService pointDonationService;
	public MemberService memberService;
	public EnqueteService enqueteService;
	
	@Resource
	public OrganizationDxo organizationDxo;

	/**
	 * IDを発行して、登録する。
	 */
	public int insertOrganization(Organization organization, String insId) {
		organization.organizationId=
			getSeqNextVal(Integer.class, ID_SEQ_NAME);
		return super.insert(organization, insId);
	}


    public Organization findById(Integer organizationId) {
        return select().id(organizationId).getSingleResult();
    }

    public List<Organization> findAllOrderById() {
        return select().orderBy("organizationId asc").getResultList();
    }

    public List<Organization> findAllOrderByNo() {
        return select().orderBy("organizationNo asc").getResultList();
    }

    /**
     * 団体一覧を検索する。
     * @param organizationSearchForm
     * @return
     */
	public ArrayList<OrganizationDto> findAllByPaging(OrganizationSearchForm organizationSearchForm) {

		// 件数取得
		Long counter = select().getCount();
		organizationSearchForm.setPaging(null, organizationSearchForm.pageNo, counter);

		// 結果取得
		ArrayList<OrganizationDto> organizationDtoList = (ArrayList<OrganizationDto>)organizationDxo.convert(select().orderBy("organizationId asc").offset(organizationSearchForm.getOffSet("")).limit(organizationSearchForm.getLimit("")).getResultList());

		// 合計ポイント算出
		for (OrganizationDto organizationDto : organizationDtoList) {
			Integer pointSum = pointDonationService.findPointSumByOrganizationId(organizationDto.organizationId);
			if (pointSum == null) {
				organizationDto.pointSum = 0;
			} else {
				organizationDto.pointSum = pointSum;
			}
		}

		return organizationDtoList;
	}

    /**
     * 市民活動団体一括登録
     * ポイント寄付情報「t_point_donation」を全削除する。
     * 団体マスタ「m_organization」を前削除する。
     * CSVデータにもとづいて団体マスタ「m_organization」を登録する。
     * @return
     */
    public int organizationShelfRegist(List<OrganizationCsv> organizationCsvList,AdminUser adminUserInfo) {
    	//市民活動団体全部削除
    	List<Organization> organizationList = this.findAllOrderById();
    	for (Organization organization : organizationList) {
    		delete(organization);
		}
    	//ポイント寄付情報全部削除
    	List<PointDonation> pointDonationList  = pointDonationService.findAll();
    	for (PointDonation pointDonation : pointDonationList) {
    		pointDonationService.delete(pointDonation);
		}



    	int totalCount =0;
    	for (int i=0;i<organizationCsvList.size();i++) {

    		OrganizationCsv organizationCsv = organizationCsvList.get(i);

    		if(StringUtil.equals("NG", organizationCsv.okNg)){
    			continue;
    		}
    		Organization organization = Beans.createAndCopy( Organization.class,organizationCsv).execute();

    		totalCount += insertOrganization(organization, adminUserInfo.loginId);
		}

    	return totalCount;

    }

    /**
     * 団体一覧・ポイント寄付情報を返す。
     * @param organizationSearchForm
     * @return
     */
    public  List<Organization> getFindAllAndDonation(){
    	return select().leftOuterJoin("pointDonationList").orderBy("organizationNo asc,insId asc").getResultList();
    }


    public String getOrganizationForCsv(OrganizationSearchForm organizationSearchForm,MemberSearchAction memberSearchAction ) throws UnsupportedEncodingException, Exception{
    	StringBuilder headerSb = new StringBuilder();
		StringBuilder dataSb = new StringBuilder();

		//List<BeanMap> enqueteResultList = null;//getEnqueteResult(enqueteId);
		List<Organization> organizationList = getFindAllAndDonation();

		//日時			団体番号					団体名				付与ポイント数
		if(organizationList.isEmpty()){
			return "";
		}

		ArrayList<Integer> memberIdList = new ArrayList<Integer>();
		DateTool dateTool = new DateTool();

		//データ設定
		for (int i = 0; i < organizationList.size(); i++) {
			Organization data = organizationList.get(i);

			if(i == 0){
				headerSb.append("日時\t");
				headerSb.append("団体番号\t");
				headerSb.append("団体名\t");
				headerSb.append("付与ポイント数\t");
				headerSb.append("{{{0}}}");
			}


			//String  insertDate = dateTool.format("yyyy/MM/dd HH:mm:ss", data.insertDate);
			Integer organizationNo = data.organizationNo;
			String  organizationName = data.organizationName;

			for(int j=0 ;
					data.pointDonationList != null && j < data.pointDonationList.size();
					j++){
				PointDonation pointDonation = data.pointDonationList.get(j);
				String pointInsertDate = dateTool.format("yyyy/MM/dd HH:mm:ss", pointDonation.insertDate);
				Integer pointPointNum = pointDonation.pointNum;
				Integer pointMemberId = pointDonation.memberId;

				dataSb.append(pointInsertDate+"\t");
				dataSb.append(organizationNo+"\t");
				dataSb.append(organizationName+"\t");
				dataSb.append(pointPointNum+"\t");
				dataSb.append("{{{"+pointMemberId+"}}}\r\n");

				if(!memberIdList.contains(pointMemberId)){
					memberIdList.add(pointMemberId);
				}

			}
		}

		/**会員情報取得*/
		String memberInfo = enqueteService.getMemberDownloadContents(memberService.getMemberList(memberIdList),false, true);
		memberInfo = memberInfo.replace("\"", "");

		String [] lines = memberInfo.split(SinaburoConstant.newLine.RN);
		memberInfo = null;
		TreeMap<String,String> lineMap = new TreeMap<String,String>();
		for(int i=1;i<lines.length;i++){
			String [] line = lines[i].split("\t");
			lineMap.put(line[0],lines[i]);
		}

		headerSb.append(SinaburoConstant.newLine.RN+dataSb);
		String result = headerSb.toString();

		result=result.replace("{{{0}}}", lines[0]);

		java.util.Iterator ite = lineMap.entrySet().iterator();
		while (ite.hasNext()){
		    Object o = ite.next();
		    java.util.Map.Entry ent = (java.util.Map.Entry)o;
		    result=result.replace("{{{"+ent.getKey().toString()+"}}}",(String)ent.getValue());
		}

		return result;

    }



//    public static void main(String[] args) {
//    	System.out.println(getClipboardString());
//    	setClipboardString("asdf");
//    	System.out.println(getClipboardString());
//	}



}