public without sharing class StartTradingController {

    /** リードID */
    public String leadId{get;set;}
    
    /** リード */
    public Lead lead{get;set;}
    
    /** リードOnwer */
    public User leadOnwer{get; set;}

    public String staticResource {get; set;}

    /** コンストラクタ */
    public StartTradingController(ApexPages.StandardController controller){
        // リードID設定
        this.leadId = system.currentPageReference().getParameters().get('leadId');
        System.debug('this.leadId'+this.leadId);
        this.SI_Flg = false;
        staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact')); 
    }
    
    /** 引合ID */
    public String oppID{get;set;}
    
    /** 診療科選択値 */
    public String sltDep{get;set;}
    /** 診療科選択リスト */
    public List<SelectOption> depList{get;set;}
    
    /** 担当者Map */
    public Map<String,List<SelectOption>> conMap{get;set;}
    /** 担当者選択値 */
    public String sltCon{get;set;}
    /** 担当者選択リスト */
    public List<SelectOption> conList{get;set;}
    /** SI引合*/
    public Boolean SI_Flg{get;set;}

    /** 「なし」ラベル [Chinese:--无--] */
    public static final String NONE = system.label.StartTrading_None;
    public static Boolean EscapeLeadUpdate = false;
    /** パラメータキー：病院 */
    static final String P_HOSPITAL = system.label.StartTrading_P_Hospital;
    
    /** パラメータキー：戦略科室分類 */
    static final String P_DEPT = system.label.StartTrading_P_Dept;
    
    /** パラメータキー：名称（診療科） */
    static final String P_NAME = system.label.StartTrading_P_Name;
    
    /** パラメータキー：引合情報元 */
    static final String P_LEADS = system.label.StartTrading_P_Leadsource;
    
    /** パラメータキー：その他学会 */
    static final String P_SOCIETY = system.label.StartTrading_P_Society;
    
    /** パラメータキー：主キャンペーン */
    static final String P_CAMPAIGN = system.label.StartTrading_P_Campaign;
    
    /** レコードタイプ：引合 */
    static final String RC_OPP = '引合';

     /** レコードタイプ：引合 */
    private String Opptype = '';
    
    /** エラーメッセージ：引合作成権限がない場合 **/
    static final String ERROR_MSG_NONE_AUTHORITY = system.label.Error_Message26;
    
    /** 販売店から引合をConvertするフラグ **/
    private Boolean isAgencyOpp = false;


    
    /** 初期処理 */
    public void init(){
        // リード情報を取得  
        this.lead = [select id,SI_OppoLeadSec__c,owner_not_automatically_update__c, Hospital_Name__c, Opportunity_stage__c,Hospital_Name__r.RecordType.DeveloperName, Hospital_Name__r.Parent.RecordType.DeveloperName,
                     LastName, FirstName, LeadSource, Other_Society__c, Opp_Name__c, Purchase_Reason__c, Trade__c, Sales_Root__c,
                     Close_Forecasted_Date__c, Competitor__c, Hospital_Budget__c, Promise_Class__c, Dicision_Maker__c, Purchase_Type__c,
                     Sales_Method__c, Fund_Basis__c, OwnerId, Wholesale_Price__c, Lead_No__c,Inquiry_Num__c,CreatedDate,CreatedById
                     from Lead where id =: this.leadId];
                     
        // 診療科選択リストの取得（条件：病院=リード情報の病院名称）
        List<Account> departmentList = new List<Account>();
        if (this.lead.Hospital_Name__r.RecordType.DeveloperName == 'HP') {
            departmentList = [select id, name from Account where Hospital__c =: this.lead.Hospital_Name__c];
        }
        else if (this.lead.Hospital_Name__r.Parent.RecordType.DeveloperName == 'HP') {
            departmentList = [select id, name from Account where ParentId =: this.lead.Hospital_Name__c];
        }
        /*
        // xudan 20140730 販売店を選択する場合、下の契約一覧を出す
        // TODO 契約状態を見る？
        else if (this.lead.Hospital_Name__r.RecordType.DeveloperName == 'Agency') {
            departmentList = [select id, name from Account where ParentId =: this.lead.Hospital_Name__c];
            isAgencyOpp = true;
        }
        */
        // xudan 20140730 契約を選択する場合、そのまま出す、フラグ設定
        else if (this.lead.Hospital_Name__r.Parent.RecordType.DeveloperName == 'Agency') {
            departmentList = [select id, name from Account where Id =: this.lead.Hospital_Name__c];
            isAgencyOpp = true;
        }
        else {
            departmentList = [select id, name from Account where Id =: this.lead.Hospital_Name__c];
        }
        // 診療科選択リストの設定
        this.depList = new List<SelectOption>();
        this.depList.add(new SelectOption(NONE, NONE));
        Set<ID> depIdList = new Set<ID>();
        for(Account d : departmentList){
            depIdList.add(d.id);
            this.depList.add(new SelectOption(String.valueOf(d.get('id')),String.valueOf(d.get('name'))));
        }
        this.sltDep = NONE;
        
        // 担当者リスト（初期設定）
        this.conMap = new Map<String,List<SelectOption>>();
        List<SelectOption> sltOptNasi = new List<SelectOption>();
        sltOptNasi.add(new SelectOption(NONE, NONE));
        this.conMap.put(NONE, sltOptNasi);
        this.conList = sltOptNasi;
        
        // 担当者リストの取得
        List<Contact> contactList = [select id, name, AccountId from Contact where AccountId =: depIdList];
        for(Contact c : contactList){
            // 診療科ごとに「NONE」選択リストを設定
            List<SelectOption> sltOptInit = new List<SelectOption>();
            sltOptInit.add(new SelectOption(NONE, NONE));
            this.conMap.put(c.AccountId,sltOptInit);
        }
        
        List<SelectOption> conSltList = new List<SelectOption>();
        for(Contact c : contactList){
            // 診療科ごとに選択リストを再設定
            conSltList = this.conMap.get(c.AccountId);
            conSltList.add(new SelectOption(c.id, c.name));
            this.conMap.put(c.AccountId, conSltList);
        }
        
        // リード所有者の取得
        this.leadOnwer = [select Province_Text__c from User where Id = :this.lead.OwnerId];
        
        this.oppID = null;
    }
    
    /** 診療科選択リスト変更イベント */
    public void depChange(){
        // 診療科選択値によって、担当者選択リストを入れ替える
        this.conList = this.conMap.get(sltDep); 
    }
    
    /** キャンセルボタン  **/
    public Pagereference cancel(){
        return new Pagereference(URL.getSalesforceBaseUrl().toExternalForm() + '/' + this.leadId);
    }
    
    /** 取引の開始ボタン **/
    public PageReference start(){
        system.debug('进入start()');
        
        // LHJ 20181012 CHAN-B5G6EZ 购买意向转询价报错 Start
        try {
        // LHJ 20181012 CHAN-B5G6EZ 购买意向转询价报错 End
            // 商談作成権限のチェック
            if(!Schema.Sobjecttype.Opportunity.isCreateable()){
                ApexPages.addMessage(new ApexPages.Message(ApexPages.severity.ERROR, ERROR_MSG_NONE_AUTHORITY));
                return null;
            }
            if(this.lead!=null){
                if(SI_Flg && this.lead.SI_OppoLeadSec__c==null){
                    ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR, '转SI询价需要填写询价副担当'));
                    return null;
                } 
            }
            // 診療科未選択の場合、処理なし
            if (sltDep == NONE) {
                return null;
            }
            
            // 選択した診療科を取得
            Account dept = this.getDepartment();
            
            // 担当者未選択の場合、リード担当者を登録
    //        if (sltCon == NONE) {
    //            this.addContact(dept);
    //        }
            Database.LeadConvertResult result = this.convertLead();
            this.oppID = result.getOpportunityId();
            ID conID = result.getContactId();
            
            this.updateContact(conID, dept);
            this.updateOpportunity(dept);
            
            // 引合の編集画面の初期値設定
            //String uri = this.getUriOpportunity(dept);
            String uri = this.getUri();
            
            // 引合の編集画面表示
            //return new Pagereference(URL.getSalesforceBaseUrl().toExternalForm() + '/006/e?' + uri);
            return new Pagereference(URL.getSalesforceBaseUrl().toExternalForm() + '/' + this.oppID + '/e?' + uri);
        // LHJ 20181012 CHAN-B5G6EZ 购买意向转询价报错 Start
        } catch (Exception ex) {
            ApexPages.addMessages(ex);
            return null;
        } 
        // LHJ 20181012 CHAN-B5G6EZ 购买意向转询价报错 End
    }
    
    /**
     * リードの取引開始
     * 
     */
    public Database.LeadConvertResult convertLead(){
        this.lead.Status = '確認済み';                    // 時間ベースWorkflow解除のため
        EscapeLeadUpdate = true;
        update this.lead;
        
        Database.LeadConvert lc = new database.LeadConvert();
        lc.setLeadId(this.lead.Id);
        lc.setAccountId(this.sltDep);
        if(this.sltCon != NONE){
            lc.setContactId(this.sltCon);
        }
        LeadStatus convertstatus = [select Id, MasterLabel from LeadStatus where IsConverted=true limit 1];
        lc.setConvertedStatus(convertStatus.MasterLabel); 
        Database.LeadConvert[] lcArray = new Database.LeadConvert[] {lc}; 
        Database.LeadConvertResult[] results = Database.convertLead(lcArray);
        
        return results[0];
    }
    
    /** 取引先責任者の更新
     *  @param conID 取引先責任者ID
     *  @param dept  診療科
    */
    public void updateContact(ID conID, Account dept){
        
        Contact cont = [select ID,Strategic_dept_Class__c from Contact where Id=:conID];
        cont.Strategic_dept_Class__c = dept.Department_Class__c;
        update cont;
    }
    
    /** 引合の更新
     *  @param dept 診療科
    */
    public String updateOpportunity(Account dept){
        System.debug('dept'+dept.Id);
        Opportunity opp = [select ID, AccountId, Account.Department_Class_Wd__c, Opportunity_No__c, SAP_Province_CD__c, Opp_Number__c, Opp_Code__c from Opportunity where Id=:this.oppID];
system.debug('cccccccccccccccccccc:'+opp.SAP_Province_CD__c);
system.debug('cccccccccccccccccccc:'+opp.Opp_Number__c);
system.debug('cccccccccccccccccccc:'+opp.Opp_Code__c);
system.debug('cccccccccccccccccccc:'+opp.Opportunity_No__c);
        Opptype = SI_Flg==true?'SI询价':RC_OPP;
        RecordType rect = [select id from RecordType where IsActive = true and SobjectType = 'Opportunity' and Name =: Opptype limit 1];
        opp.RecordTypeId = rect.id;
        opp.Opportunity_Category__c = opp.Account.Department_Class_Wd__c;
        System.debug('this.lead.Hospital_Name__c:'+this.lead.Hospital_Name__c);
        System.debug('this.lead.LeadSource:'+this.lead.LeadSource);
        System.debug('this.lead.Other_Society__c:'+this.lead.Other_Society__c);
        System.debug('this.lead.Purchase_Reason__c:'+this.lead.Purchase_Reason__c);
        System.debug('this.lead.Trade__c:'+this.lead.Trade__c);
        System.debug('this.lead.Sales_Root__c:'+this.lead.Sales_Root__c);
        System.debug('this.lead.Close_Forecasted_Date__c:'+this.lead.Close_Forecasted_Date__c);
        System.debug('this.lead.Competitor__c:'+this.lead.Competitor__c);
        System.debug('this.lead.Hospital_Budget__c:'+this.lead.Hospital_Budget__c);
        System.debug('this.lead.Promise_Class__c:'+this.lead.Promise_Class__c);
        System.debug('this.lead.Dicision_Maker__c:'+this.lead.Dicision_Maker__c);
        System.debug('this.lead.Purchase_Type__c:'+this.lead.Purchase_Type__c);
        System.debug('this.lead.Sales_Method__c:'+this.lead.Sales_Method__c);
        System.debug('this.lead.Fund_Basis__c:'+this.lead.Fund_Basis__c);
        if(this.lead.Opp_Name__c != null && this.lead.Opp_Name__c != ''){
            opp.Name = this.lead.Opp_Name__c;
        }
        else{
            opp.Name = '*';
        }
        //20220412 SWAG-CBUB2W you start
        opp.Inquiry_Num__c = this.lead.Inquiry_Num__c;
        //20220412 SWAG-CBUB2W you end
        opp.From_Lead_TF__c = true;
        opp.Trade__c = (String.isBlank(this.lead.Trade__c)) ? '内貿' : this.lead.Trade__c;
        opp.StageName = '引合';
        opp.owner_not_automatically_update__c = this.lead.owner_not_automatically_update__c;
        opp.Lead_Num__c = this.lead.Lead_No__c;
        opp.Lead_CreateBy__c = this.lead.CreatedById;
        opp.Lead_CreateDate__c = this.lead.CreatedDate;
        opp.CurrencyIsoCode = 'CNY';
        opp.Purchase_Type__c = 'SI（手術室案件）';
system.debug('dddddddddddddddddddddd:'+this.lead.owner_not_automatically_update__c);
        Integer year = date.today().year();
        Integer month = date.today().month();
        Date nextMonthEndDay = date.newInstance(year, month, 1);
        Date thisMonthEndDay = nextMonthEndDay.addMonths(1);
        thisMonthEndDay = thisMonthEndDay.addDays(-1);
        nextMonthEndDay = nextMonthEndDay.addMonths(2);
        nextMonthEndDay = nextMonthEndDay.addDays(-1);
        opp.Close_Forecasted_Date__c = this.lead.Close_Forecasted_Date__c;
        opp.Close_Forecasted_Date__c = opp.Close_Forecasted_Date__c == null ? thisMonthEndDay : opp.Close_Forecasted_Date__c;
        if (nextMonthEndDay > opp.Close_Forecasted_Date__c) {
            opp.CloseDate = nextMonthEndDay;
        } else {
            opp.CloseDate = opp.Close_Forecasted_Date__c.addDays(30);
        }
        // xudan 20140730 販売店から引合をConvertする場合、Hospital__cをAccountIdを同じにする
        if (isAgencyOpp) {
            opp.Hospital__c = opp.AccountId;
        } else {
            opp.Hospital__c = dept.Hospital__c;
            opp.Department_Class__c = dept.Department_Class__c;
        }
        //2021-07-08  mzy  SWAG-C4H99E 询价中的来源更改 start
        if('科室提案'.equals(this.lead.LeadSource) || 'OPD/SIS'.equals(this.lead.LeadSource) 
            || '公共平台'.equals(this.lead.LeadSource)   //测试环境 加的  对应的是 医拓网
            || '电话'.equals(this.lead.LeadSource) || '医拓网'.equals(this.lead.LeadSource) ){            
            opp.LeadSource = '直接拜访';
        }else {
            opp.LeadSource = this.lead.LeadSource;
        }
        //2021-07-08  mzy  SWAG-C4H99E 询价中的来源更改 end
        opp.Other_Society__c = this.lead.Other_Society__c;
        opp.Purchase_Reason__c = this.lead.Purchase_Reason__c;
        opp.Trade__c = (String.isBlank(this.lead.Trade__c)) ? '内貿' : this.lead.Trade__c;
        opp.Sales_Root__c = this.lead.Sales_Root__c;
        if (this.lead.Competitor__c != null && this.lead.Competitor__c != '') {
            opp.Competitor__c = this.lead.Competitor__c;
        }
        if (this.lead.Opportunity_stage__c != null && this.lead.Opportunity_stage__c != '') {
            opp.Opportunity_stage__c = this.lead.Opportunity_stage__c;
        }
        opp.Hospital_Budget__c = this.lead.Hospital_Budget__c;
        opp.Promise_Class__c = this.lead.Promise_Class__c;
        opp.Dicision_Maker__c = this.lead.Dicision_Maker__c;
        //**********************************************************************************
        opp.Purchase_Type__c = SI_Flg==true?'SI（手術室案件）':this.lead.Purchase_Type__c;
        
        opp.Opportunity_sub_owner__c = this.lead.SI_OppoLeadSec__c;
        //**********************************************************************************
        opp.Sales_Method__c = this.lead.Sales_Method__c;
        opp.Fund_Basis__c = this.lead.Fund_Basis__c;
        opp.SAP_Province__c = this.leadOnwer.Province_Text__c;
        opp.Owner_System__c = opp.OwnerId;
        if(this.lead.OwnerId != null ){
            opp.Ownerid = this.lead.OwnerId ;
        }
        opp.Wholesale_Price__c = this.lead.Wholesale_Price__c;
        List<Lead> leadcList = [Select (Select CampaignId From CampaignMembers order by CreatedDate desc) From Lead l where l.id =: this.leadId];
        for(Lead leadc : leadcList){
            List<CampaignMember> cmList = leadc.CampaignMembers;
            for (CampaignMember cm : cmList) {
                opp.CampaignId = cm.CampaignId;
                break;
            }
        }
        System.debug('opp.Hospital_Name__c:'+opp.Hospital__c);
        System.debug('opp.LeadSource:'+opp.LeadSource);
        System.debug('opp.Other_Society__c:'+opp.Other_Society__c);
        System.debug('opp.Purchase_Reason__c:'+opp.Purchase_Reason__c);
        System.debug('opp.Trade__c:'+opp.Trade__c);
        System.debug('opp.Sales_Root__c:'+opp.Sales_Root__c);
        System.debug('opp.Close_Forecasted_Date__c:'+opp.Close_Forecasted_Date__c);
        System.debug('opp.Competitor__c:'+opp.Competitor__c);
        System.debug('opp.Hospital_Budget__c:'+opp.Hospital_Budget__c);
        System.debug('opp.Promise_Class__c:'+opp.Promise_Class__c);
        System.debug('opp.Dicision_Maker__c:'+opp.Dicision_Maker__c);
        System.debug('opp.Purchase_Type__c:'+opp.Purchase_Type__c);
        System.debug('opp.Sales_Method__c:'+opp.Sales_Method__c);
        System.debug('opp.Fund_Basis__c:'+opp.Fund_Basis__c);
        System.debug('opp.SAP_Province__c:'+opp.SAP_Province__c);
        update opp;
        return null;
    }
    
    /** 引合の編集画面のURI取得
     *  @return 引合編集画面初期値用URI
    */
    public String getUri(){
        // キャンセル時戻り画面
        String uri = 'retURL=%2F' + this.oppID;
        
        // エントリ商談（引合）
        uri += '&ent=Opportunity';
        
        return uri;
    }
    
    /** 
     *  選択した診療科を取得
     */
    public Account getDepartment(){
        List<Account> deptList = [select Id, Hospital__c, Department_Class__c from Account where id =: this.sltDep];
        Account dept = deptList[0];
        return dept;
    }
}