<?php

namespace app\service;

use app\model\Ad;
use app\model\DayData;
use app\model\Campaign;
use app\model\AdGroup;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use think\db\exception\DbException;
use think\facade\Db;
use think\model\Collection;

class GoogleAdsReportService
{
    /**
     * 获取广告列表
     */
    public static function getAdList($page, $pageSize, $keyword, $dateRange)
    {
        // 基础查询:广告表和日数据表联接
        $query = Ad::alias('a')
            ->leftJoin('bps_google_ad_day_data d', 'a.ad_id = d.ad_id')
            ->field('a.ad_id, a.ad_name, a.status as ad_status, a.customer_id,
                    SUM(d.clicks) as clicks, SUM(d.cost_micros) as cost_micros, 
                    SUM(d.conversions) as conversions, SUM(d.conversions_value) as conversions_value, 
                    SUM(d.impressions) as impressions')
            ->group('a.ad_id')
            ->where(function ($query) use ($keyword) {
                if ($keyword) {
                    $query->where('a.ad_name', 'like', '%' . $keyword . '%');
                }
            });

        // 根据日期维度添加聚合条件
        switch ($dateRange) {
            case 'Today':
                $query->where('d.date', '=', date('Y-m-d'));
                break;
            case 'Yesterday':
                $query->where('d.date', '=', date('Y-m-d', strtotime('-1 day')));
                break;
            case 'Last Week':
                $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 week')));
                break;
            case 'Last Month':
                $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 month')));
                break;
            case 'Last Year':
                $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 year')));
                break;
            default:
                break;
        }

        // 获取分页数据
        $ads = $query->paginate($pageSize, false, ['page' => $page]);

        // 返回分页和总数信息
        return [
            'data' => $ads->items(),
            'total' => $ads->total(),
            'current_page' => $ads->currentPage(),
            'last_page' => $ads->lastPage(),
        ];
    }

    /**
     * 导出广告列表到 Excel
     *
     * @param string $keyword
     * @param string $dateRange
     * @return void
     */
    public static function exportAdListToExcel($keyword, $dateRange)
    {
        // 获取所有的广告数据
        $query = Ad::alias('a')
            ->leftJoin('bps_google_ad_day_data d', 'a.ad_id = d.ad_id')
            ->field('a.ad_id, a.ad_name, a.status as ad_status, a.customer_id,
                    SUM(d.clicks) as clicks, SUM(d.cost_micros) as cost_micros, 
                    SUM(d.conversions) as conversions, SUM(d.conversions_value) as conversions_value, 
                    SUM(d.impressions) as impressions')
            ->group('a.ad_id')
            ->where(function ($query) use ($keyword) {
                if ($keyword) {
                    $query->where('a.ad_name', 'like', '%' . $keyword . '%');
                }
            });

        // 根据日期维度添加聚合条件
        switch ($dateRange) {
            case 'Today':
                $query->where('d.date', '=', date('Y-m-d'));
                break;
            case 'Yesterday':
                $query->where('d.date', '=', date('Y-m-d', strtotime('-1 day')));
                break;
            case 'Last Week':
                $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 week')));
                break;
            case 'Last Month':
                $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 month')));
                break;
            case 'Last Year':
                $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 year')));
                break;
            default:
                break;
        }

        // 获取所有广告数据
        $ads = $query->select();

        // 创建一个新的 Spreadsheet 对象
        $spreadsheet = new Spreadsheet();
        $sheet       = $spreadsheet->getActiveSheet();

        // 设置表头
        $sheet->setCellValue('A1', 'Ad ID');
        $sheet->setCellValue('B1', 'Ad Name');
        $sheet->setCellValue('C1', 'Customer ID');
        $sheet->setCellValue('D1', 'Ad Status');
        $sheet->setCellValue('E1', 'Clicks');
        $sheet->setCellValue('F1', 'Cost Micros');
        $sheet->setCellValue('G1', 'Conversions');
        $sheet->setCellValue('H1', 'Conversions Value');
        $sheet->setCellValue('I1', 'Impressions');

        // 填充数据
        $row = 2; // 从第二行开始
        foreach ($ads as $ad) {
            $sheet->setCellValueExplicit('A' . $row, (string)$ad->ad_id, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);  // 设置 ad_id 为文本
            $sheet->setCellValueExplicit('B' . $row, $ad->ad_name);  // 直接设置 ad_name
            $sheet->setCellValueExplicit('C' . $row, (string)$ad->customer_id, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);  // 设置 customer_id 为文本
            $sheet->setCellValue('D' . $row, $ad->ad_status);
            $sheet->setCellValue('E' . $row, $ad->clicks);
            $sheet->setCellValue('F' . $row, $ad->cost_micros);
            $sheet->setCellValue('G' . $row, $ad->conversions);
            $sheet->setCellValue('H' . $row, $ad->conversions_value);
            $sheet->setCellValue('I' . $row, $ad->impressions);
            $row++;
        }

        // 设置 Excel 文件名
        $fileName = 'Ad_Report_' . $dateRange . '_' . date('Y-m-d_H-i-s') . '.xlsx';

        // 创建 Excel 文件并保存
        $writer   = new Xlsx($spreadsheet);
        $filePath = public_path() . '/' . $fileName;

        try {
            $writer->save($filePath);
            return response()->download($filePath, $fileName);
//            return ['success' => true, 'file_path' => $filePath];
        } catch (\Exception $e) {
            return ['' => false, 'message' => $e->getMessage()];
        }
    }


    /**
     * 获取广告系列列表
     */
    public static function getCampaignList($page, $pageSize, $keyword, $dateRange)
    {
        // 基础查询:广告活动和日数据表联接
        $query = Campaign::alias('c')
            ->leftJoin('bps_google_ad_day_data d', 'c.campaign_id = d.campaign_id')
            ->field('c.campaign_id, c.status as campaign_status, c.customer_id, 
                    SUM(d.clicks) as clicks, SUM(d.cost_micros) as cost_micros, 
                    SUM(d.conversions) as conversions, SUM(d.conversions_value) as conversions_value, 
                    SUM(d.impressions) as impressions')
            ->group('c.campaign_id')
            ->where(function ($query) use ($keyword) {
                if ($keyword) {
                    $query->where('c.campaign_name', 'like', '%' . $keyword . '%');
                }
            });

        // 根据日期维度添加聚合条件
        switch ($dateRange) {
            case 'Today':
                $query->where('d.date', '=', date('Y-m-d'));
                break;
            case 'Yesterday':
                $query->where('d.date', '=', date('Y-m-d', strtotime('-1 day')));
                break;
            case 'Last Week':
                $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 week')));
                break;
            case 'Last Month':
                $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 month')));
                break;
            case 'Last Year':
                $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 year')));
                break;
            default:
                break;
        }

        // 获取分页数据
        $campaigns = $query->paginate($pageSize, false, ['page' => $page]);

        // 返回分页和总数信息
        return [
            'data' => $campaigns->items(),
            'total' => $campaigns->total(),
            'current_page' => $campaigns->currentPage(),
            'last_page' => $campaigns->lastPage(),
        ];
    }


    /**
     * 导出广告系列数据到 Excel
     *
     * @param string $keyword
     * @param string $dateRange
     * @return void
     */
    public static function exportCampaignsToExcel($keyword, $dateRange)
    {
        // 获取所有的广告系列数据
        $query = Campaign::alias('c')
            ->leftJoin('bps_google_ad_day_data d', 'c.campaign_id = d.campaign_id')
            ->field('c.campaign_id, c.status as campaign_status, c.customer_id, 
                    SUM(d.clicks) as clicks, SUM(d.cost_micros) as cost_micros, 
                    SUM(d.conversions) as conversions, SUM(d.conversions_value) as conversions_value, 
                    SUM(d.impressions) as impressions')
            ->group('c.campaign_id')
            ->where(function ($query) use ($keyword) {
                if ($keyword) {
                    $query->where('c.campaign_name', 'like', '%' . $keyword . '%');
                }
            });

        // 根据日期维度添加聚合条件
        switch ($dateRange) {
            case 'Today':
                $query->where('d.date', '=', date('Y-m-d'));
                break;
            case 'Yesterday':
                $query->where('d.date', '=', date('Y-m-d', strtotime('-1 day')));
                break;
            case 'Last Week':
                $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 week')));
                break;
            case 'Last Month':
                $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 month')));
                break;
            case 'Last Year':
                $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 year')));
                break;
            default:
                break;
        }

        // 获取所有广告系列数据
        $campaigns = $query->select();

        // 创建一个新的 Spreadsheet 对象
        $spreadsheet = new Spreadsheet();
        $sheet       = $spreadsheet->getActiveSheet();

        // 设置表头
        $sheet->setCellValue('A1', 'Campaign ID');
        $sheet->setCellValue('B1', 'Customer ID');
        $sheet->setCellValue('C1', 'Status');
        $sheet->setCellValue('D1', 'Clicks');
        $sheet->setCellValue('E1', 'Cost Micros');
        $sheet->setCellValue('F1', 'Conversions');
        $sheet->setCellValue('G1', 'Conversions Value');
        $sheet->setCellValue('H1', 'Impressions');

        // 填充数据
        $row = 2; // 从第二行开始
        foreach ($campaigns as $campaign) {
//使用 setCellValueExplicit 显式设置为文本格式
            $sheet->setCellValueExplicit('A' . $row, (string)$campaign->campaign_id, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);  // 设置为文本格式
            $sheet->setCellValueExplicit('B' . $row, (string)$campaign->customer_id, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);  // 设置为文本格式
            $sheet->setCellValue('C' . $row, $campaign->campaign_status);
            $sheet->setCellValue('D' . $row, $campaign->clicks);
            $sheet->setCellValue('E' . $row, $campaign->cost_micros);
            $sheet->setCellValue('F' . $row, $campaign->conversions);
            $sheet->setCellValue('G' . $row, $campaign->conversions_value);
            $sheet->setCellValue('H' . $row, $campaign->impressions);
            $row++;
        }

        // 设置 Excel 文件名
        $fileName = 'Campaign_Report_' . $dateRange . '_' . date('Y-m-d_H-i-s') . '.xlsx';

        // 创建 Excel 文件并保存
        $writer   = new Xlsx($spreadsheet);
        $filePath = public_path() . '/' . $fileName;

        try {
            $writer->save($filePath);
            return response()->download($filePath, $fileName);
//            return ['success' => true, 'file_path' => $filePath];
        } catch (\Exception $e) {
            return ['' => false, 'message' => $e->getMessage()];
        }

    }


    /**
     * 获取广告系列列表
     */
    public static function getAdGroupList($page, $pageSize, $keyword, $dateRange)
    {
        // 初始化查询
        $query = AdGroup::alias('ag')
            ->leftJoin('bps_google_ad_day_data d', 'ag.ad_group_id = d.ad_group_id')
            ->field('ag.ad_group_id, ag.campaign_id, ag.customer_id, 
                    SUM(d.clicks) as clicks, SUM(d.cost_micros) as cost_micros, 
                    SUM(d.conversions) as conversions, SUM(d.conversions_value) as conversions_value, 
                    SUM(d.impressions) as impressions')
            ->group('ag.ad_group_id')
            ->where(function ($query) use ($keyword) {
                if ($keyword) {
                    $query->where('ag.ad_group_name', 'like', '%' . $keyword . '%');
                }
            });

        // 根据日期范围添加聚合条件
        switch ($dateRange) {
            case 'Today':
                $query->where('d.date', '=', date('Y-m-d'));
                break;
            case 'Yesterday':
                $query->where('d.date', '=', date('Y-m-d', strtotime('-1 day')));
                break;
            case 'Last Week':
                $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 week')));
                break;
            case 'Last Month':
                $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 month')));
                break;
            case 'Last Year':
                $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 year')));
                break;
            default:
                break;
        }

        // 分页查询
        try {

//            $sql = $query->fetchSql()->select();  // fetchSql() 会返回 SQL 查询语句
//            echo "Executed SQL: " . $sql;  // 输出执行的 SQL

            $result = $query->paginate([
                'list_rows' => $pageSize,  // 每页数量
                'page' => $page,  // 当前页码
            ]);

            // 返回分页数据
            return [
                'data' => $result->items(),
                'total' => $result->total(),
                'current_page' => $result->currentPage(),
                'last_page' => $result->lastPage(),
            ];
        } catch (DbException $e) {
            // 处理数据库查询错误
            return [
                'error' => 'Database query failed: ' . $e->getMessage(),
            ];
        }
    }


    /**
     * 将广告组数据导出到 Excel 文件
     */
    public static function exportAdGroupsToExcel($keyword = '', $dateRange = 'Today')
    {
        // 初始化查询
        $query = AdGroup::alias('ag')
            ->leftJoin('bps_google_ad_day_data d', 'ag.ad_group_id = d.ad_group_id')
            ->field('ag.ad_group_id, ag.campaign_id, ag.customer_id, 
                SUM(d.clicks) as clicks, SUM(d.cost_micros) as cost_micros, 
                SUM(d.conversions) as conversions, SUM(d.conversions_value) as conversions_value, 
                SUM(d.impressions) as impressions')
            ->group('ag.ad_group_id')
            ->where(function ($query) use ($keyword) {
                if ($keyword) {
                    $query->where('ag.ad_group_name', 'like', '%' . $keyword . '%');
                }
            });

        // 根据日期范围添加聚合条件
        switch ($dateRange) {
            case 'Today':
                $query->where('d.date', '=', date('Y-m-d'));
                break;
            case 'Yesterday':
                $query->where('d.date', '=', date('Y-m-d', strtotime('-1 day')));
                break;
            case 'Last Week':
                $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 week')));
                break;
            case 'Last Month':
                $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 month')));
                break;
            case 'Last Year':
                $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 year')));
                break;
            default:
                break;
        }
        // 获取所有广告组数据
        $ad_groups = $query->select();


        // 创建一个新的 Spreadsheet 对象
        $spreadsheet = new Spreadsheet();
        $sheet       = $spreadsheet->getActiveSheet();

        // 设置表头
        $sheet->setCellValue('A1', 'Ad Group ID')
            ->setCellValue('B1', 'Campaign ID')
            ->setCellValue('C1', 'Customer ID')
            ->setCellValue('D1', 'Clicks')
            ->setCellValue('E1', 'Cost Micros')
            ->setCellValue('F1', 'Conversions')
            ->setCellValue('G1', 'Conversions Value')
            ->setCellValue('H1', 'Impressions');

        // 填充数据
        $row = 2;
        foreach ($ad_groups as $adGroup) {
            // 使用 setCellValueExplicit 显式设置为文本格式
            $sheet->setCellValueExplicit('A' . $row, (string)$adGroup->ad_group_id, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);  // 设置为文本格式
            $sheet->setCellValueExplicit('B' . $row, (string)$adGroup->campaign_id, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
            $sheet->setCellValueExplicit('C' . $row, (string)$adGroup->customer_id, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
            $sheet->setCellValue('D' . $row, $adGroup->clicks);
            $sheet->setCellValue('E' . $row, $adGroup->cost_micros);
            $sheet->setCellValue('F' . $row, $adGroup->conversions);
            $sheet->setCellValue('G' . $row, $adGroup->conversions_value);
            $sheet->setCellValue('H' . $row, $adGroup->impressions);
            $row++;
        }


        // 自动调整所有列宽
        foreach (range('A', 'H') as $column) {
            $spreadsheet->getActiveSheet()->getColumnDimension($column)->setAutoSize(true);
        }


        // 设置 Excel 文件名
        $fileName = 'AdGroup_Report_' . $dateRange . '_' . date('Y-m-d_H-i-s') . '.xlsx';

        // 创建 Excel 文件并保存
        $writer   = new Xlsx($spreadsheet);
        $filePath = public_path() . '/' . $fileName;

        try {
            $writer->save($filePath);
            return response()->download($filePath, $fileName);
//            return ['success' => true, 'file_path' => $filePath];
        } catch (\Exception $e) {
            return ['' => false, 'message' => $e->getMessage()];
        }
    }

}